pike.git/
src/
threads.c
Branch:
Tag:
Non-build tags
All tags
No tags
1997-09-01
1997-09-01 00:59:33 by Per Hedbor <ph@opera.com>
4bdad0493c9e9e3010c49722be18fdf78743b945 (
106
lines) (+
35
/-
71
)
[
Show
|
Annotate
]
Branch:
7.9
Ok, back to a somewhat older version.....
Rev: src/threads.c:1.26
1:
#include "global.h"
-
RCSID("$Id: threads.c,v 1.
25
1997/
08
/
31
22
:
24
:
00
per Exp $");
+
RCSID("$Id: threads.c,v 1.
26
1997/
09
/
01
00
:
59
:
33
per Exp $");
int num_threads = 1; int threads_disabled = 0;
14:
#include "constants.h" #include "program.h"
-
#include <errno.h>
+
struct object *thread_id; static struct callback *threads_evaluator_callback=0;
-
MUTEX_T interpreter_lock;
+
MUTEX_T interpreter_lock
= PTHREAD_MUTEX_INITIALIZER
;
struct program *mutex_key = 0; struct program *thread_id_prog = 0; #ifdef POSIX_THREADS
43:
void *new_thread_func(void * data) {
-
#ifdef
MASSIVE_DEBUG
-
static int dbt;
-
#endif
+
/*
static int dbt;
*/
struct thread_starter arg = *(struct thread_starter *)data; JMP_BUF back; INT32 tmp;
-
#ifdef
MASSIVE_DEBUG
-
fprintf(stderr, "Thread create[%d
:%p
]...",dbt++
,data
);
-
#endif
+
/*
fprintf(stderr, "Thread create[%d]...",dbt++);
*/
if((tmp=mt_lock( & interpreter_lock))) fatal("Failed to lock interpreter, errno %d\n",tmp);
-
#ifdef
MASSIVE_DEBUG
-
fprintf(stderr,"Created[%d
:%p
]...",dbt
,data
);
-
#endif
+
/*
fprintf(stderr,"Created[%d]...",dbt);
*/
init_interpreter(); thread_id=arg.id;
67:
ONERROR tmp; SET_ONERROR(tmp,exit_on_error,"Error in handle_error in master object!"); assign_svalue_no_free(sp++, & throw_value);
-
free((char *)data); /* Moved by per, to avoid some bugs.... */
-
#ifdef MASSIVE_DEBUG
-
fprintf(stderr,"Error [%d:%p]\n",dbt,data);
-
#endif
+
APPLY_MASTER("handle_error", 1); pop_stack(); UNSET_ONERROR(tmp);
79:
push_array_items(arg.args); arg.args=0; f_call_function(args);
-
#ifdef MASSIVE_DEBUG
-
fprintf(stderr,"Called [%d:%p]\n",dbt,data);
-
#endif
+
pop_stack(); /* Discard the return value. /Per */
-
free((char *)data); /* Moved by per, to avoid some bugs.... */
+
}
-
+
free((char *)data); /* Moved by per, to avoid some bugs.... */
UNSETJMP(back); destruct(thread_id);
100:
remove_callback(threads_evaluator_callback); threads_evaluator_callback=0; }
-
#ifdef
MASSIVE_DEBUG
-
fprintf(stderr,"Done[%d
:%p
]\n",dbt--
,data
);
-
#endif
+
/*
fprintf(stderr,"Done[%d]\n",dbt--);
*/
mt_unlock(& interpreter_lock); th_exit(0); /* NOT_REACHED, but removes a warning */
175:
struct mutex_storage {
-
#ifdef SOLARIS
-
sema_t sema;
-
#else
+
COND_T condition;
-
#endif
+
struct object *key; }; struct key_storage { struct mutex_storage *mut;
-
int initialized;
+
struct object *owner;
-
+
int initialized;
};
-
static MUTEX_T mutex_kluge;
+
static MUTEX_T mutex_kluge
= PTHREAD_MUTEX_INITIALIZER
;
#define OB2KEY(X) ((struct key_storage *)((X)->storage))
201:
pop_n_elems(args); m=THIS_MUTEX;
+
if(m->key && OB2KEY(m->key)->owner == thread_id)
-
+
{
+
push_int(0);
+
return;
error("Recursive mutex locks!\n");
-
+
}
+
o=clone_object(mutex_key,0);
-
#ifdef
SOLARIS
+
mt_lock(& mutex_kluge);
THREADS_ALLOW();
-
// Might be interrupted by signals.
-
while(
(sema
_wait(
&m->
sema
))
&
&
(errno==EAGAIN));
-
THREADS
_
DISALLOW(
);
+
while(
m->key) co
_wait(
&
m->
condition,
&
mutex
_
kluge
);
OB2KEY(o)->mut=m;
-
+
OB2KEY(o)->owner=thread_id;
m->key=o;
-
#else
-
THREADS_ALLOW();
-
mt_lock(& mutex_kluge);
-
while(m->key) co_wait(& m->condition, & mutex_kluge);
+
mt_unlock(&mutex_kluge); THREADS_DISALLOW();
-
OB2KEY(o)->mut=m;
-
m->key=o;
-
#endif
+
push_object(o); }
232:
o=clone_object(mutex_key,0); m=THIS_MUTEX;
+
if(m->key && OB2KEY(m->key)->owner == thread_id) error("Recursive mutex locks!\n");
-
+
+
mt_lock(& mutex_kluge);
+
THREADS_ALLOW();
if(!m->key) { OB2KEY(o)->mut=m;
-
+
OB2KEY(o)->owner=thread_id;
m->key=o; i=1; }
-
+
mt_unlock(&mutex_kluge);
+
THREADS_DISALLOW();
+
if(i) { push_object(o);
252:
void init_mutex_obj(struct object *o) {
-
#ifdef SOLARIS
-
sema_init(& THIS_MUTEX->sema, 1, USYNC_THREAD, NULL );
-
#else
+
co_init(& THIS_MUTEX->condition);
-
#endif
+
THIS_MUTEX->key=0; } void exit_mutex_obj(struct object *o) { if(THIS_MUTEX->key) destruct(THIS_MUTEX->key);
-
#ifdef SOLARIS
-
sema_destroy( & THIS_MUTEX->sema );
-
#else
+
co_destroy(& THIS_MUTEX->condition);
-
#endif
+
} #define THIS_KEY ((struct key_storage *)(fp->current_storage)) void init_mutex_key_obj(struct object *o) { THIS_KEY->mut=0;
-
+
THIS_KEY->owner=0;
THIS_KEY->initialized=1;
-
THIS_KEY->owner=thread_id;
+
} void exit_mutex_key_obj(struct object *o) {
-
+
mt_lock(& mutex_kluge);
if(THIS_KEY->mut) { #ifdef DEBUG if(THIS_KEY->mut->key != o) fatal("Mutex unlock from wrong key %p != %p!\n",THIS_KEY->mut->key,o); #endif
-
-
#ifdef SOLARIS
-
sema_post( &THIS_KEY->mut->sema );
+
THIS_KEY->mut->key=0;
-
#else
-
mt_lock(& mutex_kluge);
-
#endif
-
THIS_KEY->
mut->key
=0;
-
#ifndef SOLARIS
+
THIS_KEY->
owner
=0;
co_signal(& THIS_KEY->mut->condition);
-
#endif
+
THIS_KEY->mut=0;
-
THIS_KEY->owner=0;
+
THIS_KEY->initialized=0; }
-
#ifndef SOLARIS
+
mt_unlock(& mutex_kluge);
-
#endif
+
} #define THIS_COND ((COND_T *)(fp->current_storage))
328:
if(key->prog != mutex_key) error("Bad argument 1 to condition->wait()\n");
+
mt_lock(&mutex_kluge);
mut=OB2KEY(key)->mut; THREADS_ALLOW();
-
#ifdef SOLARIS
-
mut->key=0;
-
sema_post( &mut->sema );
-
/* Wait and allow mutex operations */
-
co_wait(c,0);
-
while((sema_wait( &mut->sema )) && (errno==EAGAIN));
-
mut->key=key;
-
#else
-
mt_lock(&mutex_kluge);
+
/* Unlock mutex */ mut->key=0; OB2KEY(key)->mut=0; co_signal(& mut->condition);
-
+
/* Wait and allow mutex operations */ co_wait(c,&mutex_kluge);
-
+
if(OB2KEY(key)->initialized) { /* Lock mutex */
353:
OB2KEY(key)->mut=mut; } mt_unlock(&mutex_kluge);
-
#endif
+
THREADS_DISALLOW(); pop_stack(); } else {