fix small problems in thread package.

This commit is contained in:
Vítor Santos Costa 2011-12-01 11:05:27 +00:00
parent 4db885e3c3
commit 84b017e5fd
2 changed files with 29 additions and 12 deletions

View File

@ -1392,9 +1392,10 @@ Yap_clean_tokenizer(TokEntry *tokstart, VarEntry *vartable, VarEntry *anonvartab
} }
LOCAL_Comments = TermNil; LOCAL_Comments = TermNil;
LOCAL_CommentsNextChar = LOCAL_CommentsTail = NULL; LOCAL_CommentsNextChar = LOCAL_CommentsTail = NULL;
free(LOCAL_CommentsBuff); if (LOCAL_CommentsBuff) {
if (LOCAL_CommentsBuff) free(LOCAL_CommentsBuff);
LOCAL_CommentsBuff = NULL; LOCAL_CommentsBuff = NULL;
}
LOCAL_CommentsBuffLim = 0; LOCAL_CommentsBuffLim = 0;
} }

View File

@ -116,6 +116,12 @@ store_specs(int new_worker_id, UInt ssize, UInt tsize, UInt sysize, Term *tpgoal
Yap_StoreTermInDB(tgoal,7); Yap_StoreTermInDB(tgoal,7);
REMOTE_ThreadHandle(new_worker_id).local_preds = REMOTE_ThreadHandle(new_worker_id).local_preds =
NULL; NULL;
REMOTE_ThreadHandle(new_worker_id).start_of_timesp =
NULL;
REMOTE_ThreadHandle(new_worker_id).last_timep =
NULL;
REMOTE_ScratchPad(new_worker_id).ptr =
NULL;
return TRUE; return TRUE;
} }
@ -123,12 +129,11 @@ store_specs(int new_worker_id, UInt ssize, UInt tsize, UInt sysize, Term *tpgoal
static void static void
kill_thread_engine (int wid, int always_die) kill_thread_engine (int wid, int always_die)
{ {
CACHE_REGS
Prop p0 = AbsPredProp(REMOTE_ThreadHandle(wid).local_preds); Prop p0 = AbsPredProp(REMOTE_ThreadHandle(wid).local_preds);
GlobalEntry *gl = LOCAL_GlobalVariables; GlobalEntry *gl = REMOTE_GlobalVariables(wid);
REMOTE_ThreadHandle(wid).local_preds = NIL; REMOTE_ThreadHandle(wid).local_preds = NIL;
LOCAL_GlobalVariables = NULL; REMOTE_GlobalVariables(wid) = NULL;
/* kill all thread local preds */ /* kill all thread local preds */
while(p0) { while(p0) {
PredEntry *ap = RepPredProp(p0); PredEntry *ap = RepPredProp(p0);
@ -142,12 +147,19 @@ kill_thread_engine (int wid, int always_die)
} }
Yap_KillStacks(wid); Yap_KillStacks(wid);
REMOTE_ActiveSignals(wid) = 0L; REMOTE_ActiveSignals(wid) = 0L;
free(REMOTE_ScratchPad(wid).ptr); if (REMOTE_ScratchPad(wid).ptr)
free(REMOTE_ThreadHandle(wid).default_yaam_regs); free(REMOTE_ScratchPad(wid).ptr);
REMOTE_ThreadHandle(wid).current_yaam_regs = NULL; REMOTE_ThreadHandle(wid).current_yaam_regs = NULL;
free(REMOTE_ThreadHandle(wid).start_of_timesp); if (REMOTE_ThreadHandle(wid).start_of_timesp)
free(REMOTE_ThreadHandle(wid).last_timep); free(REMOTE_ThreadHandle(wid).start_of_timesp);
Yap_FreeCodeSpace((ADDR)REMOTE_ThreadHandle(wid).texit); if (REMOTE_ThreadHandle(wid).last_timep)
free(REMOTE_ThreadHandle(wid).last_timep);
if (REMOTE_ThreadHandle(wid).texit) {
Yap_FreeCodeSpace((ADDR)REMOTE_ThreadHandle(wid).texit);
}
/* FreeCodeSpace requires LOCAL requires yaam_regs */
free(REMOTE_ThreadHandle(wid).default_yaam_regs);
REMOTE_ThreadHandle(wid).default_yaam_regs = NULL;
LOCK(GLOBAL_ThreadHandlesLock); LOCK(GLOBAL_ThreadHandlesLock);
if (REMOTE_ThreadHandle(wid).tdetach == MkAtomTerm(AtomTrue) || if (REMOTE_ThreadHandle(wid).tdetach == MkAtomTerm(AtomTrue) ||
always_die) { always_die) {
@ -169,13 +181,15 @@ thread_die(int wid, int always_die)
kill_thread_engine(wid, always_die); kill_thread_engine(wid, always_die);
} }
static void static int
setup_engine(int myworker_id, int init_thread) setup_engine(int myworker_id, int init_thread)
{ {
CACHE_REGS CACHE_REGS
REGSTORE *standard_regs; REGSTORE *standard_regs;
standard_regs = (REGSTORE *)calloc(1,sizeof(REGSTORE)); standard_regs = (REGSTORE *)calloc(1,sizeof(REGSTORE));
if (!standard_regs)
return FALSE;
regcache = standard_regs; regcache = standard_regs;
/* create the YAAM descriptor */ /* create the YAAM descriptor */
REMOTE_ThreadHandle(myworker_id).default_yaam_regs = standard_regs; REMOTE_ThreadHandle(myworker_id).default_yaam_regs = standard_regs;
@ -196,6 +210,7 @@ setup_engine(int myworker_id, int init_thread)
#ifdef TABLING #ifdef TABLING
DepFr_cons_cp(LOCAL_top_dep_fr) = B; /* same as in Yap_init_root_frames() */ DepFr_cons_cp(LOCAL_top_dep_fr) = B; /* same as in Yap_init_root_frames() */
#endif /* TABLING */ #endif /* TABLING */
return TRUE;
} }
static void static void
@ -420,7 +435,8 @@ Yap_thread_create_engine(thread_attr *ops)
REMOTE_ThreadHandle(new_id).pthread_handle = 0L; REMOTE_ThreadHandle(new_id).pthread_handle = 0L;
REMOTE_ThreadHandle(new_id).id = new_id; REMOTE_ThreadHandle(new_id).id = new_id;
REMOTE_ThreadHandle(new_id).ref_count = 0; REMOTE_ThreadHandle(new_id).ref_count = 0;
setup_engine(new_id, FALSE); if (!setup_engine(new_id, FALSE))
return -1;
if (pthread_self() != GLOBAL_master_thread) { if (pthread_self() != GLOBAL_master_thread) {
pthread_setspecific(Yap_yaamregs_key, NULL); pthread_setspecific(Yap_yaamregs_key, NULL);
pthread_mutex_unlock(&(REMOTE_ThreadHandle(0).tlock)); pthread_mutex_unlock(&(REMOTE_ThreadHandle(0).tlock));