xref: /minix3/minix/lib/libmthread/pthread_compat.c (revision 433d6423c39e34ec4b79c950597bb2d236f886be)
1*433d6423SLionel Sambuc #define _MTHREADIFY_PTHREADS
2*433d6423SLionel Sambuc #include <minix/mthread.h>
3*433d6423SLionel Sambuc #include "global.h"
4*433d6423SLionel Sambuc #include "proto.h"
5*433d6423SLionel Sambuc 
6*433d6423SLionel Sambuc /* WARNING:
7*433d6423SLionel Sambuc  * The following works under the hypothesis that we have only green threads,
8*433d6423SLionel Sambuc  * which implies that we have no preemption, unless explicit yield or possible
9*433d6423SLionel Sambuc  * calls done to mthread functions.
10*433d6423SLionel Sambuc  *
11*433d6423SLionel Sambuc  * This has impact on the fact we do not maintain a table of currently being
12*433d6423SLionel Sambuc  * initialized mutexes or condition variables, to prevent double initialization
13*433d6423SLionel Sambuc  * and/or TOCTU problems. TOCTU could appear between the test against the
14*433d6423SLionel Sambuc  * initializer value, and the actual initialization, which could lead to double
15*433d6423SLionel Sambuc  * initialization of the same mutex AND get two threads at the same time in the
16*433d6423SLionel Sambuc  * critical section as they both hold a (different) mutex.
17*433d6423SLionel Sambuc  */
18*433d6423SLionel Sambuc 
19*433d6423SLionel Sambuc 
20*433d6423SLionel Sambuc /*===========================================================================*
21*433d6423SLionel Sambuc  *				pthread_mutex_init			     *
22*433d6423SLionel Sambuc  *===========================================================================*/
pthread_mutex_init(pthread_mutex_t * mutex,pthread_mutexattr_t * mattr)23*433d6423SLionel Sambuc int pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutexattr_t *mattr)
24*433d6423SLionel Sambuc {
25*433d6423SLionel Sambuc 	return mthread_mutex_init(mutex, mattr);
26*433d6423SLionel Sambuc }
27*433d6423SLionel Sambuc 
28*433d6423SLionel Sambuc /*===========================================================================*
29*433d6423SLionel Sambuc  *				pthread_mutex_destroy			     *
30*433d6423SLionel Sambuc  *===========================================================================*/
pthread_mutex_destroy(pthread_mutex_t * mutex)31*433d6423SLionel Sambuc int pthread_mutex_destroy(pthread_mutex_t *mutex)
32*433d6423SLionel Sambuc {
33*433d6423SLionel Sambuc 	if (PTHREAD_MUTEX_INITIALIZER == *mutex) {
34*433d6423SLionel Sambuc 		*mutex = NULL;
35*433d6423SLionel Sambuc 		return 0;
36*433d6423SLionel Sambuc 	}
37*433d6423SLionel Sambuc 
38*433d6423SLionel Sambuc 	return mthread_mutex_destroy(mutex);
39*433d6423SLionel Sambuc }
40*433d6423SLionel Sambuc 
41*433d6423SLionel Sambuc /*===========================================================================*
42*433d6423SLionel Sambuc  *				pthread_mutex_lock			     *
43*433d6423SLionel Sambuc  *===========================================================================*/
pthread_mutex_lock(pthread_mutex_t * mutex)44*433d6423SLionel Sambuc int pthread_mutex_lock(pthread_mutex_t *mutex)
45*433d6423SLionel Sambuc {
46*433d6423SLionel Sambuc 	if (PTHREAD_MUTEX_INITIALIZER == *mutex) {
47*433d6423SLionel Sambuc 		mthread_mutex_init(mutex, NULL);
48*433d6423SLionel Sambuc 	}
49*433d6423SLionel Sambuc 
50*433d6423SLionel Sambuc 	return mthread_mutex_lock(mutex);
51*433d6423SLionel Sambuc }
52*433d6423SLionel Sambuc 
53*433d6423SLionel Sambuc /*===========================================================================*
54*433d6423SLionel Sambuc  *				pthread_mutex_trylock			     *
55*433d6423SLionel Sambuc  *===========================================================================*/
pthread_mutex_trylock(pthread_mutex_t * mutex)56*433d6423SLionel Sambuc int pthread_mutex_trylock(pthread_mutex_t *mutex)
57*433d6423SLionel Sambuc {
58*433d6423SLionel Sambuc 	if (PTHREAD_MUTEX_INITIALIZER == *mutex) {
59*433d6423SLionel Sambuc 		mthread_mutex_init(mutex, NULL);
60*433d6423SLionel Sambuc 	}
61*433d6423SLionel Sambuc 
62*433d6423SLionel Sambuc 	return pthread_mutex_trylock(mutex);
63*433d6423SLionel Sambuc }
64*433d6423SLionel Sambuc 
65*433d6423SLionel Sambuc /*===========================================================================*
66*433d6423SLionel Sambuc  *				pthread_mutex_unlock			     *
67*433d6423SLionel Sambuc  *===========================================================================*/
pthread_mutex_unlock(pthread_mutex_t * mutex)68*433d6423SLionel Sambuc int pthread_mutex_unlock(pthread_mutex_t *mutex)
69*433d6423SLionel Sambuc {
70*433d6423SLionel Sambuc 	if (PTHREAD_MUTEX_INITIALIZER == *mutex) {
71*433d6423SLionel Sambuc 		mthread_mutex_init(mutex, NULL);
72*433d6423SLionel Sambuc 	}
73*433d6423SLionel Sambuc 
74*433d6423SLionel Sambuc 	return mthread_mutex_unlock(mutex);
75*433d6423SLionel Sambuc }
76*433d6423SLionel Sambuc 
77*433d6423SLionel Sambuc /*===========================================================================*
78*433d6423SLionel Sambuc  *				pthread_cond_init			     *
79*433d6423SLionel Sambuc  *===========================================================================*/
pthread_cond_init(pthread_cond_t * cond,pthread_condattr_t * cattr)80*433d6423SLionel Sambuc int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cattr)
81*433d6423SLionel Sambuc {
82*433d6423SLionel Sambuc 	return mthread_cond_init(cond, cattr);
83*433d6423SLionel Sambuc }
84*433d6423SLionel Sambuc 
85*433d6423SLionel Sambuc /*===========================================================================*
86*433d6423SLionel Sambuc  *				pthread_cond_broadcast			     *
87*433d6423SLionel Sambuc  *===========================================================================*/
pthread_cond_broadcast(pthread_cond_t * cond)88*433d6423SLionel Sambuc int pthread_cond_broadcast(pthread_cond_t *cond)
89*433d6423SLionel Sambuc {
90*433d6423SLionel Sambuc 	if (PTHREAD_COND_INITIALIZER == *cond) {
91*433d6423SLionel Sambuc 		mthread_cond_init(cond, NULL);
92*433d6423SLionel Sambuc 	}
93*433d6423SLionel Sambuc 
94*433d6423SLionel Sambuc 	return mthread_cond_broadcast(cond);
95*433d6423SLionel Sambuc }
96*433d6423SLionel Sambuc 
97*433d6423SLionel Sambuc /*===========================================================================*
98*433d6423SLionel Sambuc  *				pthread_cond_destroy			     *
99*433d6423SLionel Sambuc  *===========================================================================*/
pthread_cond_destroy(pthread_cond_t * cond)100*433d6423SLionel Sambuc int pthread_cond_destroy(pthread_cond_t *cond)
101*433d6423SLionel Sambuc {
102*433d6423SLionel Sambuc 	if (PTHREAD_COND_INITIALIZER == *cond) {
103*433d6423SLionel Sambuc 		*cond = NULL;
104*433d6423SLionel Sambuc 		return 0;
105*433d6423SLionel Sambuc 	}
106*433d6423SLionel Sambuc 
107*433d6423SLionel Sambuc 	return mthread_cond_destroy(cond);
108*433d6423SLionel Sambuc }
109*433d6423SLionel Sambuc 
110*433d6423SLionel Sambuc /*===========================================================================*
111*433d6423SLionel Sambuc  *				pthread_cond_signal			     *
112*433d6423SLionel Sambuc  *===========================================================================*/
pthread_cond_signal(pthread_cond_t * cond)113*433d6423SLionel Sambuc int pthread_cond_signal(pthread_cond_t *cond)
114*433d6423SLionel Sambuc {
115*433d6423SLionel Sambuc 	if (PTHREAD_COND_INITIALIZER == *cond) {
116*433d6423SLionel Sambuc 		mthread_cond_init(cond, NULL);
117*433d6423SLionel Sambuc 	}
118*433d6423SLionel Sambuc 
119*433d6423SLionel Sambuc 	return mthread_cond_signal(cond);
120*433d6423SLionel Sambuc }
121*433d6423SLionel Sambuc 
122*433d6423SLionel Sambuc /*===========================================================================*
123*433d6423SLionel Sambuc  *				pthread_cond_wait			     *
124*433d6423SLionel Sambuc  *===========================================================================*/
pthread_cond_wait(pthread_cond_t * cond,pthread_mutex_t * mutex)125*433d6423SLionel Sambuc int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
126*433d6423SLionel Sambuc {
127*433d6423SLionel Sambuc 	if (PTHREAD_COND_INITIALIZER == *cond) {
128*433d6423SLionel Sambuc 		mthread_cond_init(cond, NULL);
129*433d6423SLionel Sambuc 	}
130*433d6423SLionel Sambuc 
131*433d6423SLionel Sambuc 	return mthread_cond_wait(cond, mutex);
132*433d6423SLionel Sambuc }
133*433d6423SLionel Sambuc 
134*433d6423SLionel Sambuc /*===========================================================================*
135*433d6423SLionel Sambuc  *				pthread_rwlock_init			     *
136*433d6423SLionel Sambuc  *===========================================================================*/
pthread_rwlock_init(pthread_rwlock_t * rwlock,pthread_rwlockattr_t * UNUSED (attr))137*433d6423SLionel Sambuc int pthread_rwlock_init(pthread_rwlock_t *rwlock, pthread_rwlockattr_t *UNUSED(attr))
138*433d6423SLionel Sambuc {
139*433d6423SLionel Sambuc 	return mthread_rwlock_init(rwlock);
140*433d6423SLionel Sambuc }
141*433d6423SLionel Sambuc 
142*433d6423SLionel Sambuc #if !defined(__weak_alias)
143*433d6423SLionel Sambuc #error __weak_alias is required to compile the pthread compat library
144*433d6423SLionel Sambuc #endif
145*433d6423SLionel Sambuc 
146