Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Unified Diff: include/ports/SkMutex_pthread.h

Issue 1359733002: Make mutex semaphore based. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix mutex leak Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « include/core/SkMutex.h ('k') | include/ports/SkMutex_win.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: include/ports/SkMutex_pthread.h
diff --git a/include/ports/SkMutex_pthread.h b/include/ports/SkMutex_pthread.h
deleted file mode 100644
index a0ea27414776d34bff7464999052a3a9ce61f286..0000000000000000000000000000000000000000
--- a/include/ports/SkMutex_pthread.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright 2013 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef SkMutex_pthread_DEFINED
-#define SkMutex_pthread_DEFINED
-
-/** Posix pthread_mutex based mutex. */
-
-#include <errno.h>
-#include <pthread.h>
-
-// We use error-checking mutexes in Debug builds or normal fast mutexes in Release builds.
-// Debug builds get these checks for free:
-// - a double acquire() from the same thread fails immediately instead of deadlocking;
-// - release() checks that the mutex is being unlocked by its owner thread.
-// I don't see a built-in way to implement assertHeld(), so we track that with an fOwner field.
-
-// This isn't technically portable, but on Linux and Android pthread_t is some sort of int, and
-// on Darwin it's a pointer. So assuming pthread_self() never returns 0, it works as a sentinel.
-SkDEBUGCODE(static const pthread_t kNoOwner = 0;)
-
-// An SkBaseMutex is a POD structure that can be directly initialized at declaration time with
-// SK_DECLARE_STATIC_MUTEX. This avoids the generation of a static initializer in the final
-// machine code (and a corresponding static finalizer).
-struct SkBaseMutex {
- void acquire() {
- SkDEBUGCODE(int rc = ) pthread_mutex_lock(&fMutex);
- SkASSERT(0 == rc);
- SkDEBUGCODE(fOwner = pthread_self();)
- }
- void release() {
- this->assertHeld(); // Usually redundant, but not for static mutexes on Macs (see below).
- SkDEBUGCODE(fOwner = kNoOwner;)
- SkDEBUGCODE(int rc = ) pthread_mutex_unlock(&fMutex);
- SkASSERT(0 == rc);
- }
- void assertHeld() {
- SkASSERT(0 != pthread_equal(fOwner, pthread_self()));
- }
-
- pthread_mutex_t fMutex;
- SkDEBUGCODE(pthread_t fOwner;) // Read and write only when holding fMutex.
-};
-
-// A normal mutex that's required to be initialized through normal C++ construction,
-// i.e. when it's a member of another class, or allocated on the heap.
-class SkMutex : public SkBaseMutex {
-public:
- SkMutex() {
-#ifdef SK_DEBUG
- pthread_mutexattr_t attr;
- SkASSERT(0 == pthread_mutexattr_init(&attr));
- SkASSERT(0 == pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK));
- SkASSERT(0 == pthread_mutex_init(&fMutex, &attr));
- SkASSERT(0 == pthread_mutexattr_destroy(&attr));
- fOwner = kNoOwner;
-#else
- (void)pthread_mutex_init(&fMutex, NULL);
-#endif
- }
-
- ~SkMutex() {
- SkDEBUGCODE(int rc = )pthread_mutex_destroy(&fMutex);
- SkASSERT(0 == rc);
- }
-
-private:
- SkMutex(const SkMutex&);
- SkMutex& operator=(const SkMutex&);
-};
-
-#if defined(SK_DEBUG) && defined(PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP)
- // When possible we want to use error-check mutexes in Debug builds. See the note at the top.
- #define SK_BASE_MUTEX_INIT { PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP, kNoOwner }
-#elif defined(SK_DEBUG)
- // Macs don't support PTHREAD_ERRORCHECK_MUTEX_INITIALIZER when targeting <10.7. We target 10.6.
- #define SK_BASE_MUTEX_INIT { PTHREAD_MUTEX_INITIALIZER, kNoOwner }
-#else
- #define SK_BASE_MUTEX_INIT { PTHREAD_MUTEX_INITIALIZER }
-#endif
-
-// Using POD-style initialization prevents the generation of a static initializer.
-//
-// Without magic statics there are no thread safety guarantees on initialization
-// of local statics (even POD). As a result, it is illegal to use
-// SK_DECLARE_STATIC_MUTEX in a function.
-//
-// Because SkBaseMutex is not a primitive, a static SkBaseMutex cannot be
-// initialized in a class with this macro.
-#define SK_DECLARE_STATIC_MUTEX(name) namespace {} static SkBaseMutex name = SK_BASE_MUTEX_INIT
-
-#endif
« no previous file with comments | « include/core/SkMutex.h ('k') | include/ports/SkMutex_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698