rw_lock_generic.cc revision 4e51691e58d8d32590b03c1951cb13de4d1c4758
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Use of this source code is governed by a BSD-style license 58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * that can be found in the LICENSE file in the root of the source 68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * tree. An additional intellectual property rights grant can be found 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * in the file PATENTS. All contributing project authors may 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * be found in the AUTHORS file in the root of the source tree. 9c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */ 10c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "rw_lock_generic.h" 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "condition_variable_wrapper.h" 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "critical_section_wrapper.h" 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnamespace webrtc { 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtRWLockWrapperGeneric::RWLockWrapperGeneric() 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : _readersActive(0), 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _writerActive(false), 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _readersWaiting(0), 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _writersWaiting(0) 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _critSectPtr = CriticalSectionWrapper::CreateCriticalSection(); 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _readCondPtr = ConditionVariableWrapper::CreateConditionVariable(); 251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt _writeCondPtr = ConditionVariableWrapper::CreateConditionVariable(); 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtRWLockWrapperGeneric::~RWLockWrapperGeneric() 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete _writeCondPtr; 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete _readCondPtr; 321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt delete _critSectPtr; 331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint RWLockWrapperGeneric::Init() 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtvoid RWLockWrapperGeneric::AcquireLockExclusive() 411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt _critSectPtr->Enter(); 431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (_writerActive || _readersActive > 0) 451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt { 461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ++_writersWaiting; 471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt while (_writerActive || _readersActive > 0) 491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt { 501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt _writeCondPtr->SleepCS(*_critSectPtr); 511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt --_writersWaiting; 541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt _writerActive = true; 561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt _critSectPtr->Leave(); 571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtvoid RWLockWrapperGeneric::ReleaseLockExclusive() 601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt _critSectPtr->Enter(); 621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt _writerActive = false; 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (_writersWaiting > 0) 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _writeCondPtr->Wake(); 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }else if (_readersWaiting > 0) 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _readCondPtr->WakeAll(); 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _critSectPtr->Leave(); 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid RWLockWrapperGeneric::AcquireLockShared() 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _critSectPtr->Enter(); 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (_writerActive || _writersWaiting > 0) 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ++_readersWaiting; 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (_writerActive || _writersWaiting > 0) 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _readCondPtr->SleepCS(*_critSectPtr); 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt --_readersWaiting; 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ++_readersActive; 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _critSectPtr->Leave(); 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid RWLockWrapperGeneric::ReleaseLockShared() 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _critSectPtr->Enter(); 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt --_readersActive; 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (_readersActive == 0 && _writersWaiting > 0) 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _writeCondPtr->Wake(); 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _critSectPtr->Leave(); 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} // namespace webrtc 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt