pike.git / src / threads.h

version» Context lines:

pike.git/src/threads.h:1: + #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) +  + extern MUTEX_T interpreter_lock, compiler_lock; +  + #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) +  + /* Prototypes begin here */ + 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(); + /* Prototypes end here */ +  +  + #else + #define mt_init() + #define mt_lock() + #define mt_unlock() + #define THREADS_ALLOW() + #define THREADS_DISALLOW() + #define th_init() + #define th_init_programs() + #endif +  + extern int threads_disabled; + #endif   Newline at end of file added.