Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <errno.h>
00011
00012 #if Solaris2
00013 #include <synch.h>
00014 #include <thread.h>
00015 #endif
00016
00017 #if SunOS4_1
00018 #include <lwp/lwp.h>
00019 #include <lwp/lwpmachdep.h>
00020 #include <lwp/stackdep.h>
00021 #define USYNC_THREAD 0
00022 #endif
00023
00024 #if alpha || PTHREAD
00025 #include <pthread.h>
00026 #undef CATCH
00027 #define USYNC_THREAD 0
00028 #endif
00029
00030 struct thread_arg {
00031 context *newctx;
00032 pointer form;
00033 pointer func;
00034 pointer arg;};
00035
00036
00037
00038
00039
00040
00041 #ifdef __cplusplus
00042 extern "C" {
00043 #endif
00044
00045
00046 #if SunOS4_1
00047
00048 typedef mon_t mutex_t;
00049 typedef cv_t cond_t;
00050
00051
00052 #define USYNC_THREAD 0
00053 #define THR_SUSPENDED LWPSUSPEND
00054 #define thr_exit(x) pod_exit(x)
00055 #define thr_join(x,y,z) lwp_join(x)
00056 #define mutex_init(x,y,z) mon_create(x)
00057 #define mutex_destroy(x) mon_destroy(*(x))
00058 #define mutex_lock(x) mon_enter(*(x))
00059 #define mutex_unlock(x) mon_exit(*(x))
00060 #define mutex_trylock(x) mon_cond_enter(*(x))
00061 #define cond_init(x,y) cv_create(x,*(y))
00062 #define cond_destroy(x) cv_destroy(*(x))
00063 #define cond_wait(x,y) cv_wait(*(x))
00064 #define cond_signal(x) cv_notify(*(x))
00065 #define cond_broadcast(x) cv_broadcast(*(x))
00066 #endif
00067
00068
00069
00070
00071 #if alpha || PTHREAD
00072 #ifndef __COLLECTOR_H
00073 typedef pthread_t thread_t;
00074 typedef pthread_mutex_t mutex_t;
00075 typedef pthread_cond_t cond_t;
00076 #define thr_exit(x) pthread_exit(x)
00077 #define thr_join(x,y,z) pthread_join(x,z)
00078 #define mutex_init(x,y,z) pthread_mutex_init(x,y)
00079 #define mutex_lock pthread_mutex_lock
00080 #define mutex_trylock pthread_mutex_trylock
00081 #define mutex_unlock pthread_mutex_unlock
00082 #define cond_wait pthread_cond_wait
00083 #define cond_signal pthread_cond_signal
00084 #define cond_broadcast pthread_cond_broadcast
00085 #endif
00086 #endif
00087
00088
00089
00090
00091
00092
00093 #if !Solaris2
00094
00095
00096 typedef struct _sema {
00097 unsigned int count;
00098 mutex_t lock;
00099 cond_t cond;
00100 } sema_t;
00101 typedef struct _rwlock {
00102 unsigned int readers;
00103 mutex_t lock;
00104 cond_t r_cond;
00105 cond_t w_cond;
00106 } rwlock_t;
00107
00108
00109
00110 extern unsigned int thr_self();
00111 extern int thr_getprio(int tid, int *prio);
00112 extern int thr_create(void *, size_t, void (*)(), void *, long, int *);
00113 extern int thr_setprio(int, int);
00114 extern int thr_continue(int);
00115 extern int thr_suspend(int);
00116 extern int thr_kill(int, int);
00117
00118
00119 extern int rwlock_init(rwlock_t *, int, void *);
00120 extern int rwlock_destroy(rwlock_t *);
00121 extern int rw_rdlock(rwlock_t *);
00122 extern int rw_wrlock(rwlock_t *);
00123 extern int rw_unlock(rwlock_t *);
00124
00125
00126 extern int sema_init(sema_t *, unsigned int, int, void *);
00127 extern int sema_destroy(sema_t *);
00128 extern int sema_port(sema_t *);
00129 extern int sema_wait(sema_t *);
00130 extern int sema_trywait(sema_t *);
00131
00132 extern int mthread(context *ctx, pointer mod);
00133 #endif
00134 #if PTHREAD
00135 extern int sema_post(sema_t *sem);
00136 extern void mthread_init( context *mainctx );
00137 #endif
00138
00139
00140
00141
00142
00143
00144 extern mutex_t mark_lock;
00145 extern char *mark_locking;
00146 extern int mark_lock_thread;
00147
00148 extern rwlock_t gc_lock;
00149
00150 extern mutex_t alloc_lock;
00151 extern mutex_t free_thread_lock;
00152 extern mutex_t qthread_lock;
00153 extern mutex_t qsort_lock;
00154 extern sema_t free_thread_sem;
00155 #ifdef __cplusplus
00156 }
00157 #endif