You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			98 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
/*
 | 
						|
 *  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 "webrtc/system_wrappers/source/rw_lock_win.h"
 | 
						|
 | 
						|
#include "webrtc/system_wrappers/interface/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
 |