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