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/sharedexclusivelock.h" 12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace rtc { 14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgSharedExclusiveLock::SharedExclusiveLock() 16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org : shared_count_is_zero_(true, true), 17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org shared_count_(0) { 18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid SharedExclusiveLock::LockExclusive() { 21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org cs_exclusive_.Enter(); 2253d9012faf32eb711681fdeb31b9d0d2f9e9481bandresp@webrtc.org shared_count_is_zero_.Wait(Event::kForever); 23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid SharedExclusiveLock::UnlockExclusive() { 26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org cs_exclusive_.Leave(); 27f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 28f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 29f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid SharedExclusiveLock::LockShared() { 30f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CritScope exclusive_scope(&cs_exclusive_); 31f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CritScope shared_scope(&cs_shared_); 32f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (++shared_count_ == 1) { 33f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org shared_count_is_zero_.Reset(); 34f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 36f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 37f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid SharedExclusiveLock::UnlockShared() { 38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CritScope shared_scope(&cs_shared_); 39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (--shared_count_ == 0) { 40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org shared_count_is_zero_.Set(); 41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 42f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 43f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} // namespace rtc 45