more thread updates.

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1001 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc
2004-02-21 20:25:45 +00:00
parent d81bcb58e3
commit 6027963867
7 changed files with 63 additions and 34 deletions

View File

@@ -71,12 +71,13 @@ store_specs(int new_worker_id, UInt ssize, UInt tsize, Term tgoal, Term tdetach)
static void
thread_die(int wid)
thread_die(int wid, int always_die)
{
Prop p0;
LOCK(ThreadHandlesLock);
if (ThreadHandle[wid].tdetach == MkAtomTerm(AtomTrue)) {
if (ThreadHandle[wid].tdetach == MkAtomTerm(AtomTrue) ||
always_die) {
p0 = AbsPredProp(heap_regs->thread_handle[wid].local_preds);
/* kill all thread local preds */
while(p0) {
@@ -117,9 +118,8 @@ thread_run(void *widp)
tgs[0] = Yap_FetchTermFromDB(ThreadHandle[worker_id].tgoal);
tgs[1] = ThreadHandle[worker_id].tdetach;
tgoal = Yap_MkApplTerm(FunctorThreadRun, 2, tgs);
pthread_mutex_unlock(&(ThreadHandle[worker_id].tlock));
out = Yap_RunTopGoal(tgoal);
thread_die(worker_id);
thread_die(worker_id, FALSE);
return NULL;
}
@@ -138,19 +138,15 @@ p_create_thread(void)
Term tgoal = Deref(ARG1);
Term tdetach = Deref(ARG5);
int new_worker_id = IntegerOfTerm(Deref(ARG6));
pthread_attr_t at;
if (new_worker_id == -1) {
/* YAP ERROR */
return FALSE;
}
}
ThreadHandle[new_worker_id].id = new_worker_id;
pthread_mutex_init(&ThreadHandle[new_worker_id].tlock, NULL);
pthread_mutex_lock(&(ThreadHandle[new_worker_id].tlock));
store_specs(new_worker_id, ssize, tsize, tgoal, tdetach);
pthread_attr_init(&at);
pthread_attr_setstacksize(&at, 32*4096);
if ((ThreadHandle[new_worker_id].ret = pthread_create(&(ThreadHandle[new_worker_id].handle), NULL, thread_run, (void *)(&(ThreadHandle[new_worker_id].id)))) == 0) {
pthread_mutex_init(&ThreadHandle[new_worker_id].tlock, NULL);
if ((ThreadHandle[new_worker_id].ret = pthread_create(&ThreadHandle[new_worker_id].handle, NULL, thread_run, (void *)(&(ThreadHandle[new_worker_id].id)))) == 0) {
return TRUE;
}
/* YAP ERROR */
@@ -167,8 +163,6 @@ static Int
p_thread_join(void)
{
Int tid = IntegerOfTerm(Deref(ARG1));
pthread_t th;
void *retval;
LOCK(ThreadHandlesLock);
if (!ThreadHandle[tid].in_use) {
@@ -179,13 +173,13 @@ p_thread_join(void)
UNLOCK(ThreadHandlesLock);
return FALSE;
}
ThreadHandle[tid].tdetach = MkAtomTerm(AtomTrue);
th = ThreadHandle[tid].handle;
UNLOCK(ThreadHandlesLock);
if (pthread_join(th, &retval) < 0) {
if (pthread_join(ThreadHandle[tid].handle, NULL) < 0) {
/* ERROR */
fprintf(stderr, "join error %d %d\n", tid, errno);
return FALSE;
}
fprintf(stderr, "join %d\n", tid);
return TRUE;
}
@@ -194,15 +188,14 @@ p_thread_destroy(void)
{
Int tid = IntegerOfTerm(Deref(ARG1));
thread_die(tid);
thread_die(tid, TRUE);
return TRUE;
}
static Int
p_thread_detach(void)
{
pthread_t th = ThreadHandle[IntegerOfTerm(Deref(ARG1))].handle;
if (pthread_detach(th) < 0) {
if (pthread_detach(ThreadHandle[IntegerOfTerm(Deref(ARG1))].handle) < 0) {
/* ERROR */
return FALSE;
}
@@ -212,7 +205,8 @@ p_thread_detach(void)
static Int
p_thread_exit(void)
{
thread_die(worker_id);
fprintf(stderr,"here i go %d %ld\n", worker_id, ThreadHandle[worker_id].handle);
thread_die(worker_id, FALSE);
pthread_exit(NULL);
return TRUE;
}