aboutsummaryrefslogtreecommitdiffstats
path: root/include/asterisk/lock.h
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2002-05-14 14:43:52 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2002-05-14 14:43:52 +0000
commite2dc6f96f0d595760046b04744895236121f5e3e (patch)
tree87bed3b8a126b751b883041384f5dc69db920315 /include/asterisk/lock.h
parent91d563c2a99e27c4eb7f491a078fb6a615b74304 (diff)
Version 0.1.12 from FTP
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@448 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'include/asterisk/lock.h')
-rwxr-xr-xinclude/asterisk/lock.h107
1 files changed, 107 insertions, 0 deletions
diff --git a/include/asterisk/lock.h b/include/asterisk/lock.h
new file mode 100755
index 000000000..2a66b8ca2
--- /dev/null
+++ b/include/asterisk/lock.h
@@ -0,0 +1,107 @@
+/*
+ * Asterisk -- A telephony toolkit for Linux.
+ *
+ * General Asterisk channel definitions.
+ *
+ * Copyright (C) 1999, Mark Spencer
+ *
+ * Mark Spencer <markster@linux-support.net>
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License
+ */
+
+#ifndef _ASTERISK_LOCK_H
+#define _ASTERISK_LOCK_H
+
+#include <pthread.h>
+
+#ifdef DEBUG_THREADS
+
+#define TRIES 50
+
+#include <errno.h>
+#include <string.h>
+#include <stdio.h>
+#include <unistd.h>
+
+// #define AST_MUTEX_INITIALIZER PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+// #define AST_MUTEX_KIND PTHREAD_MUTEX_RECURSIVE_NP
+#ifdef PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
+#define AST_MUTEX_INITIALIZER PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
+#define AST_MUTEX_KIND PTHREAD_MUTEX_ERRORCHECK_NP
+#else
+#define AST_MUTEX_INITIALIZER PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+#define AST_MUTEX_KIND PTHREAD_MUTEX_RECURSIVE_NP
+#endif
+
+struct mutex_info {
+ pthread_mutex_t *mutex;
+ char *file;
+ int lineno;
+ char *func;
+ struct mutex_info *next;
+};
+
+static inline int ast_pthread_mutex_init(pthread_mutex_t *t) {
+ static pthread_mutexattr_t attr;
+ static int init = 1;
+ extern int pthread_mutexattr_setkind_np(pthread_mutexattr_t *, int);
+
+ if (init) {
+ pthread_mutexattr_init(&attr);
+ pthread_mutexattr_setkind_np(&attr, AST_MUTEX_KIND);
+ init = 0;
+ }
+ return pthread_mutex_init(t, &attr);
+}
+
+static inline int __ast_pthread_mutex_lock(char *filename, int lineno, char *func, pthread_mutex_t *t) {
+ int res;
+ int tries = TRIES;
+ do {
+ res = pthread_mutex_trylock(t);
+ /* If we can't run, yield */
+ if (res) {
+ sched_yield();
+ usleep(1);
+ }
+ } while(res && tries--);
+ if (res) {
+ fprintf(stderr, "%s line %d (%s): Error obtaining mutex: %s\n",
+ filename, lineno, func, strerror(res));
+ if ((res = pthread_mutex_lock(t)))
+ fprintf(stderr, "%s line %d (%s): Error waiting for mutex: %s\n",
+ filename, lineno, func, strerror(res));
+ else
+ fprintf(stderr, "%s line %d (%s): Got it eventually...\n",
+ filename, lineno, func);
+ }
+ return res;
+}
+
+#define ast_pthread_mutex_lock(a) __ast_pthread_mutex_lock(__FILE__, __LINE__, __PRETTY_FUNCTION__, a)
+
+static inline int __ast_pthread_mutex_unlock(char *filename, int lineno, char *func, pthread_mutex_t *t) {
+ int res;
+ res = pthread_mutex_unlock(t);
+ if (res)
+ fprintf(stderr, "%s line %d (%s): Error releasing mutex: %s\n",
+ filename, lineno, func, strerror(res));
+ return res;
+}
+
+#define ast_pthread_mutex_unlock(a) __ast_pthread_mutex_unlock(__FILE__, __LINE__, __PRETTY_FUNCTION__, a)
+
+#else
+
+#define AST_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
+#define AST_MUTEX_KIND PTHREAD_MUTEX_FAST_NP
+
+#define ast_pthread_mutex_initi(mutex,kind) pthread_mutex_init(mutex)
+#define ast_pthread_mutex_lock pthread_mutex_lock
+#define ast_pthread_mutex_unlock pthread_mutex_unlock
+
+#endif
+
+#endif