43
43
#define pthread_key(T,V) pthread_key_t V
44
#define my_pthread_getspecific_ptr(T,V) my_pthread_getspecific(T,(V))
45
#define my_pthread_setspecific_ptr(T,V) pthread_setspecific(T,(void*) (V))
46
#define pthread_detach_this_thread()
47
#define pthread_handler_t EXTERNC void *
44
#define pthread_handler_t void *
48
45
typedef void *(* pthread_handler)(void *);
50
/* Test first for RTS or FSU threads */
52
#if defined(PTHREAD_SCOPE_GLOBAL) && !defined(PTHREAD_SCOPE_SYSTEM)
53
#define HAVE_rts_threads
54
extern int my_pthread_create_detached;
55
#define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C))
56
#define PTHREAD_CREATE_DETACHED &my_pthread_create_detached
57
#define PTHREAD_SCOPE_SYSTEM PTHREAD_SCOPE_GLOBAL
58
#define PTHREAD_SCOPE_PROCESS PTHREAD_SCOPE_LOCAL
59
#define USE_ALARM_THREAD
60
#endif /* defined(PTHREAD_SCOPE_GLOBAL) && !defined(PTHREAD_SCOPE_SYSTEM) */
62
#ifndef HAVE_NONPOSIX_SIGWAIT
63
#define my_sigwait(A,B) sigwait((A),(B))
65
int my_sigwait(const sigset_t *set,int *sig);
68
#ifdef HAVE_NONPOSIX_PTHREAD_MUTEX_INIT
69
#define pthread_mutex_init(a,b) my_pthread_mutex_init((a),(b))
70
extern int my_pthread_mutex_init(pthread_mutex_t *mp,
71
const pthread_mutexattr_t *attr);
72
#define pthread_cond_init(a,b) my_pthread_cond_init((a),(b))
73
extern int my_pthread_cond_init(pthread_cond_t *mp,
74
const pthread_condattr_t *attr);
75
#endif /* HAVE_NONPOSIX_PTHREAD_MUTEX_INIT */
77
#if defined(HAVE_SIGTHREADMASK) && !defined(HAVE_PTHREAD_SIGMASK)
78
#define pthread_sigmask(A,B,C) sigthreadmask((A),(B),(C))
81
#if !defined(HAVE_SIGWAIT) && !defined(HAVE_rts_threads) && !defined(sigwait) && !defined(alpha_linux_port) && !defined(HAVE_NONPOSIX_SIGWAIT)
82
int sigwait(sigset_t *setp, int *sigp); /* Use our implemention */
87
We define my_sigset() and use that instead of the system sigset() so that
88
we can favor an implementation based on sigaction(). On some systems, such
89
as Mac OS X, sigset() results in flags such as SA_RESTART being set, and
90
we want to make sure that no such flags are set.
92
#if defined(HAVE_SIGACTION) && !defined(my_sigset)
93
#define my_sigset(A,B) do { struct sigaction l_s; sigset_t l_set; int l_rc; \
95
sigemptyset(&l_set); \
96
l_s.sa_handler = (B); \
97
l_s.sa_mask = l_set; \
99
l_rc= sigaction((A), &l_s, (struct sigaction *) NULL);\
102
#elif defined(HAVE_SIGSET) && !defined(my_sigset)
103
#define my_sigset(A,B) sigset((A),(B))
104
#elif !defined(my_sigset)
105
#define my_sigset(A,B) signal((A),(B))
108
#ifndef my_pthread_setprio
109
#if defined(HAVE_PTHREAD_SETPRIO_NP) /* FSU threads */
110
#define my_pthread_setprio(A,B) pthread_setprio_np((A),(B))
111
#elif defined(HAVE_PTHREAD_SETPRIO)
112
#define my_pthread_setprio(A,B) pthread_setprio((A),(B))
114
extern void my_pthread_setprio(pthread_t thread_id,int prior);
118
47
#ifndef my_pthread_attr_setprio
119
48
#ifdef HAVE_PTHREAD_ATTR_SETPRIO
120
49
#define my_pthread_attr_setprio(A,B) pthread_attr_setprio((A),(B))
126
#if !defined(HAVE_PTHREAD_ATTR_SETSCOPE)
127
#define pthread_attr_setscope(A,B)
130
#if defined(HAVE_BROKEN_PTHREAD_COND_TIMEDWAIT)
131
extern int my_pthread_cond_timedwait(pthread_cond_t *cond,
132
pthread_mutex_t *mutex,
133
struct timespec *abstime);
134
#define pthread_cond_timedwait(A,B,C) my_pthread_cond_timedwait((A),(B),(C))
138
#if !defined(HAVE_PTHREAD_KEY_DELETE) && !defined(pthread_key_delete)
139
#define pthread_key_delete(A) pthread_dummy(0)
142
#ifdef HAVE_CTHREADS_WRAPPER /* For MacOSX */
143
#define pthread_cond_destroy(A) pthread_dummy(0)
144
#define pthread_mutex_destroy(A) pthread_dummy(0)
145
#define pthread_attr_delete(A) pthread_dummy(0)
146
#define pthread_condattr_delete(A) pthread_dummy(0)
147
#define pthread_attr_setstacksize(A,B) pthread_dummy(0)
148
#define pthread_equal(A,B) ((A) == (B))
149
#define pthread_cond_timedwait(a,b,c) pthread_cond_wait((a),(b))
150
#define pthread_attr_init(A) pthread_attr_create(A)
151
#define pthread_attr_destroy(A) pthread_attr_delete(A)
152
#define pthread_attr_setdetachstate(A,B) pthread_dummy(0)
153
#define pthread_create(A,B,C,D) pthread_create((A),*(B),(C),(D))
154
#define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C))
155
#define pthread_kill(A,B) pthread_dummy((A) ? 0 : ESRCH)
156
#undef pthread_detach_this_thread
157
#define pthread_detach_this_thread() { pthread_t tmp=pthread_self() ; pthread_detach(&tmp); }
160
#ifdef HAVE_DARWIN5_THREADS
161
#define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C))
162
#define pthread_kill(A,B) pthread_dummy((A) ? 0 : ESRCH)
163
#define pthread_condattr_init(A) pthread_dummy(0)
164
#define pthread_condattr_destroy(A) pthread_dummy(0)
165
#undef pthread_detach_this_thread
166
#define pthread_detach_this_thread() { pthread_t tmp=pthread_self() ; pthread_detach(tmp); }
169
#if (defined(HAVE_PTHREAD_ATTR_CREATE) && !defined(HAVE_SIGWAIT))
170
/* This is set on AIX_3_2 and Siemens unix (and DEC OSF/1 3.2 too) */
171
#define pthread_key_create(A,B) \
172
pthread_keycreate(A,(B) ?\
173
(pthread_destructor_t) (B) :\
174
(pthread_destructor_t) pthread_dummy)
175
#define pthread_attr_init(A) pthread_attr_create(A)
176
#define pthread_attr_destroy(A) pthread_attr_delete(A)
177
#define pthread_attr_setdetachstate(A,B) pthread_dummy(0)
178
#define pthread_create(A,B,C,D) pthread_create((A),*(B),(C),(D))
179
#ifndef pthread_sigmask
180
#define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C))
182
#define pthread_kill(A,B) pthread_dummy((A) ? 0 : ESRCH)
183
#undef pthread_detach_this_thread
184
#define pthread_detach_this_thread() { pthread_t tmp=pthread_self() ; pthread_detach(&tmp); }
186
#define HAVE_PTHREAD_KILL
189
#if defined(HAVE_POSIX1003_4a_MUTEX) && !defined(DONT_REMAP_PTHREAD_FUNCTIONS)
190
#undef pthread_mutex_trylock
191
#define pthread_mutex_trylock(a) my_pthread_mutex_trylock((a))
192
int my_pthread_mutex_trylock(pthread_mutex_t *mutex);
195
55
#if !defined(HAVE_PTHREAD_YIELD_ONE_ARG) && !defined(HAVE_PTHREAD_YIELD_ZERO_ARG)
196
56
/* no pthread_yield() available */
197
57
#ifdef HAVE_SCHED_YIELD
249
91
pthread_mutex_t global,mutex;
255
97
int safe_mutex_init(safe_mutex_t *mp, const pthread_mutexattr_t *attr,
256
const char *file, uint line);
257
int safe_mutex_lock(safe_mutex_t *mp, bool try_lock, const char *file, uint line);
258
int safe_mutex_unlock(safe_mutex_t *mp,const char *file, uint line);
259
int safe_mutex_destroy(safe_mutex_t *mp,const char *file, uint line);
98
const char *file, uint32_t line);
99
int safe_mutex_lock(safe_mutex_t *mp, bool try_lock, const char *file, uint32_t line);
100
int safe_mutex_unlock(safe_mutex_t *mp,const char *file, uint32_t line);
101
int safe_mutex_destroy(safe_mutex_t *mp,const char *file, uint32_t line);
260
102
int safe_cond_wait(pthread_cond_t *cond, safe_mutex_t *mp,const char *file,
262
104
int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp,
263
struct timespec *abstime, const char *file, uint line);
105
struct timespec *abstime, const char *file, uint32_t line);
264
106
void safe_mutex_global_init(void);
265
void safe_mutex_end(FILE *file);
107
void safe_mutex_end(void);
267
109
/* Wrappers if safe mutex is actually used */
268
110
#define safe_mutex_assert_owner(mp)
269
111
#define safe_mutex_assert_not_owner(mp)
271
#if defined(MY_PTHREAD_FASTMUTEX)
272
typedef struct st_my_pthread_fastmutex_t
274
pthread_mutex_t mutex;
276
} my_pthread_fastmutex_t;
277
void fastmutex_global_init(void);
279
int my_pthread_fastmutex_init(my_pthread_fastmutex_t *mp,
280
const pthread_mutexattr_t *attr);
281
int my_pthread_fastmutex_lock(my_pthread_fastmutex_t *mp);
283
#undef pthread_mutex_init
284
#undef pthread_mutex_lock
285
#undef pthread_mutex_unlock
286
#undef pthread_mutex_destroy
287
#undef pthread_mutex_wait
288
#undef pthread_mutex_timedwait
289
#undef pthread_mutex_t
290
#undef pthread_cond_wait
291
#undef pthread_cond_timedwait
292
#undef pthread_mutex_trylock
293
#define pthread_mutex_init(A,B) my_pthread_fastmutex_init((A),(B))
294
#define pthread_mutex_lock(A) my_pthread_fastmutex_lock(A)
295
#define pthread_mutex_unlock(A) pthread_mutex_unlock(&(A)->mutex)
296
#define pthread_mutex_destroy(A) pthread_mutex_destroy(&(A)->mutex)
297
#define pthread_cond_wait(A,B) pthread_cond_wait((A),&(B)->mutex)
298
#define pthread_cond_timedwait(A,B,C) pthread_cond_timedwait((A),&(B)->mutex,(C))
299
#define pthread_mutex_trylock(A) pthread_mutex_trylock(&(A)->mutex)
300
#define pthread_mutex_t my_pthread_fastmutex_t
301
#endif /* defined(MY_PTHREAD_FASTMUTEX) */
303
113
/* READ-WRITE thread locking */
305
#ifdef HAVE_BROKEN_RWLOCK /* For OpenUnix */
306
#undef HAVE_PTHREAD_RWLOCK_RDLOCK
307
#undef HAVE_RWLOCK_INIT
311
#if defined(USE_MUTEX_INSTEAD_OF_RW_LOCKS)
312
/* use these defs for simple mutex locking */
313
#define rw_lock_t pthread_mutex_t
314
#define my_rwlock_init(A,B) pthread_mutex_init((A),(B))
315
#define rw_rdlock(A) pthread_mutex_lock((A))
316
#define rw_wrlock(A) pthread_mutex_lock((A))
317
#define rw_tryrdlock(A) pthread_mutex_trylock((A))
318
#define rw_trywrlock(A) pthread_mutex_trylock((A))
319
#define rw_unlock(A) pthread_mutex_unlock((A))
320
#define rwlock_destroy(A) pthread_mutex_destroy((A))
321
#elif defined(HAVE_PTHREAD_RWLOCK_RDLOCK)
322
#define rw_lock_t pthread_rwlock_t
323
#define my_rwlock_init(A,B) pthread_rwlock_init((A),(B))
324
#define rw_rdlock(A) pthread_rwlock_rdlock(A)
325
#define rw_wrlock(A) pthread_rwlock_wrlock(A)
326
#define rw_tryrdlock(A) pthread_rwlock_tryrdlock((A))
327
#define rw_trywrlock(A) pthread_rwlock_trywrlock((A))
328
#define rw_unlock(A) pthread_rwlock_unlock(A)
329
#define rwlock_destroy(A) pthread_rwlock_destroy(A)
330
#elif defined(HAVE_RWLOCK_INIT)
331
#ifdef HAVE_RWLOCK_T /* For example Solaris 2.6-> */
332
#define rw_lock_t rwlock_t
334
#define my_rwlock_init(A,B) rwlock_init((A),USYNC_THREAD,0)
336
/* Use our own version of read/write locks */
337
typedef struct _my_rw_lock_t {
338
pthread_mutex_t lock; /* lock for structure */
339
pthread_cond_t readers; /* waiting readers */
340
pthread_cond_t writers; /* waiting writers */
341
int state; /* -1:writer,0:free,>0:readers */
342
int waiters; /* number of waiting writers */
345
#define rw_lock_t my_rw_lock_t
346
#define rw_rdlock(A) my_rw_rdlock((A))
347
#define rw_wrlock(A) my_rw_wrlock((A))
348
#define rw_tryrdlock(A) my_rw_tryrdlock((A))
349
#define rw_trywrlock(A) my_rw_trywrlock((A))
350
#define rw_unlock(A) my_rw_unlock((A))
351
#define rwlock_destroy(A) my_rwlock_destroy((A))
353
extern int my_rwlock_init(my_rw_lock_t *, void *);
354
extern int my_rwlock_destroy(my_rw_lock_t *);
355
extern int my_rw_rdlock(my_rw_lock_t *);
356
extern int my_rw_wrlock(my_rw_lock_t *);
357
extern int my_rw_unlock(my_rw_lock_t *);
358
extern int my_rw_tryrdlock(my_rw_lock_t *);
359
extern int my_rw_trywrlock(my_rw_lock_t *);
360
#endif /* USE_MUTEX_INSTEAD_OF_RW_LOCKS */
362
#ifndef HAVE_THR_SETCONCURRENCY
363
#define thr_setconcurrency(A) pthread_dummy(0)
365
115
#if !defined(HAVE_PTHREAD_ATTR_SETSTACKSIZE) && ! defined(pthread_attr_setstacksize)
366
116
#define pthread_attr_setstacksize(A,B) pthread_dummy(0)
369
119
/* Define mutex types, see my_thr_init.c */
370
#define MY_MUTEX_INIT_SLOW NULL
371
#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
120
#ifdef THREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
372
121
extern pthread_mutexattr_t my_fast_mutexattr;
373
122
#define MY_MUTEX_INIT_FAST &my_fast_mutexattr
375
124
#define MY_MUTEX_INIT_FAST NULL
377
#ifdef PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
378
extern pthread_mutexattr_t my_errorcheck_mutexattr;
379
#define MY_MUTEX_INIT_ERRCHK &my_errorcheck_mutexattr
381
#define MY_MUTEX_INIT_ERRCHK NULL
385
128
/* Define it to something */
389
typedef ulong my_thread_id;
391
132
extern bool my_thread_global_init(void);
392
133
extern void my_thread_global_end(void);
393
134
extern bool my_thread_init(void);
394
135
extern void my_thread_end(void);
395
136
extern const char *my_thread_name(void);
396
extern my_thread_id my_thread_dbug_id(void);
398
138
/* All thread specific variables are in the following struct */
400
#define THREAD_NAME_SIZE 10
401
#ifndef DEFAULT_THREAD_STACK
404
MySQL can survive with 32K, but some glibc libraries require > 128K stack
405
To resolve hostnames. Also recursive stored procedures needs stack.
141
Drizzle can survive with 32K, but some glibc libraries require > 128K stack
142
to resolve hostnames. Also recursive stored procedures needs stack.
407
#define DEFAULT_THREAD_STACK (256*1024L)
409
#define DEFAULT_THREAD_STACK (192*1024)
144
#define DEFAULT_THREAD_STACK (256*INT32_C(1024))
413
146
struct st_my_thread_var