blob: aea74fa4a37caabd052384d2dac268801333ad3a [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
henrike@webrtc.org9f847232012-09-25 20:27:51 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
phoglund@webrtc.org59ad5412012-12-18 15:20:35 +000011#include "webrtc/system_wrappers/source/rw_lock_win.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000012
phoglund@webrtc.org59ad5412012-12-18 15:20:35 +000013#include "webrtc/system_wrappers/interface/trace.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000014
niklase@google.com470e71d2011-07-07 08:21:25 +000015namespace webrtc {
henrike@webrtc.org9f847232012-09-25 20:27:51 +000016
17static bool native_rw_locks_supported = false;
18static bool module_load_attempted = false;
niklase@google.com470e71d2011-07-07 08:21:25 +000019static HMODULE library = NULL;
20
phoglund@webrtc.org59ad5412012-12-18 15:20:35 +000021typedef void (WINAPI* InitializeSRWLock)(PSRWLOCK);
niklase@google.com470e71d2011-07-07 08:21:25 +000022
phoglund@webrtc.org59ad5412012-12-18 15:20:35 +000023typedef void (WINAPI* AcquireSRWLockExclusive)(PSRWLOCK);
24typedef void (WINAPI* ReleaseSRWLockExclusive)(PSRWLOCK);
henrike@webrtc.org9f847232012-09-25 20:27:51 +000025
phoglund@webrtc.org59ad5412012-12-18 15:20:35 +000026typedef void (WINAPI* AcquireSRWLockShared)(PSRWLOCK);
27typedef void (WINAPI* ReleaseSRWLockShared)(PSRWLOCK);
henrike@webrtc.org9f847232012-09-25 20:27:51 +000028
29InitializeSRWLock initialize_srw_lock;
30AcquireSRWLockExclusive acquire_srw_lock_exclusive;
31AcquireSRWLockShared acquire_srw_lock_shared;
32ReleaseSRWLockShared release_srw_lock_shared;
33ReleaseSRWLockExclusive release_srw_lock_exclusive;
34
35RWLockWin::RWLockWin() {
36 initialize_srw_lock(&lock_);
niklase@google.com470e71d2011-07-07 08:21:25 +000037}
38
henrike@webrtc.org9f847232012-09-25 20:27:51 +000039RWLockWin* RWLockWin::Create() {
40 if (!LoadModule()) {
41 return NULL;
42 }
43 return new RWLockWin();
niklase@google.com470e71d2011-07-07 08:21:25 +000044}
45
henrike@webrtc.org9f847232012-09-25 20:27:51 +000046void RWLockWin::AcquireLockExclusive() {
47 acquire_srw_lock_exclusive(&lock_);
niklase@google.com470e71d2011-07-07 08:21:25 +000048}
49
henrike@webrtc.org9f847232012-09-25 20:27:51 +000050void RWLockWin::ReleaseLockExclusive() {
51 release_srw_lock_exclusive(&lock_);
niklase@google.com470e71d2011-07-07 08:21:25 +000052}
53
henrike@webrtc.org9f847232012-09-25 20:27:51 +000054void RWLockWin::AcquireLockShared() {
55 acquire_srw_lock_shared(&lock_);
niklase@google.com470e71d2011-07-07 08:21:25 +000056}
57
henrike@webrtc.org9f847232012-09-25 20:27:51 +000058void RWLockWin::ReleaseLockShared() {
59 release_srw_lock_shared(&lock_);
niklase@google.com470e71d2011-07-07 08:21:25 +000060}
61
henrike@webrtc.org9f847232012-09-25 20:27:51 +000062bool RWLockWin::LoadModule() {
63 if (module_load_attempted) {
64 return native_rw_locks_supported;
65 }
66 module_load_attempted = true;
67 // Use native implementation if supported (i.e Vista+)
68 library = LoadLibrary(TEXT("Kernel32.dll"));
69 if (!library) {
70 return false;
71 }
72 WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1, "Loaded Kernel.dll");
niklase@google.com470e71d2011-07-07 08:21:25 +000073
henrike@webrtc.org9f847232012-09-25 20:27:51 +000074 initialize_srw_lock =
phoglund@webrtc.org59ad5412012-12-18 15:20:35 +000075 (InitializeSRWLock)GetProcAddress(library, "InitializeSRWLock");
niklase@google.com470e71d2011-07-07 08:21:25 +000076
henrike@webrtc.org9f847232012-09-25 20:27:51 +000077 acquire_srw_lock_exclusive =
phoglund@webrtc.org59ad5412012-12-18 15:20:35 +000078 (AcquireSRWLockExclusive)GetProcAddress(library,
79 "AcquireSRWLockExclusive");
henrike@webrtc.org9f847232012-09-25 20:27:51 +000080 release_srw_lock_exclusive =
phoglund@webrtc.org59ad5412012-12-18 15:20:35 +000081 (ReleaseSRWLockExclusive)GetProcAddress(library,
82 "ReleaseSRWLockExclusive");
henrike@webrtc.org9f847232012-09-25 20:27:51 +000083 acquire_srw_lock_shared =
phoglund@webrtc.org59ad5412012-12-18 15:20:35 +000084 (AcquireSRWLockShared)GetProcAddress(library, "AcquireSRWLockShared");
henrike@webrtc.org9f847232012-09-25 20:27:51 +000085 release_srw_lock_shared =
phoglund@webrtc.org59ad5412012-12-18 15:20:35 +000086 (ReleaseSRWLockShared)GetProcAddress(library, "ReleaseSRWLockShared");
henrike@webrtc.org9f847232012-09-25 20:27:51 +000087
88 if (initialize_srw_lock && acquire_srw_lock_exclusive &&
89 release_srw_lock_exclusive && acquire_srw_lock_shared &&
90 release_srw_lock_shared) {
91 WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1, "Loaded Native RW Lock");
92 native_rw_locks_supported = true;
93 }
94 return native_rw_locks_supported;
niklase@google.com470e71d2011-07-07 08:21:25 +000095}
henrike@webrtc.org9f847232012-09-25 20:27:51 +000096
97} // namespace webrtc