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