1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/*
2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Copyright 2011 The WebRTC Project Authors. All rights reserved.
3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *
4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */
10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/common.h"
12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/gunit.h"
13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/messagehandler.h"
14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/messagequeue.h"
15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/scoped_ptr.h"
16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/sharedexclusivelock.h"
17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/thread.h"
18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/timeutils.h"
19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace rtc {
21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
220c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmstatic const uint32_t kMsgRead = 0;
230c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmstatic const uint32_t kMsgWrite = 0;
24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstatic const int kNoWaitThresholdInMs = 10;
25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstatic const int kWaitThresholdInMs = 80;
26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstatic const int kProcessTimeInMs = 100;
27f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstatic const int kProcessTimeoutInMs = 5000;
28f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
29f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass SharedExclusiveTask : public MessageHandler {
30f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
31f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SharedExclusiveTask(SharedExclusiveLock* shared_exclusive_lock,
32f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                      int* value,
33f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                      bool* done)
34f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      : shared_exclusive_lock_(shared_exclusive_lock),
35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        waiting_time_in_ms_(0),
36f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        value_(value),
37f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        done_(done) {
38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    worker_thread_.reset(new Thread());
39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    worker_thread_->Start();
40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
42f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  int waiting_time_in_ms() const { return waiting_time_in_ms_; }
43f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org protected:
45f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  scoped_ptr<Thread> worker_thread_;
46f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SharedExclusiveLock* shared_exclusive_lock_;
47f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  int waiting_time_in_ms_;
48f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  int* value_;
49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool* done_;
50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
51f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
52f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass ReadTask : public SharedExclusiveTask {
53f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
54f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  ReadTask(SharedExclusiveLock* shared_exclusive_lock, int* value, bool* done)
55f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      : SharedExclusiveTask(shared_exclusive_lock, value, done) {
56f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
57f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
58f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void PostRead(int* value) {
59f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    worker_thread_->Post(this, kMsgRead, new TypedMessageData<int*>(value));
60f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
61f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
62f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private:
63f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual void OnMessage(Message* message) {
64f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ASSERT(rtc::Thread::Current() == worker_thread_.get());
65f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ASSERT(message != NULL);
66f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ASSERT(message->message_id == kMsgRead);
67f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
68f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    TypedMessageData<int*>* message_data =
69f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        static_cast<TypedMessageData<int*>*>(message->pdata);
70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
710c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström    uint32_t start_time = Time();
72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    {
73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      SharedScope ss(shared_exclusive_lock_);
74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      waiting_time_in_ms_ = TimeDiff(Time(), start_time);
75f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
76f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      Thread::SleepMs(kProcessTimeInMs);
77f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      *message_data->data() = *value_;
78f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      *done_ = true;
79f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    }
80f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    delete message->pdata;
81f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    message->pdata = NULL;
82f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
83f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
84f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
85f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass WriteTask : public SharedExclusiveTask {
86f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
87f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  WriteTask(SharedExclusiveLock* shared_exclusive_lock, int* value, bool* done)
88f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      : SharedExclusiveTask(shared_exclusive_lock, value, done) {
89f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
90f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
91f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void PostWrite(int value) {
92f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    worker_thread_->Post(this, kMsgWrite, new TypedMessageData<int>(value));
93f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
94f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
95f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private:
96f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual void OnMessage(Message* message) {
97f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ASSERT(rtc::Thread::Current() == worker_thread_.get());
98f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ASSERT(message != NULL);
99f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ASSERT(message->message_id == kMsgWrite);
100f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
101f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    TypedMessageData<int>* message_data =
102f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        static_cast<TypedMessageData<int>*>(message->pdata);
103f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
1040c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström    uint32_t start_time = Time();
105f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    {
106f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      ExclusiveScope es(shared_exclusive_lock_);
107f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      waiting_time_in_ms_ = TimeDiff(Time(), start_time);
108f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
109f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      Thread::SleepMs(kProcessTimeInMs);
110f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      *value_ = message_data->data();
111f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      *done_ = true;
112f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    }
113f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    delete message->pdata;
114f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    message->pdata = NULL;
115f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
116f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
117f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
118f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Unit test for SharedExclusiveLock.
119f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass SharedExclusiveLockTest
120f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    : public testing::Test {
121f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
122f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SharedExclusiveLockTest() : value_(0) {
123f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
124f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
125f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual void SetUp() {
126f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    shared_exclusive_lock_.reset(new SharedExclusiveLock());
127f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
128f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
129f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org protected:
130f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  scoped_ptr<SharedExclusiveLock> shared_exclusive_lock_;
131f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  int value_;
132f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
133f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
134caa01b172e94746d1ab27070ce0b2edb2bc1ad53henrike@webrtc.org// Flaky: https://code.google.com/p/webrtc/issues/detail?id=3318
135c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(SharedExclusiveLockTest, TestSharedShared) {
136f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  int value0, value1;
137f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool done0, done1;
138f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  ReadTask reader0(shared_exclusive_lock_.get(), &value_, &done0);
139f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  ReadTask reader1(shared_exclusive_lock_.get(), &value_, &done1);
140f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
141f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Test shared locks can be shared without waiting.
142f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  {
143f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    SharedScope ss(shared_exclusive_lock_.get());
144f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    value_ = 1;
145f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    done0 = false;
146f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    done1 = false;
147f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    reader0.PostRead(&value0);
148f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    reader1.PostRead(&value1);
149f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    Thread::SleepMs(kProcessTimeInMs);
150f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
151f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
152f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE_WAIT(done0, kProcessTimeoutInMs);
153f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(1, value0);
154f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_LE(reader0.waiting_time_in_ms(), kNoWaitThresholdInMs);
155f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE_WAIT(done1, kProcessTimeoutInMs);
156f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(1, value1);
157f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_LE(reader1.waiting_time_in_ms(), kNoWaitThresholdInMs);
158f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
159f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
160c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(SharedExclusiveLockTest, TestSharedExclusive) {
161f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool done;
162f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  WriteTask writer(shared_exclusive_lock_.get(), &value_, &done);
163f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
164f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Test exclusive lock needs to wait for shared lock.
165f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  {
166f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    SharedScope ss(shared_exclusive_lock_.get());
167f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    value_ = 1;
168f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    done = false;
169f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    writer.PostWrite(2);
170f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    Thread::SleepMs(kProcessTimeInMs);
171f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    EXPECT_EQ(1, value_);
172f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
173f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
174f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE_WAIT(done, kProcessTimeoutInMs);
175f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(2, value_);
176f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_GE(writer.waiting_time_in_ms(), kWaitThresholdInMs);
177f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
178f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
179c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(SharedExclusiveLockTest, TestExclusiveShared) {
180f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  int value;
181f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool done;
182f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  ReadTask reader(shared_exclusive_lock_.get(), &value_, &done);
183f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
184f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Test shared lock needs to wait for exclusive lock.
185f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  {
186f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ExclusiveScope es(shared_exclusive_lock_.get());
187f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    value_ = 1;
188f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    done = false;
189f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    reader.PostRead(&value);
190f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    Thread::SleepMs(kProcessTimeInMs);
191f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    value_ = 2;
192f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
193f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
194f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE_WAIT(done, kProcessTimeoutInMs);
195f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(2, value);
196f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_GE(reader.waiting_time_in_ms(), kWaitThresholdInMs);
197f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
198f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
199c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(SharedExclusiveLockTest, TestExclusiveExclusive) {
200f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool done;
201f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  WriteTask writer(shared_exclusive_lock_.get(), &value_, &done);
202f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
203f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Test exclusive lock needs to wait for exclusive lock.
204f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  {
205f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ExclusiveScope es(shared_exclusive_lock_.get());
206f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    value_ = 1;
207f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    done = false;
208f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    writer.PostWrite(2);
209f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    Thread::SleepMs(kProcessTimeInMs);
210f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    EXPECT_EQ(1, value_);
211f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
212f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
213f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE_WAIT(done, kProcessTimeoutInMs);
214f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(2, value_);
215f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_GE(writer.waiting_time_in_ms(), kWaitThresholdInMs);
216f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
217f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
218f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}  // namespace rtc
219