• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3  *
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 
11 #include "webrtc/system_wrappers/source/rw_lock_win.h"
12 
13 #include "webrtc/system_wrappers/include/trace.h"
14 
15 namespace webrtc {
16 
17 static bool native_rw_locks_supported = false;
18 static bool module_load_attempted = false;
19 static HMODULE library = NULL;
20 
21 typedef void (WINAPI* InitializeSRWLock)(PSRWLOCK);
22 
23 typedef void (WINAPI* AcquireSRWLockExclusive)(PSRWLOCK);
24 typedef void (WINAPI* ReleaseSRWLockExclusive)(PSRWLOCK);
25 
26 typedef void (WINAPI* AcquireSRWLockShared)(PSRWLOCK);
27 typedef void (WINAPI* ReleaseSRWLockShared)(PSRWLOCK);
28 
29 InitializeSRWLock       initialize_srw_lock;
30 AcquireSRWLockExclusive acquire_srw_lock_exclusive;
31 AcquireSRWLockShared    acquire_srw_lock_shared;
32 ReleaseSRWLockShared    release_srw_lock_shared;
33 ReleaseSRWLockExclusive release_srw_lock_exclusive;
34 
RWLockWin()35 RWLockWin::RWLockWin() {
36   initialize_srw_lock(&lock_);
37 }
38 
Create()39 RWLockWin* RWLockWin::Create() {
40   if (!LoadModule()) {
41     return NULL;
42   }
43   return new RWLockWin();
44 }
45 
AcquireLockExclusive()46 void RWLockWin::AcquireLockExclusive() {
47   acquire_srw_lock_exclusive(&lock_);
48 }
49 
ReleaseLockExclusive()50 void RWLockWin::ReleaseLockExclusive() {
51   release_srw_lock_exclusive(&lock_);
52 }
53 
AcquireLockShared()54 void RWLockWin::AcquireLockShared() {
55   acquire_srw_lock_shared(&lock_);
56 }
57 
ReleaseLockShared()58 void RWLockWin::ReleaseLockShared() {
59   release_srw_lock_shared(&lock_);
60 }
61 
LoadModule()62 bool 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");
73 
74   initialize_srw_lock =
75     (InitializeSRWLock)GetProcAddress(library, "InitializeSRWLock");
76 
77   acquire_srw_lock_exclusive =
78     (AcquireSRWLockExclusive)GetProcAddress(library,
79                                             "AcquireSRWLockExclusive");
80   release_srw_lock_exclusive =
81     (ReleaseSRWLockExclusive)GetProcAddress(library,
82                                             "ReleaseSRWLockExclusive");
83   acquire_srw_lock_shared =
84     (AcquireSRWLockShared)GetProcAddress(library, "AcquireSRWLockShared");
85   release_srw_lock_shared =
86     (ReleaseSRWLockShared)GetProcAddress(library, "ReleaseSRWLockShared");
87 
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;
95 }
96 
97 }  // namespace webrtc
98