07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #ifndef THREADS_H
#define THREADS_H
#include "machine.h"
#include "interpret.h"
|
a7fef4 | 1997-09-03 | Per Hedbor | | #include "object.h"
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #include "error.h"
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | #ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif /* HAVE_SYS_TYPES_H */
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #ifdef _REENTRANT
|
b2a0fb | 1997-02-06 | Henrik Grubbström (Grubba) | |
#ifdef _UNIX_THREADS
|
97ffe4 | 1997-01-26 | Per Hedbor | | #ifdef HAVE_THREAD_H
#define UNIX_THREADS
#include <thread.h>
#undef HAVE_PTHREAD_H
#undef HAVE_THREAD_H
#endif
|
b2a0fb | 1997-02-06 | Henrik Grubbström (Grubba) | | #endif /* _UNIX_THREADS */
|
97ffe4 | 1997-01-26 | Per Hedbor | |
|
b2a0fb | 1997-02-06 | Henrik Grubbström (Grubba) | | #ifdef _MIT_POSIX_THREADS
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #ifdef HAVE_PTHREAD_H
|
97ffe4 | 1997-01-26 | Per Hedbor | | #define POSIX_THREADS
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #include <pthread.h>
#undef HAVE_PTHREAD_H
#endif
|
b2a0fb | 1997-02-06 | Henrik Grubbström (Grubba) | | #endif /* _MIT_POSIX_THREADS */
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | |
|
b2a0fb | 1997-02-06 | Henrik Grubbström (Grubba) | | #ifdef _SGI_SPROC_THREADS
|
5377b9 | 1997-02-01 | Henrik Grubbström (Grubba) | |
|
b2a0fb | 1997-02-06 | Henrik Grubbström (Grubba) | | #undef SGI_SPROC_THREADS
|
5377b9 | 1997-02-01 | Henrik Grubbström (Grubba) | | #undef HAVE_SPROC
|
b2a0fb | 1997-02-06 | Henrik Grubbström (Grubba) | | #endif /* _SGI_SPROC_THREADS */
|
97ffe4 | 1997-01-26 | Per Hedbor | |
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | extern int num_threads;
|
6d1a5e | 1996-10-07 | Fredrik Hübinette (Hubbe) | | struct object;
extern struct object *thread_id;
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | |
|
97ffe4 | 1997-01-26 | Per Hedbor | | #define DEFINE_MUTEX(X) MUTEX_T X
#ifdef POSIX_THREADS
#define THREAD_T pthread_t
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #define MUTEX_T pthread_mutex_t
#define mt_init(X) pthread_mutex_init((X),0)
#define mt_lock(X) pthread_mutex_lock(X)
#define mt_trylock(X) pthread_mutex_trylock(X)
#define mt_unlock(X) pthread_mutex_unlock(X)
#define mt_destroy(X) pthread_mutex_destroy(X)
|
97ffe4 | 1997-01-26 | Per Hedbor | |
#define th_setconcurrency(X)
|
5377b9 | 1997-02-01 | Henrik Grubbström (Grubba) | | #ifdef HAVE_PTHREAD_YIELD
#define th_yield() pthread_yield()
#else
|
97ffe4 | 1997-01-26 | Per Hedbor | | #define th_yield()
|
5377b9 | 1997-02-01 | Henrik Grubbström (Grubba) | | #endif /* HAVE_PTHREAD_YIELD */
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | |
#define th_create(ID,fun,arg) pthread_create(ID,&pattr,fun,arg)
#define th_exit(foo) pthread_exit(foo)
|
a70bd0 | 1996-12-15 | Niels Möller | | #define th_self() pthread_self()
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | |
|
5377b9 | 1997-02-01 | Henrik Grubbström (Grubba) | | #ifdef HAVE_PTHREAD_COND_INIT
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #define COND_T pthread_cond_t
|
5377b9 | 1997-02-01 | Henrik Grubbström (Grubba) | |
#ifdef HAVE_PTHREAD_CONDATTR_DEFAULT
#define co_init(X) pthread_cond_init((X), pthread_condattr_default)
#else
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #define co_init(X) pthread_cond_init((X), 0)
|
5377b9 | 1997-02-01 | Henrik Grubbström (Grubba) | | #endif /* HAVE_PTHREAD_CONDATTR_DEFAULT */
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #define co_wait(COND, MUTEX) pthread_cond_wait((COND), (MUTEX))
#define co_signal(X) pthread_cond_signal(X)
#define co_broadcast(X) pthread_cond_broadcast(X)
#define co_destroy(X) pthread_cond_destroy(X)
|
5377b9 | 1997-02-01 | Henrik Grubbström (Grubba) | | #else
#error No way to make cond-vars
#endif /* HAVE_PTHREAD_COND_INIT */
#endif /* POSIX_THREADS */
|
97ffe4 | 1997-01-26 | Per Hedbor | |
#ifdef UNIX_THREADS
#define THREAD_T thread_t
#define PTHREAD_MUTEX_INITIALIZER DEFAULTMUTEX
#define MUTEX_T mutex_t
#define mt_init(X) mutex_init((X),USYNC_THREAD,0)
#define mt_lock(X) mutex_lock(X)
#define mt_trylock(X) mutex_trylock(X)
#define mt_unlock(X) mutex_unlock(X)
#define mt_destroy(X) mutex_destroy(X)
#define th_setconcurrency(X) thr_setconcurrency(X)
#define th_create(ID,fun,arg) thr_create(NULL,0,fun,arg,THR_DAEMON,ID)
#define th_exit(foo) thr_exit(foo)
#define th_self() thr_self()
#define th_yield() thr_yield()
#define COND_T cond_t
#define co_init(X) cond_init((X),USYNC_THREAD,0)
#define co_wait(COND, MUTEX) cond_wait((COND), (MUTEX))
#define co_signal(X) cond_signal(X)
#define co_broadcast(X) cond_broadcast(X)
#define co_destroy(X) cond_destroy(X)
|
5377b9 | 1997-02-01 | Henrik Grubbström (Grubba) | |
#endif /* UNIX_THREADS */
|
b2a0fb | 1997-02-06 | Henrik Grubbström (Grubba) | | #ifdef SGI_SPROC_THREADS
|
5377b9 | 1997-02-01 | Henrik Grubbström (Grubba) | |
#define THREAD_T int
#define MUTEX_T ulock_t
#define mt_init(X) (usinitlock(((*X) = usnewlock(/*********/))))
#define mt_lock(X) ussetlock(*X)
#define mt_unlock(X) usunsetlock(*X)
#define mt_destroy(X) usfreelock((*X), /*******/)
#define th_setconcurrency(X) /*******/
#define PIKE_SPROC_FLAGS (PR_SADDR|PR_SFDS|PR_SDIR|PS_SETEXITSIG)
#define th_create(ID, fun, arg) (((*(ID)) = sproc(fun, PIKE_SPROC_FLAGS, arg)) == -1)
#define th_exit(X) exit(X)
#define th_self() getpid()
#define th_yield() sginap(0)
|
b2a0fb | 1997-02-06 | Henrik Grubbström (Grubba) | | #endif /* SGI_SPROC_THREADS */
|
97ffe4 | 1997-01-26 | Per Hedbor | |
extern MUTEX_T interpreter_lock;
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | |
struct svalue;
struct frame;
struct thread_state {
int swapped;
struct svalue *sp,*evaluator_stack;
struct svalue **mark_sp,**mark_stack;
struct frame *fp;
int evaluator_stack_malloced;
int mark_stack_malloced;
JMP_BUF *recoveries;
|
6d1a5e | 1996-10-07 | Fredrik Hübinette (Hubbe) | | struct object * thread_id;
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | };
|
60e6a6 | 1997-09-03 | Henrik Grubbström (Grubba) | |
#ifndef VERBOSE_THREADS_DEBUG
#define THREADS_FPRINTF(X)
#else
#define THREADS_FPRINTF(X) fprintf X
#endif /* VERBOSE_THREADS_DEBUG */
|
a7fef4 | 1997-09-03 | Per Hedbor | | #define SWAP_OUT_THREAD(_tmp) do { \
(_tmp)->swapped=1; \
(_tmp)->evaluator_stack=evaluator_stack;\
(_tmp)->evaluator_stack_malloced=evaluator_stack_malloced;\
(_tmp)->fp=fp;\
(_tmp)->mark_sp=mark_sp;\
(_tmp)->mark_stack=mark_stack;\
(_tmp)->mark_stack_malloced=mark_stack_malloced;\
(_tmp)->recoveries=recoveries;\
(_tmp)->sp=sp; \
(_tmp)->thread_id=thread_id;\
} while(0)
#define SWAP_IN_THREAD(_tmp) do {\
(_tmp)->swapped=0; \
evaluator_stack=(_tmp)->evaluator_stack;\
evaluator_stack_malloced=(_tmp)->evaluator_stack_malloced;\
fp=(_tmp)->fp;\
mark_sp=(_tmp)->mark_sp;\
mark_stack=(_tmp)->mark_stack;\
mark_stack_malloced=(_tmp)->mark_stack_malloced;\
recoveries=(_tmp)->recoveries;\
sp=(_tmp)->sp;\
thread_id=(_tmp)->thread_id;\
} while(0)
|
2d9cbe | 1997-09-08 | Fredrik Hübinette (Hubbe) | | #define SWAP_OUT_CURRENT_THREAD() \
do {\
struct thread_state *_tmp=(struct thread_state *)thread_id->storage; \
SWAP_OUT_THREAD(_tmp); \
THREADS_FPRINTF((stderr, "SWAP_OUT_CURRENT_THREAD() %s:%d t:%08x\n", \
|
d81860 | 1997-10-21 | Henrik Grubbström (Grubba) | | __FILE__, __LINE__, (unsigned int)_tmp->thread_id)) \
|
2d9cbe | 1997-09-08 | Fredrik Hübinette (Hubbe) | |
#define SWAP_IN_CURRENT_THREAD() \
THREADS_FPRINTF((stderr, "SWAP_IN_CURRENT_THREAD() %s:%d ... t:%08x\n", \
__FILE__, __LINE__, (unsigned int)_tmp->thread_id)); \
SWAP_IN_THREAD(_tmp);\
} while(0)
|
d81860 | 1997-10-21 | Henrik Grubbström (Grubba) | | #ifdef DEBUG
#define HIDE_GLOBAL_VARIABLES() do { \
int sp = 0, evaluator_stack = 0, mark_sp = 0, mark_stack = 0, fp = 0; \
void *evaluator_stack_malloced = NULL, *mark_stack_malloced = NULL; \
|
a35bbd | 1997-10-21 | Henrik Grubbström (Grubba) | | int recoveries = 0, thread_id = 0; \
int error = 0, xalloc = 0, low_my_putchar = 0, low_my_binary_strcat = 0; \
int low_make_buf_space = 0, pop_n_elems = 0; \
int push_sp_mark = 0, pop_sp_mark = 0
|
d81860 | 1997-10-21 | Henrik Grubbström (Grubba) | |
#define REVEAL_GLOBAL_VARIABLES() } while(0)
#else /* DEBUG */
#define HIDE_GLOBAL_VARIABLES()
#define REVEAL_GLOBAL_VARIABLES()
#endif /* DEBUG */
|
2d9cbe | 1997-09-08 | Fredrik Hübinette (Hubbe) | |
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #define THREADS_ALLOW() \
do {\
|
a7fef4 | 1997-09-03 | Per Hedbor | | struct thread_state *_tmp=(struct thread_state *)thread_id->storage; \
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | if(num_threads > 1 && !threads_disabled) { \
|
a7fef4 | 1997-09-03 | Per Hedbor | | SWAP_OUT_THREAD(_tmp); \
|
60e6a6 | 1997-09-03 | Henrik Grubbström (Grubba) | | THREADS_FPRINTF((stderr, "THREADS_ALLOW() %s:%d t:%08x\n", \
|
a7fef4 | 1997-09-03 | Per Hedbor | | __FILE__, __LINE__, (unsigned int)_tmp->thread_id)); \
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | mt_unlock(& interpreter_lock); \
|
d81860 | 1997-10-21 | Henrik Grubbström (Grubba) | | } else {} HIDE_GLOBAL_VARIABLES()
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | |
#define THREADS_DISALLOW() \
|
d81860 | 1997-10-21 | Henrik Grubbström (Grubba) | | REVEAL_GLOBAL_VARIABLES(); \
|
a7fef4 | 1997-09-03 | Per Hedbor | | if(_tmp->swapped) { \
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | mt_lock(& interpreter_lock); \
|
60e6a6 | 1997-09-03 | Henrik Grubbström (Grubba) | | THREADS_FPRINTF((stderr, "THREADS_DISALLOW() %s:%d ... t:%08x\n", \
|
a7fef4 | 1997-09-03 | Per Hedbor | | __FILE__, __LINE__, (unsigned int)_tmp->thread_id)); \
SWAP_IN_THREAD(_tmp);\
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | } \
} while(0)
|
6d1a5e | 1996-10-07 | Fredrik Hübinette (Hubbe) | | struct thread_starter;
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | void *new_thread_func(void * data);
void f_thread_create(INT32 args);
|
a29e02 | 1996-10-15 | Fredrik Hübinette (Hubbe) | | void f_this_thread(INT32 args);
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void th_init(void);
|
6d1a5e | 1996-10-07 | Fredrik Hübinette (Hubbe) | | struct mutex_storage;
struct key_storage;
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | void f_mutex_lock(INT32 args);
void f_mutex_trylock(INT32 args);
void init_mutex_obj(struct object *o);
void exit_mutex_obj(struct object *o);
void init_mutex_key_obj(struct object *o);
void exit_mutex_key_obj(struct object *o);
void f_cond_wait(INT32 args);
void f_cond_signal(INT32 args);
void f_cond_broadcast(INT32 args);
void init_cond_obj(struct object *o);
void exit_cond_obj(struct object *o);
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void th_cleanup(void);
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | |
#else
|
97ffe4 | 1997-01-26 | Per Hedbor | | #define th_setconcurrency(X)
|
419ede | 1996-11-13 | Fredrik Hübinette (Hubbe) | | #define DEFINE_MUTEX(X)
|
051688 | 1996-10-04 | David Hedbor | | #define mt_init(X)
#define mt_lock(X)
#define mt_unlock(X)
|
419ede | 1996-11-13 | Fredrik Hübinette (Hubbe) | | #define mt_destroy(X)
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #define THREADS_ALLOW()
#define THREADS_DISALLOW()
#define th_init()
|
6d1a5e | 1996-10-07 | Fredrik Hübinette (Hubbe) | | #define th_cleanup()
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #define th_init_programs()
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | | #define th_self() ((void*)0)
|
5377b9 | 1997-02-01 | Henrik Grubbström (Grubba) | | #endif /* _REENTRANT */
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | |
|
051688 | 1996-10-04 | David Hedbor | |
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | extern int threads_disabled;
|
5377b9 | 1997-02-01 | Henrik Grubbström (Grubba) | |
#endif /* THREADS_H */
|