00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef _DB_MUTEX_INT_H_
00011 #define _DB_MUTEX_INT_H_
00012
00013
00014
00015
00016 #ifdef HAVE_MUTEX_PTHREADS
00017 #include <pthread.h>
00018
00019 #define MUTEX_FIELDS \
00020 pthread_mutex_t mutex; \
00021 pthread_cond_t cond;
00022 #endif
00023
00024 #ifdef HAVE_MUTEX_UI_THREADS
00025 #include <thread.h>
00026 #endif
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 #ifdef HAVE_MUTEX_SOLARIS_LWP
00046
00047
00048
00049
00050
00051
00052 #include <synch.h>
00053
00054 #define MUTEX_FIELDS \
00055 lwp_mutex_t mutex; \
00056 lwp_cond_t cond;
00057 #endif
00058
00059
00060
00061
00062 #ifdef HAVE_MUTEX_UI_THREADS
00063 #include <thread.h>
00064 #include <synch.h>
00065
00066 #define MUTEX_FIELDS \
00067 mutex_t mutex; \
00068 cond_t cond;
00069 #endif
00070
00071
00072
00073
00074 #ifdef HAVE_MUTEX_AIX_CHECK_LOCK
00075 #include <sys/atomic_op.h>
00076 typedef int tsl_t;
00077
00078 #ifdef LOAD_ACTUAL_MUTEX_CODE
00079 #define MUTEX_INIT(x) 0
00080 #define MUTEX_SET(x) (!_check_lock(x, 0, 1))
00081 #define MUTEX_UNSET(x) _clear_lock(x, 0)
00082 #endif
00083 #endif
00084
00085
00086
00087
00088 #ifdef HAVE_MUTEX_DARWIN_SPIN_LOCK_TRY
00089 typedef u_int32_t tsl_t;
00090
00091 #ifdef LOAD_ACTUAL_MUTEX_CODE
00092 extern int _spin_lock_try(tsl_t *);
00093 extern void _spin_unlock(tsl_t *);
00094 #define MUTEX_SET(tsl) _spin_lock_try(tsl)
00095 #define MUTEX_UNSET(tsl) _spin_unlock(tsl)
00096 #define MUTEX_INIT(tsl) (MUTEX_UNSET(tsl), 0)
00097 #endif
00098 #endif
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 #ifdef HAVE_MUTEX_HPPA_MSEM_INIT
00115 #define MUTEX_ALIGN 16
00116 #endif
00117
00118 #if defined(HAVE_MUTEX_MSEM_INIT) || defined(HAVE_MUTEX_HPPA_MSEM_INIT)
00119 #include <sys/mman.h>
00120 typedef msemaphore tsl_t;
00121
00122 #ifdef LOAD_ACTUAL_MUTEX_CODE
00123 #define MUTEX_INIT(x) (msem_init(x, MSEM_UNLOCKED) <= (msemaphore *)0)
00124 #define MUTEX_SET(x) (!msem_lock(x, MSEM_IF_NOWAIT))
00125 #define MUTEX_UNSET(x) msem_unlock(x, 0)
00126 #endif
00127 #endif
00128
00129
00130
00131
00132 #ifdef HAVE_MUTEX_PLAN9
00133 typedef Lock tsl_t;
00134
00135 #define MUTEX_INIT(x) (memset(x, 0, sizeof(Lock)), 0)
00136 #define MUTEX_SET(x) canlock(x)
00137 #define MUTEX_UNSET(x) unlock(x)
00138 #endif
00139
00140
00141
00142
00143 #ifdef HAVE_MUTEX_RELIANTUNIX_INITSPIN
00144 #include <ulocks.h>
00145 typedef spinlock_t tsl_t;
00146
00147 #ifdef LOAD_ACTUAL_MUTEX_CODE
00148 #define MUTEX_INIT(x) (initspin(x, 1), 0)
00149 #define MUTEX_SET(x) (cspinlock(x) == 0)
00150 #define MUTEX_UNSET(x) spinunlock(x)
00151 #endif
00152 #endif
00153
00154
00155
00156
00157
00158
00159
00160
00161 #ifdef HAVE_MUTEX_SEMA_INIT
00162 #include <synch.h>
00163 typedef sema_t tsl_t;
00164
00165 #ifdef LOAD_ACTUAL_MUTEX_CODE
00166 #define MUTEX_DESTROY(x) sema_destroy(x)
00167 #define MUTEX_INIT(x) (sema_init(x, 1, USYNC_PROCESS, NULL) != 0)
00168 #define MUTEX_SET(x) (sema_wait(x) == 0)
00169 #define MUTEX_UNSET(x) sema_post(x)
00170 #endif
00171 #endif
00172
00173
00174
00175
00176 #ifdef HAVE_MUTEX_SGI_INIT_LOCK
00177 #include <abi_mutex.h>
00178 typedef abilock_t tsl_t;
00179
00180 #ifdef LOAD_ACTUAL_MUTEX_CODE
00181 #define MUTEX_INIT(x) (init_lock(x) != 0)
00182 #define MUTEX_SET(x) (!acquire_lock(x))
00183 #define MUTEX_UNSET(x) release_lock(x)
00184 #endif
00185 #endif
00186
00187
00188
00189
00190
00191
00192
00193
00194 #ifdef HAVE_MUTEX_SOLARIS_LOCK_TRY
00195 #include <sys/machlock.h>
00196 typedef lock_t tsl_t;
00197
00198 #ifdef LOAD_ACTUAL_MUTEX_CODE
00199 #define MUTEX_INIT(x) 0
00200 #define MUTEX_SET(x) _lock_try(x)
00201 #define MUTEX_UNSET(x) _lock_clear(x)
00202 #endif
00203 #endif
00204
00205
00206
00207
00208 #ifdef HAVE_MUTEX_VMS
00209 #include <sys/mman.h>;
00210 #include <builtins.h>
00211 typedef volatile unsigned char tsl_t;
00212
00213 #ifdef LOAD_ACTUAL_MUTEX_CODE
00214 #ifdef __ALPHA
00215 #define MUTEX_SET(tsl) (!__TESTBITSSI(tsl, 0))
00216 #else
00217 #define MUTEX_SET(tsl) (!(int)_BBSSI(0, tsl))
00218 #endif
00219 #define MUTEX_UNSET(tsl) (*(tsl) = 0)
00220 #define MUTEX_INIT(tsl) MUTEX_UNSET(tsl)
00221 #endif
00222 #endif
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232 #ifdef HAVE_MUTEX_VXWORKS
00233 #include "taskLib.h"
00234 typedef SEM_ID tsl_t;
00235
00236 #ifdef LOAD_ACTUAL_MUTEX_CODE
00237 #define MUTEX_SET(tsl) (semTake((*tsl), WAIT_FOREVER) == OK)
00238 #define MUTEX_UNSET(tsl) (semGive((*tsl)))
00239 #define MUTEX_INIT(tsl) \
00240 ((*(tsl) = semBCreate(SEM_Q_FIFO, SEM_FULL)) == NULL)
00241 #define MUTEX_DESTROY(tsl) semDelete(*tsl)
00242 #endif
00243 #endif
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254 #ifdef HAVE_MUTEX_WIN16
00255 typedef unsigned int tsl_t;
00256
00257 #ifdef LOAD_ACTUAL_MUTEX_CODE
00258 #define MUTEX_INIT(x) 0
00259 #define MUTEX_SET(tsl) (*(tsl) = 1)
00260 #define MUTEX_UNSET(tsl) (*(tsl) = 0)
00261 #endif
00262 #endif
00263
00264
00265
00266
00267 #if defined(HAVE_MUTEX_WIN32) || defined(HAVE_MUTEX_WIN32_GCC)
00268 #define MUTEX_FIELDS \
00269 LONG volatile tas; \
00270 LONG nwaiters; \
00271 u_int32_t id; \
00272
00273 #if defined(LOAD_ACTUAL_MUTEX_CODE)
00274 #define MUTEX_SET(tsl) (!InterlockedExchange((PLONG)tsl, 1))
00275 #define MUTEX_UNSET(tsl) InterlockedExchange((PLONG)tsl, 0)
00276 #define MUTEX_INIT(tsl) MUTEX_UNSET(tsl)
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287 #ifdef HAVE_MUTEX_WIN32
00288 #ifndef _WIN64
00289 #define MUTEX_PAUSE {__asm{_emit 0xf3}; __asm{_emit 0x90}}
00290 #endif
00291 #endif
00292 #ifdef HAVE_MUTEX_WIN32_GCC
00293 #define MUTEX_PAUSE asm volatile ("rep; nop" : : );
00294 #endif
00295 #endif
00296 #endif
00297
00298
00299
00300
00301 #ifdef HAVE_MUTEX_68K_GCC_ASSEMBLY
00302 typedef unsigned char tsl_t;
00303
00304 #ifdef LOAD_ACTUAL_MUTEX_CODE
00305
00306 #define MUTEX_SET(tsl) ({ \
00307 register tsl_t *__l = (tsl); \
00308 int __r; \
00309 asm volatile("tas %1; \n \
00310 seq %0" \
00311 : "=dm" (__r), "=m" (*__l) \
00312 : "1" (*__l) \
00313 ); \
00314 __r & 1; \
00315 })
00316
00317 #define MUTEX_UNSET(tsl) (*(tsl) = 0)
00318 #define MUTEX_INIT(tsl) MUTEX_UNSET(tsl)
00319 #endif
00320 #endif
00321
00322
00323
00324
00325 #ifdef HAVE_MUTEX_ALPHA_GCC_ASSEMBLY
00326 typedef u_int32_t tsl_t;
00327
00328 #define MUTEX_ALIGN 4
00329
00330 #ifdef LOAD_ACTUAL_MUTEX_CODE
00331
00332
00333
00334
00335 static inline int
00336 MUTEX_SET(tsl_t *tsl) {
00337 register tsl_t *__l = tsl;
00338 register tsl_t __r;
00339 asm volatile(
00340 "1: ldl_l %0,%2\n"
00341 " blbs %0,2f\n"
00342 " or $31,1,%0\n"
00343 " stl_c %0,%1\n"
00344 " beq %0,3f\n"
00345 " mb\n"
00346 " br 3f\n"
00347 "2: xor %0,%0\n"
00348 "3:"
00349 : "=&r"(__r), "=m"(*__l) : "1"(*__l) : "memory");
00350 return __r;
00351 }
00352
00353
00354
00355
00356
00357 static inline int
00358 MUTEX_UNSET(tsl_t *tsl) {
00359 asm volatile(" mb\n");
00360 return *tsl = 0;
00361 }
00362
00363 #define MUTEX_INIT(tsl) MUTEX_UNSET(tsl)
00364 #endif
00365 #endif
00366
00367
00368
00369
00370 #ifdef HAVE_MUTEX_TRU64_CC_ASSEMBLY
00371 typedef volatile u_int32_t tsl_t;
00372
00373 #define MUTEX_ALIGN 4
00374
00375 #ifdef LOAD_ACTUAL_MUTEX_CODE
00376 #include <alpha/builtins.h>
00377 #define MUTEX_SET(tsl) (__LOCK_LONG_RETRY((tsl), 1) != 0)
00378 #define MUTEX_UNSET(tsl) (__UNLOCK_LONG(tsl))
00379
00380 #define MUTEX_INIT(tsl) (MUTEX_UNSET(tsl), 0)
00381 #endif
00382 #endif
00383
00384
00385
00386
00387 #ifdef HAVE_MUTEX_ARM_GCC_ASSEMBLY
00388 typedef unsigned char tsl_t;
00389
00390 #ifdef LOAD_ACTUAL_MUTEX_CODE
00391
00392 #define MUTEX_SET(tsl) ({ \
00393 int __r; \
00394 asm volatile( \
00395 "swpb %0, %1, [%2]\n\t" \
00396 "eor %0, %0, #1\n\t" \
00397 : "=&r" (__r) \
00398 : "r" (1), "r" (tsl) \
00399 ); \
00400 __r & 1; \
00401 })
00402
00403 #define MUTEX_UNSET(tsl) (*(volatile tsl_t *)(tsl) = 0)
00404 #define MUTEX_INIT(tsl) MUTEX_UNSET(tsl)
00405 #endif
00406 #endif
00407
00408
00409
00410
00411 #ifdef HAVE_MUTEX_HPPA_GCC_ASSEMBLY
00412 typedef u_int32_t tsl_t;
00413
00414 #define MUTEX_ALIGN 16
00415
00416 #ifdef LOAD_ACTUAL_MUTEX_CODE
00417
00418
00419
00420
00421
00422 #define MUTEX_SET(tsl) ({ \
00423 register tsl_t *__l = (tsl); \
00424 int __r; \
00425 asm volatile("ldcws 0(%1),%0" : "=r" (__r) : "r" (__l)); \
00426 __r & 1; \
00427 })
00428
00429 #define MUTEX_UNSET(tsl) (*(volatile tsl_t *)(tsl) = -1)
00430 #define MUTEX_INIT(tsl) (MUTEX_UNSET(tsl), 0)
00431 #endif
00432 #endif
00433
00434
00435
00436
00437 #ifdef HAVE_MUTEX_IA64_GCC_ASSEMBLY
00438 typedef volatile unsigned char tsl_t;
00439
00440 #ifdef LOAD_ACTUAL_MUTEX_CODE
00441
00442 #define MUTEX_SET(tsl) ({ \
00443 register tsl_t *__l = (tsl); \
00444 long __r; \
00445 asm volatile("xchg1 %0=%1,%2" : \
00446 "=r"(__r), "+m"(*__l) : "r"(1)); \
00447 __r ^ 1; \
00448 })
00449
00450
00451
00452
00453
00454 #define MUTEX_UNSET(tsl) (*(tsl_t *)(tsl) = 0)
00455 #define MUTEX_INIT(tsl) MUTEX_UNSET(tsl)
00456 #endif
00457 #endif
00458
00459
00460
00461
00462 #if defined(HAVE_MUTEX_PPC_GCC_ASSEMBLY)
00463 typedef u_int32_t tsl_t;
00464
00465 #ifdef LOAD_ACTUAL_MUTEX_CODE
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496 static inline int
00497 MUTEX_SET(int *tsl) {
00498 int __r;
00499 asm volatile (
00500 "0: \n\t"
00501 " lwarx %0,0,%1 \n\t"
00502 " cmpwi %0,0 \n\t"
00503 " bne- 1f \n\t"
00504 " stwcx. %1,0,%1 \n\t"
00505 " isync \n\t"
00506 " beq+ 2f \n\t"
00507 " b 0b \n\t"
00508 "1: \n\t"
00509 " li %1,0 \n\t"
00510 "2: \n\t"
00511 : "=&r" (__r), "+r" (tsl)
00512 :
00513 : "cr0", "memory");
00514 return (int)tsl;
00515 }
00516
00517 static inline int
00518 MUTEX_UNSET(tsl_t *tsl) {
00519 asm volatile("sync" : : : "memory");
00520 return *tsl = 0;
00521 }
00522 #define MUTEX_INIT(tsl) MUTEX_UNSET(tsl)
00523 #endif
00524 #endif
00525
00526
00527
00528
00529 #ifdef HAVE_MUTEX_S390_CC_ASSEMBLY
00530 typedef int tsl_t;
00531
00532 #ifdef LOAD_ACTUAL_MUTEX_CODE
00533
00534
00535
00536
00537 #define MUTEX_SET(tsl) (!cs(&zero, (tsl), 1))
00538 #define MUTEX_UNSET(tsl) (*(tsl) = 0)
00539 #define MUTEX_INIT(tsl) MUTEX_UNSET(tsl)
00540 #endif
00541 #endif
00542
00543
00544
00545
00546 #ifdef HAVE_MUTEX_S390_GCC_ASSEMBLY
00547 typedef int tsl_t;
00548
00549 #ifdef LOAD_ACTUAL_MUTEX_CODE
00550
00551 static inline int
00552 MUTEX_SET(tsl_t *tsl) { \
00553 register tsl_t *__l = (tsl); \
00554 int __r; \
00555 asm volatile( \
00556 " la 1,%1\n" \
00557 " lhi 0,1\n" \
00558 " l %0,%1\n" \
00559 "0: cs %0,0,0(1)\n" \
00560 " jl 0b" \
00561 : "=&d" (__r), "+m" (*__l) \
00562 : : "0", "1", "cc"); \
00563 return !__r; \
00564 }
00565
00566 #define MUTEX_UNSET(tsl) (*(tsl) = 0)
00567 #define MUTEX_INIT(tsl) MUTEX_UNSET(tsl)
00568 #endif
00569 #endif
00570
00571
00572
00573
00574 #ifdef HAVE_MUTEX_SCO_X86_CC_ASSEMBLY
00575 typedef unsigned char tsl_t;
00576
00577 #ifdef LOAD_ACTUAL_MUTEX_CODE
00578
00579
00580
00581
00582
00583 #if defined(__USLC__)
00584 asm int
00585 _tsl_set(void *tsl)
00586 {
00587 %mem tsl
00588 movl tsl, %ecx
00589 movl $1, %eax
00590 lock
00591 xchgb (%ecx),%al
00592 xorl $1,%eax
00593 }
00594 #endif
00595
00596 #define MUTEX_SET(tsl) _tsl_set(tsl)
00597 #define MUTEX_UNSET(tsl) (*(tsl) = 0)
00598 #define MUTEX_INIT(tsl) MUTEX_UNSET(tsl)
00599 #endif
00600 #endif
00601
00602
00603
00604
00605 #ifdef HAVE_MUTEX_SPARC_GCC_ASSEMBLY
00606 typedef unsigned char tsl_t;
00607
00608 #ifdef LOAD_ACTUAL_MUTEX_CODE
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624 #define MUTEX_SET(tsl) ({ \
00625 register tsl_t *__l = (tsl); \
00626 register tsl_t __r; \
00627 __asm__ volatile \
00628 ("ldstub [%1],%0; stbar" \
00629 : "=r"( __r) : "r" (__l)); \
00630 !__r; \
00631 })
00632
00633 #define MUTEX_UNSET(tsl) (*(tsl) = 0)
00634 #define MUTEX_INIT(tsl) MUTEX_UNSET(tsl)
00635 #endif
00636 #endif
00637
00638
00639
00640
00641 #ifdef HAVE_MUTEX_UTS_CC_ASSEMBLY
00642 typedef int tsl_t;
00643
00644 #ifdef LOAD_ACTUAL_MUTEX_CODE
00645 #define MUTEX_INIT(x) 0
00646 #define MUTEX_SET(x) (!uts_lock(x, 1))
00647 #define MUTEX_UNSET(x) (*(x) = 0)
00648 #endif
00649 #endif
00650
00651
00652
00653
00654 #ifdef HAVE_MUTEX_MIPS_GCC_ASSEMBLY
00655 typedef u_int32_t tsl_t;
00656
00657 #define MUTEX_ALIGN 4
00658
00659 #ifdef LOAD_ACTUAL_MUTEX_CODE
00660
00661
00662
00663
00664 static inline int
00665 MUTEX_SET(tsl_t *tsl) {
00666 register tsl_t *__l = tsl;
00667 register tsl_t __r;
00668 __asm__ __volatile__(
00669 " .set push \n"
00670 " .set mips2 \n"
00671 " .set noreorder \n"
00672 " .set nomacro \n"
00673 "1: ll %0,%1 \n"
00674 " bne %0,$0,1f \n"
00675 " xori %0,%0,1 \n"
00676 " sc %0,%1 \n"
00677 " beql %0,$0,1b \n"
00678 " xori %0,1 \n"
00679 "1: .set pop "
00680 : "=&r" (__r), "+R" (*__l));
00681 return __r;
00682 }
00683
00684 #define MUTEX_UNSET(tsl) (*(volatile tsl_t *)(tsl) = 0)
00685 #define MUTEX_INIT(tsl) MUTEX_UNSET(tsl)
00686 #endif
00687 #endif
00688
00689
00690
00691
00692 #ifdef HAVE_MUTEX_X86_GCC_ASSEMBLY
00693 typedef unsigned char tsl_t;
00694
00695 #ifdef LOAD_ACTUAL_MUTEX_CODE
00696
00697 #define MUTEX_SET(tsl) ({ \
00698 register tsl_t *__l = (tsl); \
00699 int __r; \
00700 asm volatile("movl $1,%%eax\n" \
00701 "lock\n" \
00702 "xchgb %1,%%al\n" \
00703 "xorl $1,%%eax" \
00704 : "=&a" (__r), "=m" (*__l) \
00705 : "m1" (*__l) \
00706 ); \
00707 __r & 1; \
00708 })
00709
00710 #define MUTEX_UNSET(tsl) (*(volatile tsl_t *)(tsl) = 0)
00711 #define MUTEX_INIT(tsl) MUTEX_UNSET(tsl)
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722 #define MUTEX_PAUSE asm volatile ("rep; nop" : : );
00723 #endif
00724 #endif
00725
00726
00727
00728
00729 #ifdef HAVE_MUTEX_X86_64_GCC_ASSEMBLY
00730 typedef unsigned char tsl_t;
00731
00732 #ifdef LOAD_ACTUAL_MUTEX_CODE
00733
00734 #define MUTEX_SET(tsl) ({ \
00735 register tsl_t *__l = (tsl); \
00736 int __r; \
00737 asm volatile("mov $1,%%rax\n" \
00738 "lock\n" \
00739 "xchgb %1,%%al\n" \
00740 "xor $1,%%rax" \
00741 : "=&a" (__r), "=m" (*__l) \
00742 : "1m" (*__l) \
00743 ); \
00744 __r & 1; \
00745 })
00746
00747 #define MUTEX_UNSET(tsl) (*(tsl) = 0)
00748 #define MUTEX_INIT(tsl) MUTEX_UNSET(tsl)
00749 #endif
00750 #endif
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761 #ifndef MUTEX_ALIGN
00762 #define MUTEX_ALIGN sizeof(unsigned int)
00763 #endif
00764
00765
00766
00767
00768 #ifndef MUTEX_DESTROY
00769 #define MUTEX_DESTROY(x)
00770 #endif
00771
00772
00773
00774
00775
00776 typedef struct __db_mutexmgr {
00777
00778 DB_ENV *dbenv;
00779 REGINFO reginfo;
00780
00781 void *mutex_array;
00782 } DB_MUTEXMGR;
00783
00784
00785 #define MUTEX_SYSTEM_LOCK(dbenv) \
00786 MUTEX_LOCK(dbenv, ((DB_MUTEXREGION *)((DB_MUTEXMGR *) \
00787 (dbenv)->mutex_handle)->reginfo.primary)->mtx_region)
00788 #define MUTEX_SYSTEM_UNLOCK(dbenv) \
00789 MUTEX_UNLOCK(dbenv, ((DB_MUTEXREGION *)((DB_MUTEXMGR *) \
00790 (dbenv)->mutex_handle)->reginfo.primary)->mtx_region)
00791
00792
00793
00794
00795
00796 typedef struct __db_mutexregion {
00797
00798 roff_t mutex_offset;
00799 size_t mutex_size;
00800 roff_t thread_off;
00801
00802 db_mutex_t mtx_region;
00803
00804
00805 u_int32_t mutex_next;
00806
00807 DB_MUTEX_STAT stat;
00808 } DB_MUTEXREGION;
00809
00810 typedef struct __mutex_t {
00811 #ifdef MUTEX_FIELDS
00812 MUTEX_FIELDS
00813 #endif
00814 #if !defined(MUTEX_FIELDS) && !defined(HAVE_MUTEX_FCNTL)
00815 tsl_t tas;
00816 #endif
00817 pid_t pid;
00818 db_threadid_t tid;
00819
00820 u_int32_t mutex_next_link;
00821
00822 #ifdef HAVE_STATISTICS
00823 int alloc_id;
00824
00825 u_int32_t mutex_set_wait;
00826 u_int32_t mutex_set_nowait;
00827 #endif
00828
00829
00830
00831
00832
00833
00834
00835
00836 u_int32_t flags;
00837 } DB_MUTEX;
00838
00839
00840 #define MUTEXP_SET(indx) \
00841 (DB_MUTEX *) \
00842 ((u_int8_t *)mtxmgr->mutex_array + (indx) * mtxregion->mutex_size);
00843
00844 #endif