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 */
|
864d3c | 1998-01-29 | Fredrik Hübinette (Hubbe) | | extern pthread_attr_t pattr;
extern pthread_attr_t small_pattr;
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | |
#define th_create(ID,fun,arg) pthread_create(ID,&pattr,fun,arg)
|
864d3c | 1998-01-29 | Fredrik Hübinette (Hubbe) | | #define th_create_small(ID,fun,arg) pthread_create(ID,&small_pattr,fun,arg)
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #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)
|
864d3c | 1998-01-29 | Fredrik Hübinette (Hubbe) | | #define th_create_small(ID,fun,arg) thr_create(NULL,32768,fun,arg,THR_DAEMON,ID)
|
97ffe4 | 1997-01-26 | Per Hedbor | | #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)
|
864d3c | 1998-01-29 | Fredrik Hübinette (Hubbe) | | #define th_create_small(ID, fun, arg) (((*(ID)) = sproc(fun, PIKE_SPROC_FLAGS, arg)) == -1)
|
5377b9 | 1997-02-01 | Henrik Grubbström (Grubba) | | #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 | |
|
a2db6b | 1998-01-02 | Fredrik Hübinette (Hubbe) | |
#ifdef NT_THREADS
#include <process.h>
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | #include <windows.h>
|
a2db6b | 1998-01-02 | Fredrik Hübinette (Hubbe) | |
#define THREAD_T HANDLE
#define th_setconcurrency(X)
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | #define th_create(ID,fun,arg) (!(*(ID)=_beginthread(fun, 2*1024*1024, arg)))
|
864d3c | 1998-01-29 | Fredrik Hübinette (Hubbe) | | #define th_create_small(ID,fun,arg) (!(*(ID)=_beginthread(fun, 32768, arg)))
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | #define th_exit(foo) _endthread(foo)
|
e42eaf | 1998-01-02 | Fredrik Hübinette (Hubbe) | | #define th_self() GetCurrentThread()
|
dc7cc9 | 1998-01-14 | Fredrik Hübinette (Hubbe) | | #define th_destroy(X)
|
e42eaf | 1998-01-02 | Fredrik Hübinette (Hubbe) | | #define th_yield() Sleep(0)
#define MUTEX_T HANDLE
|
dc7cc9 | 1998-01-14 | Fredrik Hübinette (Hubbe) | | #define mt_init(X) CheckValidHandle((*(X)=CreateMutex(NULL, 0, NULL)))
#define mt_lock(X) (CheckValidHandle(*(X)),WaitForSingleObject(*(X), INFINITE))
#define mt_trylock(X) (CheckValidHandle(*(X)),WaitForSingleObject(*(X), 0))
#define mt_unlock(X) (CheckValidHandle(*(X)),ReleaseMutex(*(X)))
#define mt_destroy(X) (CheckValidHandle(*(X)),CloseHandle(*(X)))
|
e42eaf | 1998-01-02 | Fredrik Hübinette (Hubbe) | |
#define EVENT_T HANDLE
|
dc7cc9 | 1998-01-14 | Fredrik Hübinette (Hubbe) | | #define event_init(X) CheckValidHandle(*(X)=CreateEvent(NULL, 1, 0, NULL))
#define event_signal(X) (CheckValidHandle(*(X)),SetEvent(*(X)))
#define event_destroy(X) (CheckValidHandle(*(X)),CloseHandle(*(X)))
#define event_wait(X) (CheckValidHandle(*(X)),WaitForSingleObject(*(X), INFINITE))
|
a2db6b | 1998-01-02 | Fredrik Hübinette (Hubbe) | |
#endif
|
e42eaf | 1998-01-02 | Fredrik Hübinette (Hubbe) | |
#if !defined(COND_T) && defined(EVENT_T) && defined(MUTEX_T)
#define SIMULATE_COND_WITH_EVENT
struct cond_t_queue
{
struct cond_t_queue *next;
EVENT_T event;
};
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | typedef struct cond_t_s
|
e42eaf | 1998-01-02 | Fredrik Hübinette (Hubbe) | | {
MUTEX_T lock;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | struct cond_t_queue *head, *tail;
|
e42eaf | 1998-01-02 | Fredrik Hübinette (Hubbe) | | } COND_T;
#define COND_T struct cond_t_s
|
dc7cc9 | 1998-01-14 | Fredrik Hübinette (Hubbe) | | #define co_init(X) do { mt_init(& (X)->lock), (X)->head=(X)->tail=0; }while(0)
|
e42eaf | 1998-01-02 | Fredrik Hübinette (Hubbe) | |
int co_wait(COND_T *c, MUTEX_T *m);
int co_signal(COND_T *c);
int co_broadcast(COND_T *c);
int co_destroy(COND_T *c);
#endif
|
97ffe4 | 1997-01-26 | Per Hedbor | | extern MUTEX_T interpreter_lock;
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | |
struct svalue;
struct frame;
|
574088 | 1998-01-01 | Fredrik Hübinette (Hubbe) | | #define THREAD_NOT_STARTED -1
#define THREAD_RUNNING 0
#define THREAD_EXITED 1
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | struct thread_state {
|
574088 | 1998-01-01 | Fredrik Hübinette (Hubbe) | | char swapped;
char status;
COND_T status_change;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | THREAD_T id;
|
574088 | 1998-01-01 | Fredrik Hübinette (Hubbe) | |
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | 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) | | };
|
e42eaf | 1998-01-02 | Fredrik Hübinette (Hubbe) | | #ifndef th_destroy
#define th_destroy(X)
#endif
#ifndef th_yield
#define th_yield()
#endif
|
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)
|
e09b89 | 1998-01-06 | Mirar (Pontus Hagland) | | #if defined(DEBUG) && ! defined(DONT_HIDE_GLOBALS)
|
d81860 | 1997-10-21 | Henrik Grubbström (Grubba) | |
#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) | |
|
602f69 | 1997-10-25 | Henrik Grubbström (Grubba) | |
#define REVEAL_GLOBAL_VARIABLES() ; } while(0)
|
d81860 | 1997-10-21 | Henrik Grubbström (Grubba) | | #else /* DEBUG */
#define HIDE_GLOBAL_VARIABLES()
#define REVEAL_GLOBAL_VARIABLES()
#endif /* DEBUG */
|
2d9cbe | 1997-09-08 | Fredrik Hübinette (Hubbe) | |
|
602f69 | 1997-10-25 | Henrik Grubbström (Grubba) | | #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); \
|
602f69 | 1997-10-25 | 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);
|
dc7cc9 | 1998-01-14 | Fredrik Hübinette (Hubbe) | | void f_thread_set_concurrency(INT32 args);
|
a29e02 | 1996-10-15 | Fredrik Hübinette (Hubbe) | | void f_this_thread(INT32 args);
|
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);
|
dc7cc9 | 1998-01-14 | Fredrik Hübinette (Hubbe) | | void f_thread_backtrace(INT32 args);
void f_thread_id_status(INT32 args);
void init_thread_obj(struct object *o);
void exit_thread_obj(struct object *o);
void th_init(void);
|
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()
|
43306a | 1997-10-21 | Henrik Grubbström (Grubba) | | #define HIDE_GLOBAL_VARIABLES()
#define REVEAL_GLOBAL_VARIABLES()
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #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) | |
|
dc7cc9 | 1998-01-14 | Fredrik Hübinette (Hubbe) | | #ifdef __NT__
#ifndef DEBUG
#define CheckValidHandle(X) 0
#else
void CheckValidHandle(HANDLE h);
#endif
#endif
|
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 */
|