mutex.m4
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:11k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. dnl $Id: mutex.m4,v 11.20 2000/12/20 22:16:56 bostic Exp $
  2. dnl Figure out mutexes for this compiler/architecture.
  3. AC_DEFUN(AM_DEFINE_MUTEXES, [
  4. AC_CACHE_CHECK([for mutexes], db_cv_mutex, [dnl
  5. db_cv_mutex=no
  6. orig_libs=$LIBS
  7. dnl User-specified POSIX mutexes.
  8. dnl
  9. dnl Assume that -lpthread exists when the user specifies POSIX mutexes.  (I
  10. dnl only expect this option to be used on Solaris, which has -lpthread.)
  11. if test "$db_cv_posixmutexes" = yes; then
  12. db_cv_mutex="posix_only"
  13. fi
  14. dnl User-specified UI mutexes.
  15. dnl
  16. dnl Assume that -lthread exists when the user specifies UI mutexes.  (I only
  17. dnl expect this option to be used on Solaris, which has -lthread.)
  18. if test "$db_cv_uimutexes" = yes; then
  19. db_cv_mutex="ui_only"
  20. fi
  21. dnl LWP threads: _lwp_XXX
  22. dnl
  23. dnl Test for LWP threads before testing for UI/POSIX threads, we prefer them
  24. dnl on Solaris.  There are two reasons: the Solaris C library has UI/POSIX
  25. dnl interface stubs, but they're broken, configuring them for inter-process
  26. dnl mutexes doesn't return an error, but it doesn't work either.  Second,
  27. dnl there's a bug in SunOS 5.7 where applications get pwrite, not pwrite64,
  28. dnl if they load the C library before the appropriate threads library, e.g.,
  29. dnl tclsh using dlopen to load the DB library.  Anyway, by using LWP threads
  30. dnl we avoid answering lots of user questions, not to mention the bugs.
  31. if test "$db_cv_mutex" = no; then
  32. AC_TRY_RUN([
  33. #include <synch.h>
  34. main(){
  35. static lwp_mutex_t mi = SHAREDMUTEX;
  36. static lwp_cond_t ci = SHAREDCV;
  37. lwp_mutex_t mutex = mi;
  38. lwp_cond_t cond = ci;
  39. exit (
  40. _lwp_mutex_lock(&mutex) ||
  41. _lwp_mutex_unlock(&mutex));
  42. }], [db_cv_mutex="Solaris/lwp"])
  43. fi
  44. dnl UI threads: thr_XXX
  45. dnl
  46. dnl Try with and without the -lthread library.
  47. if test "$db_cv_mutex" = no -o "$db_cv_mutex" = "ui_only"; then
  48. LIBS="-lthread $LIBS"
  49. AC_TRY_RUN([
  50. #include <thread.h>
  51. #include <synch.h>
  52. main(){
  53. mutex_t mutex;
  54. cond_t cond;
  55. int type = USYNC_PROCESS;
  56. exit (
  57. mutex_init(&mutex, type, NULL) ||
  58. cond_init(&cond, type, NULL) ||
  59. mutex_lock(&mutex) ||
  60. mutex_unlock(&mutex));
  61. }], [db_cv_mutex="UI/threads/library"])
  62. LIBS="$orig_libs"
  63. fi
  64. if test "$db_cv_mutex" = no -o "$db_cv_mutex" = "ui_only"; then
  65. AC_TRY_RUN([
  66. #include <thread.h>
  67. #include <synch.h>
  68. main(){
  69. mutex_t mutex;
  70. cond_t cond;
  71. int type = USYNC_PROCESS;
  72. exit (
  73. mutex_init(&mutex, type, NULL) ||
  74. cond_init(&cond, type, NULL) ||
  75. mutex_lock(&mutex) ||
  76. mutex_unlock(&mutex));
  77. }], [db_cv_mutex="UI/threads"])
  78. fi
  79. if test "$db_cv_mutex" = "ui_only"; then
  80. AC_MSG_ERROR([unable to find UI mutex interfaces])
  81. fi
  82. dnl POSIX.1 pthreads: pthread_XXX
  83. dnl
  84. dnl Try with and without the -lpthread library.
  85. if test "$db_cv_mutex" = no -o "$db_cv_mutex" = "posix_only"; then
  86. AC_TRY_RUN([
  87. #include <pthread.h>
  88. main(){
  89. pthread_cond_t cond;
  90. pthread_mutex_t mutex;
  91. pthread_condattr_t condattr;
  92. pthread_mutexattr_t mutexattr;
  93. exit (
  94. pthread_condattr_init(&condattr) ||
  95. pthread_condattr_setpshared(&condattr, PTHREAD_PROCESS_SHARED) ||
  96. pthread_mutexattr_init(&mutexattr) ||
  97. pthread_mutexattr_setpshared(&mutexattr, PTHREAD_PROCESS_SHARED) ||
  98. pthread_cond_init(&cond, &condattr) ||
  99. pthread_mutex_init(&mutex, &mutexattr) ||
  100. pthread_mutex_lock(&mutex) ||
  101. pthread_mutex_unlock(&mutex) ||
  102. pthread_mutex_destroy(&mutex) ||
  103. pthread_cond_destroy(&cond) ||
  104. pthread_condattr_destroy(&condattr) ||
  105. pthread_mutexattr_destroy(&mutexattr));
  106. }], [db_cv_mutex="POSIX/pthreads"])
  107. fi
  108. if test "$db_cv_mutex" = no -o "$db_cv_mutex" = "posix_only"; then
  109. LIBS="-lpthread $LIBS"
  110. AC_TRY_RUN([
  111. #include <pthread.h>
  112. main(){
  113. pthread_cond_t cond;
  114. pthread_mutex_t mutex;
  115. pthread_condattr_t condattr;
  116. pthread_mutexattr_t mutexattr;
  117. exit (
  118. pthread_condattr_init(&condattr) ||
  119. pthread_condattr_setpshared(&condattr, PTHREAD_PROCESS_SHARED) ||
  120. pthread_mutexattr_init(&mutexattr) ||
  121. pthread_mutexattr_setpshared(&mutexattr, PTHREAD_PROCESS_SHARED) ||
  122. pthread_cond_init(&cond, &condattr) ||
  123. pthread_mutex_init(&mutex, &mutexattr) ||
  124. pthread_mutex_lock(&mutex) ||
  125. pthread_mutex_unlock(&mutex) ||
  126. pthread_mutex_destroy(&mutex) ||
  127. pthread_cond_destroy(&cond) ||
  128. pthread_condattr_destroy(&condattr) ||
  129. pthread_mutexattr_destroy(&mutexattr));
  130. }], [db_cv_mutex="POSIX/pthreads/library"])
  131. LIBS="$orig_libs"
  132. fi
  133. if test "$db_cv_mutex" = "posix_only"; then
  134. AC_MSG_ERROR([unable to find POSIX mutex interfaces])
  135. fi
  136. dnl msemaphore: HPPA only
  137. dnl Try HPPA before general msem test, it needs special alignment.
  138. if test "$db_cv_mutex" = no; then
  139. AC_TRY_RUN([
  140. #include <sys/mman.h>
  141. main(){
  142. #if defined(__hppa)
  143. typedef msemaphore tsl_t;
  144. msemaphore x;
  145. msem_init(&x, 0);
  146. msem_lock(&x, 0);
  147. msem_unlock(&x, 0);
  148. exit(0);
  149. #else
  150. exit(1);
  151. #endif
  152. }], [db_cv_mutex="HP/msem_init"])
  153. fi
  154. dnl msemaphore: AIX, OSF/1
  155. if test "$db_cv_mutex" = no; then
  156. AC_TRY_RUN([
  157. #include <sys/types.h>
  158. #include <sys/mman.h>;
  159. main(){
  160. typedef msemaphore tsl_t;
  161. msemaphore x;
  162. msem_init(&x, 0);
  163. msem_lock(&x, 0);
  164. msem_unlock(&x, 0);
  165. exit(0);
  166. }], [db_cv_mutex="UNIX/msem_init"])
  167. fi
  168. dnl ReliantUNIX
  169. if test "$db_cv_mutex" = no; then
  170. LIBS="$LIBS -lmproc"
  171. AC_TRY_LINK([#include <ulocks.h>],
  172. [typedef spinlock_t tsl_t;
  173. spinlock_t x; initspin(&x, 1); cspinlock(&x); spinunlock(&x);],
  174. [db_cv_mutex="ReliantUNIX/initspin"])
  175. LIBS="$orig_libs"
  176. fi
  177. dnl SCO: UnixWare has threads in libthread, but OpenServer doesn't.
  178. if test "$db_cv_mutex" = no; then
  179. AC_TRY_RUN([
  180. main(){
  181. #if defined(__USLC__)
  182. exit(0);
  183. #endif
  184. exit(1);
  185. }], [db_cv_mutex="SCO/x86/cc-assembly"])
  186. fi
  187. dnl abilock_t: SGI
  188. if test "$db_cv_mutex" = no; then
  189. AC_TRY_LINK([#include <abi_mutex.h>],
  190. [typedef abilock_t tsl_t;
  191. abilock_t x; init_lock(&x); acquire_lock(&x); release_lock(&x);],
  192. [db_cv_mutex="SGI/init_lock"])
  193. fi
  194. dnl sema_t: Solaris
  195. dnl The sema_XXX calls do not work on Solaris 5.5.  I see no reason to ever
  196. dnl turn this test on, unless we find some other platform that uses the old
  197. dnl POSIX.1 interfaces.  (I plan to move directly to pthreads on Solaris.)
  198. if test "$db_cv_mutex" = DOESNT_WORK; then
  199. AC_TRY_LINK([#include <synch.h>],
  200. [typedef sema_t tsl_t;
  201.  sema_t x;
  202.  sema_init(&x, 1, USYNC_PROCESS, NULL); sema_wait(&x); sema_post(&x);],
  203. [db_cv_mutex="UNIX/sema_init"])
  204. fi
  205. dnl _lock_try/_lock_clear: Solaris
  206. dnl On Solaris systems without Pthread or UI mutex interfaces, DB uses the
  207. dnl undocumented _lock_try _lock_clear function calls instead of either the
  208. dnl sema_trywait(3T) or sema_wait(3T) function calls.  This is because of
  209. dnl problems in those interfaces in some releases of the Solaris C library.
  210. if test "$db_cv_mutex" = no; then
  211. AC_TRY_LINK([#include <sys/machlock.h>],
  212. [typedef lock_t tsl_t;
  213.  lock_t x;
  214.  _lock_try(&x); _lock_clear(&x);],
  215. [db_cv_mutex="Solaris/_lock_try"])
  216. fi
  217. dnl _check_lock/_clear_lock: AIX
  218. if test "$db_cv_mutex" = no; then
  219. AC_TRY_LINK([#include <sys/atomic_op.h>],
  220. [int x; _check_lock(&x,0,1); _clear_lock(&x,0);],
  221. [db_cv_mutex="AIX/_check_lock"])
  222. fi
  223. dnl Alpha/gcc: OSF/1
  224. dnl The alpha/gcc code doesn't work as far as I know.  There are
  225. dnl two versions, both have problems.  See Support Request #1583.
  226. if test "$db_cv_mutex" = DOESNT_WORK; then
  227. AC_TRY_RUN([main(){
  228. #if defined(__alpha)
  229. #if defined(__GNUC__)
  230. exit(0);
  231. #endif
  232. #endif
  233. exit(1);}],
  234. [db_cv_mutex="ALPHA/gcc-assembly"])
  235. fi
  236. dnl PaRisc/gcc: HP/UX
  237. if test "$db_cv_mutex" = no; then
  238. AC_TRY_RUN([main(){
  239. #if defined(__hppa)
  240. #if defined(__GNUC__)
  241. exit(0);
  242. #endif
  243. #endif
  244. exit(1);}],
  245. [db_cv_mutex="HPPA/gcc-assembly"])
  246. fi
  247. dnl PPC/gcc:
  248. if test "$db_cv_mutex" = no; then
  249. AC_TRY_RUN([main(){
  250. #if defined(__powerpc__)
  251. #if defined(__GNUC__)
  252. exit(0);
  253. #endif
  254. #endif
  255. exit(1);}],
  256. [db_cv_mutex="PPC/gcc-assembly"])
  257. fi
  258. dnl Sparc/gcc: SunOS, Solaris
  259. dnl The sparc/gcc code doesn't always work, specifically, I've seen assembler
  260. dnl failures from the stbar instruction on SunOS 4.1.4/sun4c and gcc 2.7.2.2.
  261. if test "$db_cv_mutex" = DOESNT_WORK; then
  262. AC_TRY_RUN([main(){
  263. #if defined(__sparc__)
  264. #if defined(__GNUC__)
  265. exit(0);
  266. #endif
  267. #endif
  268. exit(1);
  269. }], [db_cv_mutex="Sparc/gcc-assembly"])
  270. fi
  271. dnl 68K/gcc: SunOS
  272. if test "$db_cv_mutex" = no; then
  273. AC_TRY_RUN([main(){
  274. #if (defined(mc68020) || defined(sun3))
  275. #if defined(__GNUC__)
  276. exit(0);
  277. #endif
  278. #endif
  279. exit(1);
  280. }], [db_cv_mutex="68K/gcc-assembly"])
  281. fi
  282. dnl x86/gcc: FreeBSD, NetBSD, BSD/OS, Linux
  283. if test "$db_cv_mutex" = no; then
  284. AC_TRY_RUN([main(){
  285. #if defined(i386) || defined(__i386__)
  286. #if defined(__GNUC__)
  287. exit(0);
  288. #endif
  289. #endif
  290. exit(1);
  291. }], [db_cv_mutex="x86/gcc-assembly"])
  292. fi
  293. dnl ia86/gcc: Linux
  294. if test "$db_cv_mutex" = no; then
  295. AC_TRY_RUN([main(){
  296. #if defined(__ia64)
  297. #if defined(__GNUC__)
  298. exit(0);
  299. #endif
  300. #endif
  301. exit(1);
  302. }], [db_cv_mutex="ia64/gcc-assembly"])
  303. fi
  304. dnl: uts/cc: UTS
  305. if test "$db_cv_mutex" = no; then
  306. AC_TRY_RUN([main(){
  307. #if defined(_UTS)
  308. exit(0);
  309. #endif
  310. exit(1);
  311. }], [db_cv_mutex="UTS/cc-assembly"])
  312. fi
  313. ])
  314. if test "$db_cv_mutex" = no; then
  315. AC_MSG_WARN(
  316.     [THREAD MUTEXES NOT AVAILABLE FOR THIS COMPILER/ARCHITECTURE.])
  317. ADDITIONAL_OBJS="mut_fcntl${o} $ADDITIONAL_OBJS"
  318. else
  319. AC_DEFINE(HAVE_MUTEX_THREADS)
  320. fi
  321. case "$db_cv_mutex" in
  322. 68K/gcc-assembly) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS"
  323. AC_DEFINE(HAVE_MUTEX_68K_GCC_ASSEMBLY);;
  324. AIX/_check_lock) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS"
  325. AC_DEFINE(HAVE_MUTEX_AIX_CHECK_LOCK);;
  326. ALPHA/gcc-assembly) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS"
  327. AC_DEFINE(HAVE_MUTEX_ALPHA_GCC_ASSEMBLY);;
  328. HP/msem_init) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS"
  329. AC_DEFINE(HAVE_MUTEX_HPPA_MSEM_INIT);;
  330. HPPA/gcc-assembly) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS"
  331. AC_DEFINE(HAVE_MUTEX_HPPA_GCC_ASSEMBLY);;
  332. ia64/gcc-assembly) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS"
  333. AC_DEFINE(HAVE_MUTEX_IA64_GCC_ASSEMBLY);;
  334. POSIX/pthreads) ADDITIONAL_OBJS="mut_pthread${o} $ADDITIONAL_OBJS"
  335. AC_DEFINE(HAVE_MUTEX_PTHREADS);;
  336. POSIX/pthreads/library) LIBS="-lpthread $LIBS"
  337. ADDITIONAL_OBJS="mut_pthread${o} $ADDITIONAL_OBJS"
  338. AC_DEFINE(HAVE_MUTEX_PTHREADS);;
  339. PPC/gcc-assembly) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS"
  340. AC_DEFINE(HAVE_MUTEX_PPC_GCC_ASSEMBLY);;
  341. ReliantUNIX/initspin) LIBS="$LIBS -lmproc"
  342. ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS"
  343. AC_DEFINE(HAVE_MUTEX_RELIANTUNIX_INITSPIN);;
  344. SCO/x86/cc-assembly) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS"
  345. AC_DEFINE(HAVE_MUTEX_SCO_X86_CC_ASSEMBLY);;
  346. SGI/init_lock) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS"
  347. AC_DEFINE(HAVE_MUTEX_SGI_INIT_LOCK);;
  348. Solaris/_lock_try) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS"
  349. AC_DEFINE(HAVE_MUTEX_SOLARIS_LOCK_TRY);;
  350. Solaris/lwp) ADDITIONAL_OBJS="mut_pthread${o} $ADDITIONAL_OBJS"
  351. AC_DEFINE(HAVE_MUTEX_SOLARIS_LWP);;
  352. Sparc/gcc-assembly) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS"
  353. AC_DEFINE(HAVE_MUTEX_SPARC_GCC_ASSEMBLY);;
  354. UI/threads) ADDITIONAL_OBJS="mut_pthread${o} $ADDITIONAL_OBJS"
  355. AC_DEFINE(HAVE_MUTEX_UI_THREADS);;
  356. UI/threads/library) LIBS="-lthread $LIBS"
  357. ADDITIONAL_OBJS="mut_pthread${o} $ADDITIONAL_OBJS"
  358. AC_DEFINE(HAVE_MUTEX_UI_THREADS);;
  359. UNIX/msem_init) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS"
  360. AC_DEFINE(HAVE_MUTEX_MSEM_INIT);;
  361. UNIX/sema_init) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS"
  362. AC_DEFINE(HAVE_MUTEX_SEMA_INIT);;
  363. UTS/cc-assembly) ADDITIONAL_OBJS="$ADDITIONAL_OBJS uts4.cc${o}"
  364. AC_DEFINE(HAVE_MUTEX_UTS_CC_ASSEMBLY);;
  365. x86/gcc-assembly) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS"
  366. AC_DEFINE(HAVE_MUTEX_X86_GCC_ASSEMBLY);;
  367. esac
  368. ])dnl