From 345968e6fb5f47b766fb4962b43f199575ac421d Mon Sep 17 00:00:00 2001 From: Joshua Colp Date: Thu, 28 Dec 2006 19:43:15 +0000 Subject: [PATCH] Backport support for read/write locks. git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@49022 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- configure | 110 ++++++++++++++++++++++++++++++- configure.ac | 18 +++++ include/asterisk/autoconfig.h.in | 6 ++ include/asterisk/lock.h | 66 +++++++++++++++++++ 4 files changed, 199 insertions(+), 1 deletion(-) diff --git a/configure b/configure index 8e9e65e773..c93b02ebaa 100755 --- a/configure +++ b/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.ac Revision: 48561 . +# From configure.ac Revision: 48960 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61. # @@ -14065,6 +14065,114 @@ fi done +{ echo "$as_me:$LINENO: checking for PTHREAD_RWLOCK_INITIALIZER" >&5 +echo $ECHO_N "checking for PTHREAD_RWLOCK_INITIALIZER... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +int foo = PTHREAD_RWLOCK_INITIALIZER; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + +cat >>confdefs.h <<\_ACEOF +#define HAVE_PTHREAD_RWLOCK_INITIALIZER 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + +{ echo "$as_me:$LINENO: checking for PTHREAD_RWLOCK_PREFER_WRITER_NP" >&5 +echo $ECHO_N "checking for PTHREAD_RWLOCK_PREFER_WRITER_NP... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +int foo = PTHREAD_RWLOCK_PREFER_WRITER_NP; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + +cat >>confdefs.h <<\_ACEOF +#define HAVE_PTHREAD_RWLOCK_PREFER_WRITER_NP 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + { echo "$as_me:$LINENO: checking for compiler atomic operations" >&5 echo $ECHO_N "checking for compiler atomic operations... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF diff --git a/configure.ac b/configure.ac index 88b59de644..43ed4a332c 100644 --- a/configure.ac +++ b/configure.ac @@ -261,6 +261,24 @@ AC_FUNC_UTIME_NULL AC_FUNC_VPRINTF AC_CHECK_FUNCS([asprintf atexit bzero dup2 endpwent floor ftruncate getcwd gethostbyname gethostname getloadavg gettimeofday inet_ntoa isascii localtime_r memchr memmove memset mkdir munmap pow putenv re_comp regcomp rint select setenv socket sqrt strcasecmp strcasestr strchr strcspn strdup strerror strncasecmp strndup strnlen strrchr strsep strspn strstr strtol strtoq unsetenv utime vasprintf]) +AC_MSG_CHECKING(for PTHREAD_RWLOCK_INITIALIZER) +AC_LINK_IFELSE( + AC_LANG_PROGRAM([#include ], + [int foo = PTHREAD_RWLOCK_INITIALIZER;]), + AC_MSG_RESULT(yes) + AC_DEFINE([HAVE_PTHREAD_RWLOCK_INITIALIZER], 1, [Define to 1 if your system has PTHREAD_RWLOCK_INITIALIZER.]), + AC_MSG_RESULT(no) +) + +AC_MSG_CHECKING(for PTHREAD_RWLOCK_PREFER_WRITER_NP) +AC_LINK_IFELSE( + AC_LANG_PROGRAM([#include ], + [int foo = PTHREAD_RWLOCK_PREFER_WRITER_NP;]), + AC_MSG_RESULT(yes) + AC_DEFINE([HAVE_PTHREAD_RWLOCK_PREFER_WRITER_NP], 1, [Define to 1 if your system has PTHREAD_RWLOCK_PREFER_WRITER_NP.]), + AC_MSG_RESULT(no) +) + AC_MSG_CHECKING(for compiler atomic operations) AC_LINK_IFELSE( AC_LANG_PROGRAM([], [int foo1; int foo2 = __sync_fetch_and_add(&foo1, 1);]), diff --git a/include/asterisk/autoconfig.h.in b/include/asterisk/autoconfig.h.in index 1e6274026b..20e8ba398e 100644 --- a/include/asterisk/autoconfig.h.in +++ b/include/asterisk/autoconfig.h.in @@ -250,6 +250,12 @@ /* Define to indicate the ${PRI_DESCRIP} library */ #undef HAVE_PRI +/* Define to 1 if your system has PTHREAD_RWLOCK_INITIALIZER. */ +#undef HAVE_PTHREAD_RWLOCK_INITIALIZER + +/* Define to 1 if your system has PTHREAD_RWLOCK_PREFER_WRITER_NP. */ +#undef HAVE_PTHREAD_RWLOCK_PREFER_WRITER_NP + /* Define to 1 if the system has the type `ptrdiff_t'. */ #undef HAVE_PTRDIFF_T diff --git a/include/asterisk/lock.h b/include/asterisk/lock.h index bcd2fdabef..c2aeecdf5c 100644 --- a/include/asterisk/lock.h +++ b/include/asterisk/lock.h @@ -614,6 +614,72 @@ static void __attribute__ ((destructor)) fini_##mutex(void) \ #define pthread_create __use_ast_pthread_create_instead__ #endif +typedef pthread_rwlock_t ast_rwlock_t; + +static inline int ast_rwlock_init(ast_rwlock_t *prwlock) +{ + pthread_rwlockattr_t attr; + + pthread_rwlockattr_init(&attr); + +#ifdef HAVE_PTHREAD_RWLOCK_PREFER_WRITER_NP + pthread_rwlockattr_setkind_np(&attr, PTHREAD_RWLOCK_PREFER_WRITER_NP); +#endif + + return pthread_rwlock_init(prwlock, &attr); +} + +static inline int ast_rwlock_destroy(ast_rwlock_t *prwlock) +{ + return pthread_rwlock_destroy(prwlock); +} + +static inline int ast_rwlock_unlock(ast_rwlock_t *prwlock) +{ + return pthread_rwlock_unlock(prwlock); +} + +static inline int ast_rwlock_rdlock(ast_rwlock_t *prwlock) +{ + return pthread_rwlock_rdlock(prwlock); +} + +static inline int ast_rwlock_tryrdlock(ast_rwlock_t *prwlock) +{ + return pthread_rwlock_tryrdlock(prwlock); +} + +static inline int ast_rwlock_wrlock(ast_rwlock_t *prwlock) +{ + return pthread_rwlock_wrlock(prwlock); +} + +static inline int ast_rwlock_trywrlock(ast_rwlock_t *prwlock) +{ + return pthread_rwlock_trywrlock(prwlock); +} + +/* Statically declared read/write locks */ + +#ifndef HAVE_PTHREAD_RWLOCK_INITIALIZER +#define __AST_RWLOCK_DEFINE(scope, rwlock) \ + scope ast_rwlock_t rwlock; \ +static void __attribute__ ((constructor)) init_##rwlock(void) \ +{ \ + ast_rwlock_init(&rwlock); \ +} \ +static void __attribute__ ((destructor)) fini_##rwlock(void) \ +{ \ + ast_rwlock_destroy(&rwlock); \ +} +#else +#define AST_RWLOCK_INIT_VALUE PTHREAD_RWLOCK_INITIALIZER +#define __AST_RWLOCK_DEFINE(scope, rwlock) \ + scope ast_rwlock_t rwlock = AST_RWLOCK_INIT_VALUE +#endif + +#define AST_RWLOCK_DEFINE_STATIC(rwlock) __AST_RWLOCK_DEFINE(static, rwlock) + /* * Initial support for atomic instructions. * For platforms that have it, use the native cpu instruction to