Annotation of parser3/src/sql/mysql/mySQL32/include/my_pthread.h, revision 1.1

1.1     ! paf         1: /* Copyright Abandoned 1999 TCX DataKonsult AB & Monty Program KB & Detron HB
        !             2:    This file is public domain and comes with NO WARRANTY of any kind */
        !             3: 
        !             4: /* Defines to make different thread packages compatible */
        !             5: 
        !             6: #ifndef _my_pthread_h
        !             7: #define _my_pthread_h
        !             8: 
        !             9: #include <errno.h>
        !            10: #ifndef ETIME
        !            11: #define ETIME ETIMEDOUT                                // For FreeBSD
        !            12: #endif
        !            13: 
        !            14: #if defined(__WIN32__)
        !            15: 
        !            16: typedef CRITICAL_SECTION pthread_mutex_t;
        !            17: typedef HANDLE          pthread_t;
        !            18: typedef struct thread_attr {
        !            19:     DWORD dwStackSize ;
        !            20:     DWORD dwCreatingFlag ;
        !            21:     int priority ;
        !            22: } pthread_attr_t ;
        !            23: 
        !            24: typedef struct { int dummy; } pthread_condattr_t;
        !            25: 
        !            26: /* Implementation of posix conditions */
        !            27: 
        !            28: typedef struct st_pthread_link {
        !            29:   DWORD thread_id;
        !            30:   struct st_pthread_link *next;
        !            31: } pthread_link;
        !            32: 
        !            33: typedef struct {
        !            34:   uint32 waiting;
        !            35:   HANDLE semaphore;
        !            36: } pthread_cond_t;
        !            37: 
        !            38: 
        !            39: struct timespec {              /* For pthread_cond_timedwait() */
        !            40:     time_t tv_sec;
        !            41:     long tv_nsec;
        !            42: };
        !            43: 
        !            44: #define win_pthread_self my_thread_var->pthread_self
        !            45: #define pthread_handler_decl(A,B) unsigned __cdecl A(void *B)
        !            46: typedef unsigned (__cdecl *pthread_handler)(void *);
        !            47: 
        !            48: int win_pthread_setspecific(void *A,void *B,uint length);
        !            49: int pthread_create(pthread_t *,pthread_attr_t *,pthread_handler,void *);
        !            50: int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);
        !            51: int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
        !            52: int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
        !            53:                           struct timespec *abstime);
        !            54: int pthread_cond_signal(pthread_cond_t *cond);
        !            55: int pthread_cond_broadcast(pthread_cond_t *cond);
        !            56: int pthread_cond_destroy(pthread_cond_t *cond);
        !            57: int pthread_attr_init(pthread_attr_t *connect_att);
        !            58: int pthread_attr_setstacksize(pthread_attr_t *connect_att,DWORD stack);
        !            59: int pthread_attr_setprio(pthread_attr_t *connect_att,int priority);
        !            60: int pthread_attr_destroy(pthread_attr_t *connect_att);
        !            61: struct tm *localtime_r(const time_t *timep,struct tm *tmp);
        !            62: 
        !            63: void pthread_exit(unsigned A);  /* was #define pthread_exit(A) ExitThread(A)*/
        !            64: 
        !            65: #define ETIMEDOUT 145              /* Win32 doesn't have this */
        !            66: #define getpid() GetCurrentThreadId()
        !            67: #define pthread_self() win_pthread_self
        !            68: #define HAVE_LOCALTIME_R
        !            69: #define _REENTRANT
        !            70: #define HAVE_PTHREAD_ATTR_SETSTACKSIZE
        !            71: 
        !            72: #ifdef USE_TLS                                 /* For LIBMYSQL.DLL */
        !            73: #define pthread_key(T,V)  DWORD V
        !            74: #define pthread_key_create(A,B) ((*A=TlsAlloc())==0xFFFFFFFF)
        !            75: #define pthread_getspecific(A) (TlsGetValue(A))
        !            76: #define my_pthread_getspecific(T,A) ((T) TlsGetValue(A))
        !            77: #define my_pthread_getspecific_ptr(T,V) ((T) TlsGetValue(A))
        !            78: #define my_pthread_setspecific_ptr(T,V) TlsSetValue(T,V)
        !            79: #define pthread_setspecific(A,B) TlsSetValue(A,B)
        !            80: #else
        !            81: #define pthread_key(T,V) __declspec(thread) T V
        !            82: #define pthread_key_create(A,B) pthread_dummy(0)
        !            83: #define pthread_getspecific(A) (&(A))
        !            84: #define my_pthread_getspecific(T,A) (&(A))
        !            85: #define my_pthread_getspecific_ptr(T,V) (V)
        !            86: #define my_pthread_setspecific_ptr(T,V) ((T)=(V),0)
        !            87: #define pthread_setspecific(A,B) win_pthread_setspecific(&(A),(B),sizeof(A))
        !            88: #endif /* USE_TLS */
        !            89: 
        !            90: #define pthread_equal(A,B) ((A) == (B))
        !            91: #define pthread_mutex_init(A,B)  InitializeCriticalSection(A)
        !            92: #define pthread_mutex_lock(A)   (EnterCriticalSection(A),0)
        !            93: #define pthread_mutex_unlock(A)  LeaveCriticalSection(A)
        !            94: #define pthread_mutex_destroy(A) DeleteCriticalSection(A)
        !            95: #define my_pthread_setprio(A,B)  SetThreadPriority(GetCurrentThread(), (B))
        !            96: /* Dummy defines for easier code */
        !            97: #define pthread_kill(A,B) pthread_dummy(0)
        !            98: #define pthread_attr_setdetachstate(A,B) pthread_dummy(0)
        !            99: #define my_pthread_attr_setprio(A,B) pthread_attr_setprio(A,B)
        !           100: #define pthread_attr_setscope(A,B)
        !           101: #define pthread_detach_this_thread()
        !           102: #define pthread_condattr_init(A)
        !           103: #define pthread_condattr_destroy(A)
        !           104: 
        !           105: //Irena: compiler does not like this:
        !           106: //#define my_pthread_getprio(pthread_t thread_id) pthread_dummy(0)
        !           107: #define my_pthread_getprio(thread_id) pthread_dummy(0)
        !           108: 
        !           109: #elif defined(HAVE_UNIXWARE7_THREADS)
        !           110: 
        !           111: #include <thread.h>
        !           112: #include <synch.h>
        !           113: 
        !           114: #ifndef _REENTRANT
        !           115: #define _REENTRANT
        !           116: #endif
        !           117: 
        !           118: #define HAVE_NONPOSIX_SIGWAIT
        !           119: #define pthread_t thread_t
        !           120: #define pthread_cond_t cond_t
        !           121: #define pthread_mutex_t mutex_t
        !           122: #define pthread_key_t thread_key_t
        !           123: typedef int pthread_attr_t;                    /* Needed by Unixware 7.0.0 */
        !           124: 
        !           125: #define pthread_key_create(A,B) thr_keycreate((A),(B))
        !           126: 
        !           127: #define pthread_handler_decl(A,B) void *A(void *B)
        !           128: #define pthread_key(T,V) pthread_key_t V
        !           129: 
        !           130: void * my_pthread_getspecific_imp(pthread_key_t key);
        !           131: #define my_pthread_getspecific(A,B) ((A) my_pthread_getspecific_imp(B))
        !           132: #define my_pthread_getspecific_ptr(T,V) my_pthread_getspecific(T,V)
        !           133: 
        !           134: #define pthread_setspecific(A,B) thr_setspecific(A,B)
        !           135: #define my_pthread_setspecific_ptr(T,V) pthread_setspecific(T,V)
        !           136: 
        !           137: #define pthread_create(A,B,C,D) thr_create(NULL,65536L,(C),(D),THR_DETACHED,(A))
        !           138: #define pthread_cond_init(a,b) cond_init((a),USYNC_THREAD,NULL)
        !           139: #define pthread_cond_destroy(a) cond_destroy(a)
        !           140: #define pthread_cond_signal(a) cond_signal(a)
        !           141: #define pthread_cond_wait(a,b) cond_wait((a),(b))
        !           142: #define pthread_cond_timedwait(a,b,c) cond_timedwait((a),(b),(c))
        !           143: #define pthread_cond_broadcast(a) cond_broadcast(a)
        !           144: 
        !           145: #define pthread_mutex_init(a,b) mutex_init((a),USYNC_THREAD,NULL)
        !           146: #define pthread_mutex_lock(a) mutex_lock(a)
        !           147: #define pthread_mutex_unlock(a) mutex_unlock(a)
        !           148: #define pthread_mutex_destroy(a) mutex_destroy(a)
        !           149: 
        !           150: #define pthread_self() thr_self()
        !           151: #define pthread_exit(A) thr_exit(A)
        !           152: #define pthread_equal(A,B) (((A) == (B)) ? 1 : 0)
        !           153: #define pthread_kill(A,B) thr_kill((A),(B))
        !           154: #define HAVE_PTHREAD_KILL
        !           155: 
        !           156: #define pthread_sigmask(A,B,C) thr_sigsetmask((A),(B),(C))
        !           157: 
        !           158: extern int my_sigwait(sigset_t *set,int *sig);
        !           159: 
        !           160: #define pthread_detach_this_thread() pthread_dummy(0)
        !           161: 
        !           162: #define pthread_attr_init(A) pthread_dummy(0)
        !           163: #define pthread_attr_destroy(A) pthread_dummy(0)
        !           164: #define pthread_attr_setscope(A,B) pthread_dummy(0)
        !           165: #define pthread_attr_setdetachstate(A,B) pthread_dummy(0)
        !           166: #define my_pthread_setprio(A,B) pthread_dummy (0)
        !           167: #define my_pthread_getprio(A) pthread_dummy (0)
        !           168: #define my_pthread_attr_setprio(A,B) pthread_dummy(0)
        !           169: 
        !           170: #else /* Normal threads */
        !           171: 
        !           172: #ifdef HAVE_rts_threads
        !           173: #define sigwait org_sigwait
        !           174: #include <signal.h>
        !           175: #undef sigwait
        !           176: #endif
        !           177: #undef _REENTRANT                      /* Fix if _REENTRANT is in pthread.h */
        !           178: #include <pthread.h>
        !           179: #ifndef _REENTRANT
        !           180: #define _REENTRANT
        !           181: #endif
        !           182: #ifdef HAVE_THR_SETCONCURRENCY
        !           183: #include <thread.h>                    /* Probably solaris */
        !           184: #endif
        !           185: #ifdef HAVE_SCHED_H
        !           186: #include <sched.h>
        !           187: #endif
        !           188: #ifdef HAVE_SYNCH_H
        !           189: #include <synch.h>
        !           190: #endif
        !           191: #if defined(__EMX__) && (!defined(EMX_PTHREAD_REV) || (EMX_PTHREAD_REV < 2))
        !           192: #error Requires at least rev 2 of EMX pthreads library.
        !           193: #endif
        !           194: 
        !           195: extern int my_pthread_getprio(pthread_t thread_id);
        !           196: 
        !           197: #define pthread_key(T,V) pthread_key_t V
        !           198: #define my_pthread_getspecific_ptr(T,V) my_pthread_getspecific(T,(V))
        !           199: #define my_pthread_setspecific_ptr(T,V) pthread_setspecific(T,(void*) (V))
        !           200: #define pthread_detach_this_thread()
        !           201: #define pthread_handler_decl(A,B) void *A(void *B)
        !           202: typedef void *(* pthread_handler)(void *);
        !           203: 
        !           204: /* safe mutex for debugging */
        !           205: 
        !           206: typedef struct st_safe_mutex_t
        !           207: {
        !           208:   pthread_mutex_t global,mutex;
        !           209:   char *file;
        !           210:   uint line,count;
        !           211:   pthread_t thread;
        !           212: } safe_mutex_t;
        !           213: 
        !           214: int safe_mutex_init(safe_mutex_t *mp, const pthread_mutexattr_t *attr);
        !           215: int safe_mutex_lock(safe_mutex_t *mp,const char *file, uint line);
        !           216: int safe_mutex_unlock(safe_mutex_t *mp,const char *file, uint line);
        !           217: int safe_mutex_destroy(safe_mutex_t *mp);
        !           218: int safe_cond_wait(pthread_cond_t *cond, safe_mutex_t *mp,const char *file, uint line);
        !           219: int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp,
        !           220:                        struct timespec *abstime, const char *file, uint line);
        !           221: 
        !           222: #ifdef SAFE_MUTEX
        !           223: #undef pthread_mutex_init
        !           224: #undef pthread_mutex_lock
        !           225: #undef pthread_mutex_unlock
        !           226: #undef pthread_mutex_destroy
        !           227: #undef pthread_mutex_wait
        !           228: #undef pthread_mutex_timedwait
        !           229: #undef pthread_mutex_t
        !           230: #define pthread_mutex_init(A,B) safe_mutex_init((A),(B))
        !           231: #define pthread_mutex_lock(A) safe_mutex_lock((A),__FILE__,__LINE__)
        !           232: #define pthread_mutex_unlock(A) safe_mutex_unlock((A),__FILE__,__LINE__)
        !           233: #define pthread_mutex_destroy(A) safe_mutex_destroy((A))
        !           234: #define pthread_cond_wait(A,B) safe_cond_wait((A),(B),__FILE__,__LINE__)
        !           235: #define pthread_cond_timedwait(A,B,C) safe_cond_timedwait((A),(B),(C),__FILE__,__LINE__)
        !           236: #define pthread_mutex_t safe_mutex_t
        !           237: #endif
        !           238: 
        !           239: /* Test first for RTS or FSU threads */
        !           240: 
        !           241: #if defined(PTHREAD_SCOPE_GLOBAL) && !defined(PTHREAD_SCOPE_SYSTEM)
        !           242: #define HAVE_rts_threads
        !           243: extern int my_pthread_create_detached;
        !           244: #define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C))
        !           245: #define PTHREAD_CREATE_DETACHED &my_pthread_create_detached
        !           246: #define PTHREAD_SCOPE_SYSTEM  PTHREAD_SCOPE_GLOBAL
        !           247: #define PTHREAD_SCOPE_PROCESS PTHREAD_SCOPE_LOCAL
        !           248: #define USE_ALARM_THREAD
        !           249: #elif defined(HAVE_mit_thread)
        !           250: #define USE_ALARM_THREAD
        !           251: #undef HAVE_LOCALTIME_R
        !           252: #define HAVE_LOCALTIME_R
        !           253: #undef HAVE_PTHREAD_ATTR_SETSCOPE
        !           254: #define HAVE_PTHREAD_ATTR_SETSCOPE
        !           255: #undef HAVE_GLIBC2_STYLE_GETHOSTBYNAME_R       /* If we are running linux */
        !           256: #undef HAVE_RWLOCK_T
        !           257: #undef HAVE_RWLOCK_INIT
        !           258: #undef HAVE_SNPRINTF
        !           259: 
        !           260: #define sigset(A,B) pthread_signal((A),(void (*)(int)) (B))
        !           261: #define signal(A,B) pthread_signal((A),(void (*)(int)) (B))
        !           262: #define my_pthread_attr_setprio(A,B)
        !           263: #endif /* defined(PTHREAD_SCOPE_GLOBAL) && !defined(PTHREAD_SCOPE_SYSTEM) */
        !           264: 
        !           265: #if defined(_BSDI_VERSION) && _BSDI_VERSION < 199910
        !           266: int sigwait(const sigset_t *set, int *sig);
        !           267: #endif
        !           268: 
        !           269: #if defined(HAVE_UNIXWARE7_POSIX)
        !           270: #undef HAVE_NONPOSIX_SIGWAIT
        !           271: #define HAVE_NONPOSIX_SIGWAIT  /* sigwait takes only 1 argument */
        !           272: #endif
        !           273: 
        !           274: #ifndef HAVE_NONPOSIX_SIGWAIT
        !           275: #define my_sigwait(A,B) sigwait((A),(B))
        !           276: #else
        !           277: int my_sigwait(sigset_t *set,int *sig);
        !           278: #endif
        !           279: 
        !           280: #ifdef HAVE_NONPOSIX_PTHREAD_MUTEX_INIT
        !           281: #ifndef SAFE_MUTEX
        !           282: #define pthread_mutex_init(a,b) my_pthread_mutex_init((a),(b))
        !           283: extern int my_pthread_mutex_init(pthread_mutex_t *mp,
        !           284:                                 const pthread_mutexattr_t *attr);
        !           285: #endif /* SAFE_MUTEX */
        !           286: #define pthread_cond_init(a,b) my_pthread_cond_init((a),(b))
        !           287: extern int my_pthread_cond_init(pthread_cond_t *mp,
        !           288:                                const pthread_condattr_t *attr);
        !           289: #endif /* HAVE_NONPOSIX_PTHREAD_MUTEX_INIT */
        !           290: 
        !           291: #if defined(HAVE_SIGTHREADMASK) && !defined(HAVE_PTHREAD_SIGMASK)
        !           292: #define pthread_sigmask(A,B,C) sigthreadmask((A),(B),(C))
        !           293: #endif
        !           294: 
        !           295: #if !defined(HAVE_SIGWAIT) && !defined(HAVE_mit_thread) && !defined(HAVE_rts_threads) && !defined(sigwait) && !defined(alpha_linux_port) && !defined(HAVE_NONPOSIX_SIGWAIT) && !defined(HAVE_DEC_3_2_THREADS) && !defined(_AIX)
        !           296: int sigwait(sigset_t *setp, int *sigp);                /* Use our implemention */
        !           297: #endif
        !           298: #if !defined(HAVE_SIGSET) && !defined(HAVE_mit_thread) && !defined(sigset)
        !           299: #define sigset(A,B) signal((A),(B))
        !           300: #endif
        !           301: 
        !           302: #ifndef my_pthread_setprio
        !           303: #if defined(HAVE_PTHREAD_SETPRIO_NP)           /* FSU threads */
        !           304: #define my_pthread_setprio(A,B) pthread_setprio_np((A),(B))
        !           305: #elif defined(HAVE_PTHREAD_SETPRIO)
        !           306: #define my_pthread_setprio(A,B) pthread_setprio((A),(B))
        !           307: #else
        !           308: extern void my_pthread_setprio(pthread_t thread_id,int prior);
        !           309: #endif
        !           310: #endif
        !           311: 
        !           312: #ifndef my_pthread_attr_setprio
        !           313: #ifdef HAVE_PTHREAD_ATTR_SETPRIO
        !           314: #define my_pthread_attr_setprio(A,B) pthread_attr_setprio((A),(B))
        !           315: #else
        !           316: extern void my_pthread_attr_setprio(pthread_attr_t *attr, int priority);
        !           317: #endif
        !           318: #endif
        !           319: 
        !           320: #if !defined(HAVE_PTHREAD_ATTR_SETSCOPE) || defined(HAVE_DEC_3_2_THREADS)
        !           321: #define pthread_attr_setscope(A,B)
        !           322: #undef HAVE_GETHOSTBYADDR_R                    /* No definition */
        !           323: #endif
        !           324: 
        !           325: #ifndef HAVE_NONPOSIX_PTHREAD_GETSPECIFIC
        !           326: #define my_pthread_getspecific(A,B) ((A) pthread_getspecific(B))
        !           327: #else
        !           328: #define my_pthread_getspecific(A,B) ((A) my_pthread_getspecific_imp(B))
        !           329: void *my_pthread_getspecific_imp(pthread_key_t key);
        !           330: #endif
        !           331: 
        !           332: #ifndef HAVE_LOCALTIME_R
        !           333: struct tm *localtime_r(const time_t *clock, struct tm *res);
        !           334: #endif
        !           335: 
        !           336: #ifdef HAVE_PTHREAD_CONDATTR_CREATE
        !           337: /* DCE threads on HPUX 10.20 */
        !           338: #define pthread_condattr_init pthread_condattr_create
        !           339: #define pthread_condattr_destroy pthread_condattr_delete
        !           340: #endif
        !           341: 
        !           342: #ifdef HAVE_CTHREADS_WRAPPER                   /* For MacOSX */
        !           343: #define pthread_cond_destroy(A) pthread_dummy(0)
        !           344: #define pthread_mutex_destroy(A) pthread_dummy(0)
        !           345: #define pthread_attr_delete(A) pthread_dummy(0)
        !           346: #define pthread_condattr_delete(A) pthread_dummy(0)
        !           347: #define pthread_attr_setstacksize(A,B) pthread_dummy(0)
        !           348: #define pthread_equal(A,B) ((A) == (B))
        !           349: #define pthread_cond_timedwait(a,b,c) pthread_cond_wait((a),(b))
        !           350: #define pthread_attr_init(A) pthread_attr_create(A)
        !           351: #define pthread_attr_destroy(A) pthread_attr_delete(A)
        !           352: #define pthread_attr_setdetachstate(A,B) pthread_dummy(0)
        !           353: #define pthread_create(A,B,C,D) pthread_create((A),*(B),(C),(D))
        !           354: #define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C))
        !           355: #define pthread_kill(A,B) pthread_dummy(0)
        !           356: #undef pthread_detach_this_thread
        !           357: #define pthread_detach_this_thread() { pthread_t tmp=pthread_self() ; pthread_detach(&tmp); }
        !           358: #endif
        !           359: 
        !           360: #if ((defined(HAVE_PTHREAD_ATTR_CREATE) && !defined(HAVE_SIGWAIT)) || defined(HAVE_DEC_3_2_THREADS)) && !defined(HAVE_CTHREADS_WRAPPER)
        !           361: /* This is set on AIX_3_2 and Siemens unix (and DEC OSF/1 3.2 too) */
        !           362: #define pthread_key_create(A,B) \
        !           363:                pthread_keycreate(A,(B) ?\
        !           364:                                  (pthread_destructor_t) (B) :\
        !           365:                                  (pthread_destructor_t) pthread_dummy)
        !           366: #define pthread_attr_init(A) pthread_attr_create(A)
        !           367: #define pthread_attr_destroy(A) pthread_attr_delete(A)
        !           368: #define pthread_attr_setdetachstate(A,B) pthread_dummy(0)
        !           369: #define pthread_create(A,B,C,D) pthread_create((A),*(B),(C),(D))
        !           370: #ifndef pthread_sigmask
        !           371: #define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C))
        !           372: #endif
        !           373: #define pthread_kill(A,B) pthread_dummy(0)
        !           374: #undef pthread_detach_this_thread
        !           375: #define pthread_detach_this_thread() { pthread_t tmp=pthread_self() ; pthread_detach(&tmp); }
        !           376: #else /* HAVE_PTHREAD_ATTR_CREATE && !HAVE_SIGWAIT */
        !           377: #define HAVE_PTHREAD_KILL
        !           378: #endif
        !           379: 
        !           380: #if defined(HAVE_PTHREAD_ATTR_CREATE) || defined(_AIX) || defined(HAVE_GLIBC2_STYLE_GETHOSTBYNAME_R)
        !           381: #if !defined(HPUX)
        !           382: struct hostent;
        !           383: #endif /* HPUX */
        !           384: struct hostent *my_gethostbyname_r(const char *name,
        !           385:                                   struct hostent *result, char *buffer,
        !           386:                                   int buflen, int *h_errnop);
        !           387: #if defined(HAVE_GLIBC2_STYLE_GETHOSTBYNAME_R)
        !           388: #define GETHOSTBYNAME_BUFF_SIZE 2048
        !           389: #else
        !           390: #define GETHOSTBYNAME_BUFF_SIZE sizeof(struct hostent_data)
        !           391: #endif /* defined(HAVE_GLIBC2_STYLE_GETHOSTBYNAME_R) */
        !           392: 
        !           393: #else
        !           394: #define my_gethostbyname_r(A,B,C,D,E) gethostbyname_r((A),(B),(C),(D),(E))
        !           395: #define GETHOSTBYNAME_BUFF_SIZE 2048
        !           396: #endif /* defined(HAVE_PTHREAD_ATTR_CREATE) || defined(_AIX) || defined(HAVE_GLIBC2_STYLE_GETHOSTBYNAME_R) */
        !           397: 
        !           398: #endif /* defined(__WIN32__) */
        !           399: 
        !           400: /* READ-WRITE thread locking */
        !           401: 
        !           402: #if defined(USE_MUTEX_INSTEAD_OF_RW_LOCKS)
        !           403: /* use these defs for simple mutex locking */
        !           404: #define rw_lock_t pthread_mutex_t
        !           405: #define my_rwlock_init(A,B) pthread_mutex_init((A),(B))
        !           406: #define rw_rdlock(A) pthread_mutex_lock((A))
        !           407: #define rw_wrlock(A) pthread_mutex_lock((A))
        !           408: #define rw_unlock(A) pthread_mutex_unlock((A))
        !           409: #define rwlock_destroy(A) pthread_mutex_destroy((A))
        !           410: #elif defined(HAVE_PTHREAD_RWLOCK_RDLOCK)
        !           411: #define rw_lock_t pthread_rwlock_t
        !           412: #define my_rwlock_init(A,B) pthread_rwlock_init((A),(B))
        !           413: #define rw_rdlock(A) pthread_rwlock_rdlock(A)
        !           414: #define rw_wrlock(A) pthread_rwlock_wrlock(A)
        !           415: #define rw_unlock(A) pthread_rwlock_unlock(A)
        !           416: #define rwlock_destroy(A) pthread_rwlock_destroy(A)
        !           417: #elif defined(HAVE_RWLOCK_INIT)
        !           418: #ifdef HAVE_RWLOCK_T                           /* For example Solaris 2.6-> */
        !           419: #define rw_lock_t rwlock_t
        !           420: #endif
        !           421: #define my_rwlock_init(A,B) rwlock_init((A),USYNC_THREAD,0)
        !           422: #else
        !           423: /* Use our own version of read/write locks */
        !           424: typedef struct _my_rw_lock_t {
        !           425:        pthread_mutex_t lock;           /* lock for structure           */
        !           426:        pthread_cond_t  readers;        /* waiting readers              */
        !           427:        pthread_cond_t  writers;        /* waiting writers              */
        !           428:        int             state;          /* -1:writer,0:free,>0:readers  */
        !           429:        int             waiters;        /* number of waiting writers    */
        !           430: } my_rw_lock_t;
        !           431: 
        !           432: #define rw_lock_t my_rw_lock_t
        !           433: #define rw_rdlock(A) my_rw_rdlock((A))
        !           434: #define rw_wrlock(A) my_rw_wrlock((A))
        !           435: #define rw_unlock(A) my_rw_unlock((A))
        !           436: #define rwlock_destroy(A) my_rwlock_destroy((A))
        !           437: 
        !           438: extern int     my_rwlock_init( my_rw_lock_t *, void * );
        !           439: extern int     my_rwlock_destroy( my_rw_lock_t * );
        !           440: extern int     my_rw_rdlock( my_rw_lock_t * );
        !           441: extern int     my_rw_wrlock( my_rw_lock_t * );
        !           442: extern int     my_rw_unlock( my_rw_lock_t * );
        !           443: #endif /* USE_MUTEX_INSTEAD_OF_RW_LOCKS */
        !           444: 
        !           445: #define GETHOSTBYADDR_BUFF_SIZE 2048
        !           446: 
        !           447: #ifndef HAVE_THR_SETCONCURRENCY
        !           448: #define thr_setconcurrency(A) pthread_dummy(0)
        !           449: #endif
        !           450: #if !defined(HAVE_PTHREAD_ATTR_SETSTACKSIZE) && ! defined(pthread_attr_setstacksize)
        !           451: #define pthread_attr_setstacksize(A,B) pthread_dummy(0)
        !           452: #endif
        !           453: 
        !           454: extern my_bool my_thread_global_init(void);
        !           455: extern void my_thread_global_end(void);
        !           456: extern my_bool my_thread_init(void);
        !           457: extern void my_thread_end(void);
        !           458: extern char *my_thread_name(void);
        !           459: extern long my_thread_id(void);
        !           460: extern int pthread_no_free(void *);
        !           461: extern int pthread_dummy(int);
        !           462: 
        !           463: /* All thread specific variables are in the following struct */
        !           464: 
        !           465: #define THREAD_NAME_SIZE 10
        !           466: 
        !           467: struct st_my_thread_var
        !           468: {
        !           469:   int thr_errno;
        !           470:   int cmp_length;
        !           471:   volatile int abort;
        !           472:   long id;
        !           473:   pthread_cond_t suspend, *current_cond;
        !           474:   pthread_mutex_t mutex,  *current_mutex;
        !           475:   pthread_t pthread_self;
        !           476: #ifndef DBUG_OFF
        !           477:   char name[THREAD_NAME_SIZE+1];
        !           478:   gptr dbug;
        !           479: #endif
        !           480: };
        !           481: 
        !           482: extern struct st_my_thread_var *_my_thread_var(void) __attribute__ ((const));
        !           483: #define my_thread_var (_my_thread_var())
        !           484: #define my_errno my_thread_var->thr_errno
        !           485: 
        !           486:        /* This is only used for not essential statistic */
        !           487: 
        !           488: #ifndef thread_safe_increment
        !           489: #ifdef SAFE_STATISTICS
        !           490: #define thread_safe_increment(V,L) \
        !           491:        pthread_mutex_lock((L)); (V)++; pthread_mutex_unlock((L));
        !           492: #define thread_safe_add(V,C,L) \
        !           493:        pthread_mutex_lock((L)); (V)+=(C); pthread_mutex_unlock((L));
        !           494: #else
        !           495: #define thread_safe_increment(V,L) (V)++
        !           496: #define thread_safe_add(V,C,L) (V)+=(C)
        !           497: #endif
        !           498: #endif /* thread_safe_increment */
        !           499: 
        !           500: #endif /* _my_ptread_h */

E-mail: