summaryrefslogtreecommitdiff
path: root/libcef_dll/base/cef_lock_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libcef_dll/base/cef_lock_impl.cc')
-rw-r--r--libcef_dll/base/cef_lock_impl.cc92
1 files changed, 92 insertions, 0 deletions
diff --git a/libcef_dll/base/cef_lock_impl.cc b/libcef_dll/base/cef_lock_impl.cc
new file mode 100644
index 00000000..4afe75f0
--- /dev/null
+++ b/libcef_dll/base/cef_lock_impl.cc
@@ -0,0 +1,92 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "include/base/internal/cef_lock_impl.h"
+
+#if defined(OS_WIN)
+
+namespace base {
+namespace cef_internal {
+
+LockImpl::LockImpl() {
+ // The second parameter is the spin count, for short-held locks it avoid the
+ // contending thread from going to sleep which helps performance greatly.
+ ::InitializeCriticalSectionAndSpinCount(&native_handle_, 2000);
+}
+
+LockImpl::~LockImpl() {
+ ::DeleteCriticalSection(&native_handle_);
+}
+
+bool LockImpl::Try() {
+ if (::TryEnterCriticalSection(&native_handle_) != FALSE) {
+ return true;
+ }
+ return false;
+}
+
+void LockImpl::Lock() {
+ ::EnterCriticalSection(&native_handle_);
+}
+
+void LockImpl::Unlock() {
+ ::LeaveCriticalSection(&native_handle_);
+}
+
+} // namespace cef_internal
+} // namespace base
+
+#elif defined(OS_POSIX)
+
+#include <errno.h>
+#include <string.h>
+
+#include "include/base/cef_logging.h"
+
+namespace base {
+namespace cef_internal {
+
+LockImpl::LockImpl() {
+#if DCHECK_IS_ON()
+ // In debug, setup attributes for lock error checking.
+ pthread_mutexattr_t mta;
+ int rv = pthread_mutexattr_init(&mta);
+ DCHECK_EQ(rv, 0) << ". " << strerror(rv);
+ rv = pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_ERRORCHECK);
+ DCHECK_EQ(rv, 0) << ". " << strerror(rv);
+ rv = pthread_mutex_init(&native_handle_, &mta);
+ DCHECK_EQ(rv, 0) << ". " << strerror(rv);
+ rv = pthread_mutexattr_destroy(&mta);
+ DCHECK_EQ(rv, 0) << ". " << strerror(rv);
+#else
+ // In release, go with the default lock attributes.
+ pthread_mutex_init(&native_handle_, NULL);
+#endif
+}
+
+LockImpl::~LockImpl() {
+ int rv = pthread_mutex_destroy(&native_handle_);
+ DCHECK_EQ(rv, 0) << ". " << strerror(rv);
+}
+
+bool LockImpl::Try() {
+ int rv = pthread_mutex_trylock(&native_handle_);
+ DCHECK(rv == 0 || rv == EBUSY) << ". " << strerror(rv);
+ return rv == 0;
+}
+
+void LockImpl::Lock() {
+ int rv = pthread_mutex_lock(&native_handle_);
+ DCHECK_EQ(rv, 0) << ". " << strerror(rv);
+}
+
+void LockImpl::Unlock() {
+ int rv = pthread_mutex_unlock(&native_handle_);
+ DCHECK_EQ(rv, 0) << ". " << strerror(rv);
+}
+
+} // namespace cef_internal
+} // namespace base
+
+#endif // defined(OS_POSIX)