1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef BASE_SYNCHRONIZATION_LOCK_IMPL_H_
6 #define BASE_SYNCHRONIZATION_LOCK_IMPL_H_
7 
8 #include "base/base_export.h"
9 #include "base/macros.h"
10 #include "build/build_config.h"
11 
12 #if defined(OS_WIN)
13 #include <windows.h>
14 #elif defined(OS_POSIX)
15 #include <pthread.h>
16 #endif
17 
18 namespace base {
19 namespace internal {
20 
21 // This class implements the underlying platform-specific spin-lock mechanism
22 // used for the Lock class.  Most users should not use LockImpl directly, but
23 // should instead use Lock.
24 class BASE_EXPORT LockImpl {
25  public:
26 #if defined(OS_WIN)
27   typedef CRITICAL_SECTION NativeHandle;
28 #elif defined(OS_POSIX)
29   typedef pthread_mutex_t NativeHandle;
30 #endif
31 
32   LockImpl();
33   ~LockImpl();
34 
35   // If the lock is not held, take it and return true.  If the lock is already
36   // held by something else, immediately return false.
37   bool Try();
38 
39   // Take the lock, blocking until it is available if necessary.
40   void Lock();
41 
42   // Release the lock.  This must only be called by the lock's holder: after
43   // a successful call to Try, or a call to Lock.
44   void Unlock();
45 
46   // Return the native underlying lock.
47   // TODO(awalker): refactor lock and condition variables so that this is
48   // unnecessary.
native_handle()49   NativeHandle* native_handle() { return &native_handle_; }
50 
51  private:
52   NativeHandle native_handle_;
53 
54   DISALLOW_COPY_AND_ASSIGN(LockImpl);
55 };
56 
57 }  // namespace internal
58 }  // namespace base
59 
60 #endif  // BASE_SYNCHRONIZATION_LOCK_IMPL_H_
61