summaryrefslogtreecommitdiff
path: root/pjlib
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2006-02-07 22:17:55 +0000
committerBenny Prijono <bennylp@teluu.com>2006-02-07 22:17:55 +0000
commitfe5841e71cad24f1533ccd930140a3b03771de4e (patch)
treefe954c78bc83144e2b23cf816e73f13530a0e223 /pjlib
parentfd07c081949edc7ee046f3953d8d099aa9624feb (diff)
Implement rwlock for Linux
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@150 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjlib')
-rw-r--r--pjlib/src/pj/os_core_unix.c99
1 files changed, 95 insertions, 4 deletions
diff --git a/pjlib/src/pj/os_core_unix.c b/pjlib/src/pj/os_core_unix.c
index 91305be8..03713e9a 100644
--- a/pjlib/src/pj/os_core_unix.c
+++ b/pjlib/src/pj/os_core_unix.c
@@ -16,6 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#define _GNU_SOURCE
#include <pj/os.h>
#include <pj/assert.h>
#include <pj/pool.h>
@@ -34,10 +35,6 @@
#include <unistd.h> // getpid()
#include <errno.h> // errno
-#define __USE_GNU
-//uncomment this to get pthread_mutexattr_settype declaration.
-//unfortunately this causes syntax error in pthread.h! :(
-//#define __USE_UNIX98
#include <pthread.h>
#define THIS_FILE "osunix"
@@ -1000,6 +997,100 @@ PJ_DEF(pj_bool_t) pj_mutex_is_locked(pj_mutex_t *mutex)
#endif
///////////////////////////////////////////////////////////////////////////////
+struct pj_rwmutex_t
+{
+ pthread_rwlock_t rwlock;
+};
+
+PJ_DEF(pj_status_t) pj_rwmutex_create(pj_pool_t *pool, const char *name,
+ pj_rwmutex_t **p_mutex)
+{
+ pj_rwmutex_t *rwm;
+ pj_status_t status;
+
+ PJ_UNUSED_ARG(name);
+
+ rwm = pj_pool_alloc(pool, sizeof(pj_rwmutex_t));
+ PJ_ASSERT_RETURN(rwm, PJ_ENOMEM);
+
+ status = pthread_rwlock_init(&rwm->rwlock, NULL);
+ if (status != 0)
+ return PJ_RETURN_OS_ERROR(status);
+
+ *p_mutex = rwm;
+ return PJ_SUCCESS;
+}
+
+/*
+ * Lock the mutex for reading.
+ *
+ */
+PJ_DEF(pj_status_t) pj_rwmutex_lock_read(pj_rwmutex_t *mutex)
+{
+ pj_status_t status;
+
+ status = pthread_rwlock_rdlock(&mutex->rwlock);
+ if (status != 0)
+ return PJ_RETURN_OS_ERROR(status);
+
+ return PJ_SUCCESS;
+}
+
+/*
+ * Lock the mutex for writing.
+ *
+ */
+PJ_DEF(pj_status_t) pj_rwmutex_lock_write(pj_rwmutex_t *mutex)
+{
+ pj_status_t status;
+
+ status = pthread_rwlock_wrlock(&mutex->rwlock);
+ if (status != 0)
+ return PJ_RETURN_OS_ERROR(status);
+
+ return PJ_SUCCESS;
+}
+
+/*
+ * Release read lock.
+ *
+ */
+PJ_DEF(pj_status_t) pj_rwmutex_unlock_read(pj_rwmutex_t *mutex)
+{
+ return pj_rwmutex_unlock_write(mutex);
+}
+
+/*
+ * Release write lock.
+ *
+ */
+PJ_DEF(pj_status_t) pj_rwmutex_unlock_write(pj_rwmutex_t *mutex)
+{
+ pj_status_t status;
+
+ status = pthread_rwlock_unlock(&mutex->rwlock);
+ if (status != 0)
+ return PJ_RETURN_OS_ERROR(status);
+
+ return PJ_SUCCESS;
+}
+
+/*
+ * Destroy reader/writer mutex.
+ *
+ */
+PJ_DEF(pj_status_t) pj_rwmutex_destroy(pj_rwmutex_t *mutex)
+{
+ pj_status_t status;
+
+ status = pthread_rwlock_destroy(&mutex->rwlock);
+ if (status != 0)
+ return PJ_RETURN_OS_ERROR(status);
+
+ return PJ_SUCCESS;
+}
+
+///////////////////////////////////////////////////////////////////////////////
#if defined(PJ_HAS_SEMAPHORE) && PJ_HAS_SEMAPHORE != 0
/*