07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #ifndef THREADS_H
#define THREADS_H
#include "machine.h"
#include "interpret.h"
#include "error.h"
#ifdef _REENTRANT
#ifdef HAVE_PTHREAD_H
#include <pthread.h>
#undef HAVE_PTHREAD_H
#endif
extern int num_threads;
#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)
|
598892 | 1996-10-05 | Fredrik Hübinette (Hubbe) | | extern MUTEX_T interpreter_lock;
|
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)
#define COND_T pthread_cond_t
#define co_init(X) pthread_cond_init((X), 0)
#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)
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;
};
#define THREADS_ALLOW() \
do {\
struct thread_state _tmp; \
_tmp.swapped=0; \
if(num_threads > 1 && !threads_disabled) { \
_tmp.swapped=1; \
_tmp.sp=sp; \
_tmp.evaluator_stack=evaluator_stack; \
_tmp.mark_sp=mark_sp; \
_tmp.mark_stack=mark_stack; \
_tmp.fp=fp; \
_tmp.recoveries=recoveries; \
_tmp.evaluator_stack_malloced=evaluator_stack_malloced; \
_tmp.mark_stack_malloced=mark_stack_malloced; \
mt_unlock(& interpreter_lock); \
}
#define THREADS_DISALLOW() \
if(_tmp.swapped) { \
mt_lock(& interpreter_lock); \
sp=_tmp.sp; \
evaluator_stack=_tmp.evaluator_stack; \
mark_sp=_tmp.mark_sp; \
mark_stack=_tmp.mark_stack; \
fp=_tmp.fp; \
recoveries=_tmp.recoveries; \
evaluator_stack_malloced=_tmp.evaluator_stack_malloced; \
mark_stack_malloced=_tmp.mark_stack_malloced; \
} \
} while(0)
void *new_thread_func(void * data);
void f_thread_create(INT32 args);
void th_init();
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);
void th_init_programs();
#else
|
051688 | 1996-10-04 | David Hedbor | | #define mt_init(X)
#define mt_lock(X)
#define mt_unlock(X)
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #define THREADS_ALLOW()
#define THREADS_DISALLOW()
#define th_init()
#define th_init_programs()
#endif
|
051688 | 1996-10-04 | David Hedbor | |
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | extern int threads_disabled;
#endif
|