diff options
author | andrew@webrtc.org <andrew@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2012-10-22 18:19:23 +0000 |
---|---|---|
committer | andrew@webrtc.org <andrew@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2012-10-22 18:19:23 +0000 |
commit | b015cbede88899f67a53fbbe581b02ce8e327949 (patch) | |
tree | 530a64a3cfdbbabacab974c183326517d49e761e /system_wrappers/source/rw_lock_win.cc | |
download | webrtc-b015cbede88899f67a53fbbe581b02ce8e327949.tar.gz |
Move src/ -> webrtc/
TBR=niklas.enbom@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/915006
git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@2963 4adac7df-926f-26a2-2b94-8c16560cd09d
Diffstat (limited to 'system_wrappers/source/rw_lock_win.cc')
-rw-r--r-- | system_wrappers/source/rw_lock_win.cc | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/system_wrappers/source/rw_lock_win.cc b/system_wrappers/source/rw_lock_win.cc new file mode 100644 index 00000000..f0333b82 --- /dev/null +++ b/system_wrappers/source/rw_lock_win.cc @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "system_wrappers/source/rw_lock_win.h" + +#include "trace.h" + +namespace webrtc { + +static bool native_rw_locks_supported = false; +static bool module_load_attempted = false; +static HMODULE library = NULL; + +typedef void (WINAPI *InitializeSRWLock)(PSRWLOCK); + +typedef void (WINAPI *AcquireSRWLockExclusive)(PSRWLOCK); +typedef void (WINAPI *ReleaseSRWLockExclusive)(PSRWLOCK); + +typedef void (WINAPI *AcquireSRWLockShared)(PSRWLOCK); +typedef void (WINAPI *ReleaseSRWLockShared)(PSRWLOCK); + +InitializeSRWLock initialize_srw_lock; +AcquireSRWLockExclusive acquire_srw_lock_exclusive; +AcquireSRWLockShared acquire_srw_lock_shared; +ReleaseSRWLockShared release_srw_lock_shared; +ReleaseSRWLockExclusive release_srw_lock_exclusive; + +RWLockWin::RWLockWin() { + initialize_srw_lock(&lock_); +} + +RWLockWin* RWLockWin::Create() { + if (!LoadModule()) { + return NULL; + } + return new RWLockWin(); +} + +void RWLockWin::AcquireLockExclusive() { + acquire_srw_lock_exclusive(&lock_); +} + +void RWLockWin::ReleaseLockExclusive() { + release_srw_lock_exclusive(&lock_); +} + +void RWLockWin::AcquireLockShared() { + acquire_srw_lock_shared(&lock_); +} + +void RWLockWin::ReleaseLockShared() { + release_srw_lock_shared(&lock_); +} + +bool RWLockWin::LoadModule() { + if (module_load_attempted) { + return native_rw_locks_supported; + } + module_load_attempted = true; + // Use native implementation if supported (i.e Vista+) + library = LoadLibrary(TEXT("Kernel32.dll")); + if (!library) { + return false; + } + WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1, "Loaded Kernel.dll"); + + initialize_srw_lock = + (InitializeSRWLock)GetProcAddress(library, "InitializeSRWLock"); + + acquire_srw_lock_exclusive = + (AcquireSRWLockExclusive)GetProcAddress(library, + "AcquireSRWLockExclusive"); + release_srw_lock_exclusive = + (ReleaseSRWLockExclusive)GetProcAddress(library, + "ReleaseSRWLockExclusive"); + acquire_srw_lock_shared = + (AcquireSRWLockShared)GetProcAddress(library, "AcquireSRWLockShared"); + release_srw_lock_shared = + (ReleaseSRWLockShared)GetProcAddress(library, "ReleaseSRWLockShared"); + + if (initialize_srw_lock && acquire_srw_lock_exclusive && + release_srw_lock_exclusive && acquire_srw_lock_shared && + release_srw_lock_shared) { + WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1, "Loaded Native RW Lock"); + native_rw_locks_supported = true; + } + return native_rw_locks_supported; +} + +} // namespace webrtc |