[libbdplus-devel] Merge mutex changes from libbluray
anonymous
git at videolan.org
Wed Apr 29 10:24:24 CEST 2015
libbdplus | branch: master | anonymous <anonymous at anonymous.org> | Wed Apr 29 10:36:13 2015 +0300| [9821ee450dd4030f297a0ea3bfd9c53e4fa7677c] | committer: anonymous
Merge mutex changes from libbluray
> http://git.videolan.org/gitweb.cgi/libbdplus.git/?a=commit;h=9821ee450dd4030f297a0ea3bfd9c53e4fa7677c
---
src/util/mutex.c | 150 +++++++++++++++++++++++++++++++++++++++++++++++++++---
src/util/mutex.h | 102 ++-----------------------------------
2 files changed, 147 insertions(+), 105 deletions(-)
diff --git a/src/util/mutex.c b/src/util/mutex.c
index 73e01b8..92aa170 100644
--- a/src/util/mutex.c
+++ b/src/util/mutex.c
@@ -26,35 +26,171 @@
#include "logging.h"
#include "macro.h"
+#if defined(_WIN32)
+# include <windows.h>
+#elif defined(HAVE_PTHREAD_H)
+# include <pthread.h>
+#else
+# error no mutex support found
+#endif
+
#if defined(_WIN32)
- /* nothing here */
+
+typedef struct {
+ CRITICAL_SECTION cs;
+} MUTEX_IMPL;
+
+static int _mutex_lock(MUTEX_IMPL *p)
+{
+ EnterCriticalSection(&p->cs);
+ return 0;
+}
+
+static int _mutex_unlock(MUTEX_IMPL *p)
+{
+ LeaveCriticalSection(&p->cs);
+ return 0;
+}
+
+static int _mutex_init(MUTEX_IMPL *p)
+{
+ InitializeCriticalSection(&p->cs);
+ return 0;
+}
+
+static int _mutex_destroy(MUTEX_IMPL *p)
+{
+ DeleteCriticalSection(&p->cs);
+ return 0;
+}
+
+
#elif defined(HAVE_PTHREAD_H)
-#include <pthread.h>
+typedef struct {
+ int lock_count;
+ pthread_t owner;
+ pthread_mutex_t mutex;
+} MUTEX_IMPL;
-int bd_mutex_init(BD_MUTEX *p)
+static int _mutex_init(MUTEX_IMPL *p)
{
p->owner = (pthread_t)-1;
p->lock_count = 0;
if (pthread_mutex_init(&p->mutex, NULL)) {
+ BD_DEBUG(DBG_BLURAY|DBG_CRIT, "pthread_mutex_init() failed !\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+static int _mutex_lock(MUTEX_IMPL *p)
+{
+ if (pthread_equal(p->owner, pthread_self())) {
+ /* recursive lock */
+ p->lock_count++;
+ return 0;
+ }
+
+ if (pthread_mutex_lock(&p->mutex)) {
+ BD_DEBUG(DBG_BLURAY|DBG_CRIT, "pthread_mutex_lock() failed !\n");
+ return -1;
+ }
+
+ p->owner = pthread_self();
+ p->lock_count = 1;
+
+ return 0;
+}
+
+static int _mutex_unlock(MUTEX_IMPL *p)
+{
+ if (!pthread_equal(p->owner, pthread_self())) {
+ BD_DEBUG(DBG_BLURAY|DBG_CRIT, "bd_mutex_unlock(): not owner !\n");
+ return -1;
+ }
+
+ p->lock_count--;
+ if (p->lock_count > 0) {
+ return 0;
+ }
+
+ /* unlock */
+
+ p->owner = (pthread_t)-1;
+
+ if (pthread_mutex_unlock(&p->mutex)) {
+ BD_DEBUG(DBG_BLURAY|DBG_CRIT, "pthread_mutex_unlock() failed !\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+static int _mutex_destroy(MUTEX_IMPL *p)
+{
+ _mutex_lock(p);
+ _mutex_unlock(p);
+
+ if (pthread_mutex_destroy(&p->mutex)) {
+ BD_DEBUG(DBG_BLURAY|DBG_CRIT, "pthread_mutex_destroy() failed !\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+#endif /* HAVE_PTHREAD_H */
+
+int bd_mutex_lock(BD_MUTEX *p)
+{
+ if (!p->impl) {
+ BD_DEBUG(DBG_BLURAY|DBG_CRIT, "bd_mutex_lock() failed !\n");
+ return -1;
+ }
+ return _mutex_lock((MUTEX_IMPL*)p->impl);
+}
+
+int bd_mutex_unlock(BD_MUTEX *p)
+{
+ if (!p->impl) {
+ BD_DEBUG(DBG_BLURAY|DBG_CRIT, "bd_mutex_unlock() failed !\n");
+ return -1;
+ }
+ return _mutex_unlock((MUTEX_IMPL*)p->impl);
+}
+
+int bd_mutex_init(BD_MUTEX *p)
+{
+ p->impl = calloc(1, sizeof(MUTEX_IMPL));
+ if (!p->impl) {
BD_DEBUG(DBG_BLURAY|DBG_CRIT, "bd_mutex_init() failed !\n");
return -1;
}
+ if (_mutex_init((MUTEX_IMPL*)p->impl) < 0) {
+ X_FREE(p->impl);
+ return -1;
+ }
+
return 0;
}
int bd_mutex_destroy(BD_MUTEX *p)
{
- bd_mutex_lock(p);
- bd_mutex_unlock(p);
- if (pthread_mutex_destroy(&p->mutex)) {
+ if (!p->impl) {
BD_DEBUG(DBG_BLURAY|DBG_CRIT, "bd_mutex_destroy() failed !\n");
return -1;
}
+
+ if (_mutex_destroy((MUTEX_IMPL*)p->impl) < 0) {
+ return -1;
+ }
+
+ X_FREE(p->impl);
return 0;
}
-#endif /* HAVE_PTHREAD_H */
diff --git a/src/util/mutex.h b/src/util/mutex.h
index 6c19704..75868b9 100644
--- a/src/util/mutex.h
+++ b/src/util/mutex.h
@@ -20,56 +20,7 @@
#ifndef LIBBLURAY_MUTEX_H_
#define LIBBLURAY_MUTEX_H_
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#if defined(_WIN32)
-# include <windows.h>
-#elif defined(HAVE_PTHREAD_H)
-# include <pthread.h>
-#else
-# error no mutex support found
-#endif
-
-
-#if defined(_WIN32)
-
-#include <errno.h>
-
-typedef CRITICAL_SECTION BD_MUTEX;
-
-static inline int bd_mutex_lock(BD_MUTEX *p) {
- EnterCriticalSection(p);
- return 0;
-}
-
-static inline int bd_mutex_unlock(BD_MUTEX *p) {
- LeaveCriticalSection(p);
- return 0;
-}
-
-#if 0
-static int bd_mutex_trylock(BD_MUTEX *p) {
- return TryEnterCriticalSection(p) ? 0 : EBUSY;
-}
-#endif
-
-static inline int bd_mutex_init(BD_MUTEX *p) {
- InitializeCriticalSection(p);
- return 0;
-}
-
-static inline int bd_mutex_destroy(BD_MUTEX *p) {
- DeleteCriticalSection(p);
- return 0;
-}
-
-
-#elif defined(HAVE_PTHREAD_H)
-
-#include "logging.h"
-#include "macro.h"
+#include "attributes.h"
/*
* recursive mutex
@@ -77,58 +28,13 @@ static inline int bd_mutex_destroy(BD_MUTEX *p) {
typedef struct bd_mutex_s BD_MUTEX;
struct bd_mutex_s {
- int lock_count;
- pthread_t owner;
- pthread_mutex_t mutex;
+ void *impl;
};
BD_PRIVATE int bd_mutex_init(BD_MUTEX *p);
BD_PRIVATE int bd_mutex_destroy(BD_MUTEX *p);
-static inline int bd_mutex_lock(BD_MUTEX *p)
-{
- if (pthread_equal(p->owner, pthread_self())) {
- /* recursive lock */
- p->lock_count++;
- return 0;
- }
-
- if (pthread_mutex_lock(&p->mutex)) {
- BD_DEBUG(DBG_BLURAY|DBG_CRIT, "bd_mutex_lock() failed !\n");
- return -1;
- }
-
- p->owner = pthread_self();
- p->lock_count = 1;
-
- return 0;
-}
-
-static inline int bd_mutex_unlock(BD_MUTEX *p)
-{
- if (!pthread_equal(p->owner, pthread_self())) {
- BD_DEBUG(DBG_BLURAY|DBG_CRIT, "bd_mutex_unlock(): not owner !\n");
- return -1;
- }
-
- p->lock_count--;
- if (p->lock_count > 0) {
- return 0;
- }
-
- /* unlock */
-
- p->owner = (pthread_t)-1;
-
- if (pthread_mutex_unlock(&p->mutex)) {
- BD_DEBUG(DBG_BLURAY|DBG_CRIT, "bd_mutex_unlock() failed !\n");
- return -1;
- }
-
- return 0;
-}
-
-#endif // HAVE_PTHREAD_H
-
+BD_PRIVATE int bd_mutex_lock(BD_MUTEX *p);
+BD_PRIVATE int bd_mutex_unlock(BD_MUTEX *p);
#endif // LIBBLURAY_MUTEX_H_
More information about the libbdplus-devel
mailing list