mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 18:55:19 +00:00 
			
		
		
		
	Merged revisions 190093 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ................ r190093 | tilghman | 2009-04-22 16:38:15 -0500 (Wed, 22 Apr 2009) | 14 lines Merged revisions 190092 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r190092 | tilghman | 2009-04-22 16:35:03 -0500 (Wed, 22 Apr 2009) | 7 lines Detect availability of pthread_rwlock_timedwrlock() before using it. (closes issue #14930) Reported by: tilghman Patches: 20090420__bug14930.diff.txt uploaded by tilghman (license 14) Tested by: mvanbaak, tilghman ........ ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@190095 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		
							
								
								
									
										66
									
								
								configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										66
									
								
								configure
									
									
									
									
										vendored
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| #! /bin/sh | #! /bin/sh | ||||||
| # From configure.ac Revision: 189642 . | # From configure.ac Revision: 189815 . | ||||||
| # Guess values for system-dependent variables and create Makefiles. | # Guess values for system-dependent variables and create Makefiles. | ||||||
| # Generated by GNU Autoconf 2.61 for asterisk 1.6. | # Generated by GNU Autoconf 2.61 for asterisk 1.6. | ||||||
| # | # | ||||||
| @@ -16792,6 +16792,70 @@ fi | |||||||
| rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ | rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ | ||||||
|       conftest$ac_exeext conftest.$ac_ext |       conftest$ac_exeext conftest.$ac_ext | ||||||
| 
 | 
 | ||||||
|  | { echo "$as_me:$LINENO: checking for pthread_rwlock_timedwrlock() in pthread.h" >&5 | ||||||
|  | echo $ECHO_N "checking for pthread_rwlock_timedwrlock() in pthread.h... $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 <pthread.h> | ||||||
|  |      #include <time.h> | ||||||
|  | int | ||||||
|  | main () | ||||||
|  | { | ||||||
|  | pthread_rwlock_t foo; struct timespec bar; pthread_rwlock_timedwrlock(&foo, &bar) | ||||||
|  |   ; | ||||||
|  |   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; } | ||||||
|  |     ac_cv_pthread_rwlock_timedwrlock="yes" | ||||||
|  | 
 | ||||||
|  | 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; } | ||||||
|  |     ac_cv_pthread_rwlock_timedwrlock="no" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ | ||||||
|  |       conftest$ac_exeext conftest.$ac_ext | ||||||
|  | if test "${ac_cv_pthread_rwlock_timedwrlock}" = "yes"; then | ||||||
|  | 
 | ||||||
|  | cat >>confdefs.h <<\_ACEOF | ||||||
|  | #define HAVE_PTHREAD_RWLOCK_TIMEDWRLOCK 1 | ||||||
|  | _ACEOF | ||||||
|  | 
 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|     if test "x${PBX_PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP}" != "x1"; then |     if test "x${PBX_PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP}" != "x1"; then | ||||||
| 	{ echo "$as_me:$LINENO: checking for PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP in pthread.h" >&5 | 	{ echo "$as_me:$LINENO: checking for PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP in pthread.h" >&5 | ||||||
|   | |||||||
							
								
								
									
										18
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								configure.ac
									
									
									
									
									
								
							| @@ -437,6 +437,24 @@ AC_DEFINE([HAVE_PTHREAD_MUTEX_RECURSIVE_NP], 1, [Define to 1 if your system defi | |||||||
| AC_MSG_RESULT(no) | AC_MSG_RESULT(no) | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | AC_MSG_CHECKING(for pthread_rwlock_timedwrlock() in pthread.h) | ||||||
|  | AC_LINK_IFELSE( | ||||||
|  |   [AC_LANG_PROGRAM( | ||||||
|  |     [#include <pthread.h> | ||||||
|  |      #include <time.h>], | ||||||
|  |     [pthread_rwlock_t foo; struct timespec bar; pthread_rwlock_timedwrlock(&foo, &bar)]) | ||||||
|  |   ],[ | ||||||
|  |     AC_MSG_RESULT(yes) | ||||||
|  |     ac_cv_pthread_rwlock_timedwrlock="yes" | ||||||
|  |   ],[ | ||||||
|  |     AC_MSG_RESULT(no) | ||||||
|  |     ac_cv_pthread_rwlock_timedwrlock="no" | ||||||
|  |   ] | ||||||
|  | ) | ||||||
|  | if test "${ac_cv_pthread_rwlock_timedwrlock}" = "yes"; then | ||||||
|  |   AC_DEFINE([HAVE_PTHREAD_RWLOCK_TIMEDWRLOCK], 1, [Define if your system has pthread_rwlock_timedwrlock()]) | ||||||
|  | fi | ||||||
|  |  | ||||||
| AST_C_DEFINE_CHECK([PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP], [PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP], [pthread.h]) | AST_C_DEFINE_CHECK([PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP], [PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP], [pthread.h]) | ||||||
|  |  | ||||||
| #if test "${cross_compiling}" = "no"; | #if test "${cross_compiling}" = "no"; | ||||||
|   | |||||||
| @@ -659,6 +659,9 @@ | |||||||
|    pthread.h */ |    pthread.h */ | ||||||
| #undef HAVE_PTHREAD_RWLOCK_PREFER_WRITER_NP | #undef HAVE_PTHREAD_RWLOCK_PREFER_WRITER_NP | ||||||
|  |  | ||||||
|  | /* Define if your system has pthread_rwlock_timedwrlock() */ | ||||||
|  | #undef HAVE_PTHREAD_RWLOCK_TIMEDWRLOCK | ||||||
|  |  | ||||||
| /* Define to 1 if the system has the type `ptrdiff_t'. */ | /* Define to 1 if the system has the type `ptrdiff_t'. */ | ||||||
| #undef HAVE_PTRDIFF_T | #undef HAVE_PTRDIFF_T | ||||||
|  |  | ||||||
|   | |||||||
| @@ -49,10 +49,15 @@ | |||||||
| #define _ASTERISK_LOCK_H | #define _ASTERISK_LOCK_H | ||||||
|  |  | ||||||
| #include <pthread.h> | #include <pthread.h> | ||||||
|  | #include <time.h> | ||||||
| #include <sys/param.h> | #include <sys/param.h> | ||||||
| #ifdef HAVE_BKTR | #ifdef HAVE_BKTR | ||||||
| #include <execinfo.h> | #include <execinfo.h> | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #ifndef HAVE_PTHREAD_RWLOCK_TIMEDWRLOCK | ||||||
|  | #include "asterisk/time.h" | ||||||
|  | #endif | ||||||
| #include "asterisk/logger.h" | #include "asterisk/logger.h" | ||||||
|  |  | ||||||
| /* internal macro to profile mutexes. Only computes the delay on | /* internal macro to profile mutexes. Only computes the delay on | ||||||
| @@ -1395,7 +1400,23 @@ static inline int _ast_rwlock_timedrdlock(ast_rwlock_t *t, const char *name, | |||||||
| 		ast_store_lock_info(AST_WRLOCK, filename, line, func, name, t); | 		ast_store_lock_info(AST_WRLOCK, filename, line, func, name, t); | ||||||
| #endif | #endif | ||||||
| 	} | 	} | ||||||
|  | #ifdef HAVE_PTHREAD_RWLOCK_TIMEDWRLOCK | ||||||
| 	res = pthread_rwlock_timedrdlock(&t->lock, abs_timeout); | 	res = pthread_rwlock_timedrdlock(&t->lock, abs_timeout); | ||||||
|  | #else | ||||||
|  | 	do { | ||||||
|  | 		struct timeval _start = ast_tvnow(), _diff; | ||||||
|  | 		for (;;) { | ||||||
|  | 			if (!(res = pthread_rwlock_tryrdlock(&t->lock))) { | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 			_diff = ast_tvsub(ast_tvnow(), _start); | ||||||
|  | 			if (_diff.tv_sec > abs_timeout->tv_sec || (_diff.tv_sec == abs_timeout->tv_sec && _diff.tv_usec * 1000 > abs_timeout->tv_nsec)) { | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 			usleep(1); | ||||||
|  | 		} | ||||||
|  | 	} while (0); | ||||||
|  | #endif | ||||||
| 	if (!res) { | 	if (!res) { | ||||||
| 		ast_reentrancy_lock(lt); | 		ast_reentrancy_lock(lt); | ||||||
| 		if (lt->reentrancy < AST_MAX_REENTRANCY) { | 		if (lt->reentrancy < AST_MAX_REENTRANCY) { | ||||||
| @@ -1474,7 +1495,23 @@ static inline int _ast_rwlock_timedwrlock(ast_rwlock_t *t, const char *name, | |||||||
| 		ast_store_lock_info(AST_WRLOCK, filename, line, func, name, t); | 		ast_store_lock_info(AST_WRLOCK, filename, line, func, name, t); | ||||||
| #endif | #endif | ||||||
| 	} | 	} | ||||||
|  | #ifdef HAVE_PTHREAD_RWLOCK_TIMEDWRLOCK | ||||||
| 	res = pthread_rwlock_timedwrlock(&t->lock, abs_timeout); | 	res = pthread_rwlock_timedwrlock(&t->lock, abs_timeout); | ||||||
|  | #else | ||||||
|  | 	do { | ||||||
|  | 		struct timeval _start = ast_tvnow(), _diff; | ||||||
|  | 		for (;;) { | ||||||
|  | 			if (!(res = pthread_rwlock_trywrlock(&t->lock))) { | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 			_diff = ast_tvsub(ast_tvnow(), _start); | ||||||
|  | 			if (_diff.tv_sec > abs_timeout->tv_sec || (_diff.tv_sec == abs_timeout->tv_sec && _diff.tv_usec * 1000 > abs_timeout->tv_nsec)) { | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 			usleep(1); | ||||||
|  | 		} | ||||||
|  | 	} while (0); | ||||||
|  | #endif | ||||||
| 	if (!res) { | 	if (!res) { | ||||||
| 		ast_reentrancy_lock(lt); | 		ast_reentrancy_lock(lt); | ||||||
| 		if (lt->reentrancy < AST_MAX_REENTRANCY) { | 		if (lt->reentrancy < AST_MAX_REENTRANCY) { | ||||||
| @@ -1762,7 +1799,23 @@ static inline int ast_rwlock_rdlock(ast_rwlock_t *prwlock) | |||||||
|  |  | ||||||
| static inline int ast_rwlock_timedrdlock(ast_rwlock_t *prwlock, const struct timespec *abs_timeout) | static inline int ast_rwlock_timedrdlock(ast_rwlock_t *prwlock, const struct timespec *abs_timeout) | ||||||
| { | { | ||||||
| 	return pthread_rwlock_timedrdlock(prwlock, abs_timeout); | 	int res; | ||||||
|  | #ifdef HAVE_PTHREAD_RWLOCK_TIMEDWRLOCK | ||||||
|  | 	res = pthread_rwlock_timedrdlock(prwlock, abs_timeout); | ||||||
|  | #else | ||||||
|  | 	struct timeval _start = ast_tvnow(), _diff; | ||||||
|  | 	for (;;) { | ||||||
|  | 		if (!(res = pthread_rwlock_tryrdlock(prwlock))) { | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 		_diff = ast_tvsub(ast_tvnow(), _start); | ||||||
|  | 		if (_diff.tv_sec > abs_timeout->tv_sec || (_diff.tv_sec == abs_timeout->tv_sec && _diff.tv_usec * 1000 > abs_timeout->tv_nsec)) { | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 		usleep(1); | ||||||
|  | 	} | ||||||
|  | #endif | ||||||
|  | 	return res; | ||||||
| } | } | ||||||
|  |  | ||||||
| static inline int ast_rwlock_tryrdlock(ast_rwlock_t *prwlock) | static inline int ast_rwlock_tryrdlock(ast_rwlock_t *prwlock) | ||||||
| @@ -1777,7 +1830,25 @@ static inline int ast_rwlock_wrlock(ast_rwlock_t *prwlock) | |||||||
|  |  | ||||||
| static inline int ast_rwlock_timedwrlock(ast_rwlock_t *prwlock, const struct timespec *abs_timeout) | static inline int ast_rwlock_timedwrlock(ast_rwlock_t *prwlock, const struct timespec *abs_timeout) | ||||||
| { | { | ||||||
| 	return pthread_rwlock_timedwrlock(prwlock, abs_timeout); | 	int res; | ||||||
|  | #ifdef HAVE_PTHREAD_RWLOCK_TIMEDWRLOCK | ||||||
|  | 	res = pthread_rwlock_timedwrlock(prwlock, abs_timeout); | ||||||
|  | #else | ||||||
|  | 	do { | ||||||
|  | 		struct timeval _start = ast_tvnow(), _diff; | ||||||
|  | 		for (;;) { | ||||||
|  | 			if (!(res = pthread_rwlock_trywrlock(prwlock))) { | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 			_diff = ast_tvsub(ast_tvnow(), _start); | ||||||
|  | 			if (_diff.tv_sec > abs_timeout->tv_sec || (_diff.tv_sec == abs_timeout->tv_sec && _diff.tv_usec * 1000 > abs_timeout->tv_nsec)) { | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 			usleep(1); | ||||||
|  | 		} | ||||||
|  | 	} while (0); | ||||||
|  | #endif | ||||||
|  | 	return res; | ||||||
| } | } | ||||||
|  |  | ||||||
| static inline int ast_rwlock_trywrlock(ast_rwlock_t *prwlock) | static inline int ast_rwlock_trywrlock(ast_rwlock_t *prwlock) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user