Fix termination conditions for failed and detached threads.
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1654 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
parent
f5b9000018
commit
1d445a731d
@ -143,14 +143,13 @@ thread_run(void *widp)
|
|||||||
{
|
{
|
||||||
Term tgoal;
|
Term tgoal;
|
||||||
Term tgs[2];
|
Term tgs[2];
|
||||||
int out;
|
|
||||||
int myworker_id = *((int *)widp);
|
int myworker_id = *((int *)widp);
|
||||||
|
|
||||||
start_thread(myworker_id);
|
start_thread(myworker_id);
|
||||||
tgs[0] = Yap_FetchTermFromDB(ThreadHandle[worker_id].tgoal);
|
tgs[0] = Yap_FetchTermFromDB(ThreadHandle[worker_id].tgoal);
|
||||||
tgs[1] = ThreadHandle[worker_id].tdetach;
|
tgs[1] = ThreadHandle[worker_id].tdetach;
|
||||||
tgoal = Yap_MkApplTerm(FunctorThreadRun, 2, tgs);
|
tgoal = Yap_MkApplTerm(FunctorThreadRun, 2, tgs);
|
||||||
out = Yap_RunTopGoal(tgoal);
|
Yap_RunTopGoal(tgoal);
|
||||||
thread_die(worker_id, FALSE);
|
thread_die(worker_id, FALSE);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -33,21 +33,29 @@
|
|||||||
'$thread_self'(Id),
|
'$thread_self'(Id),
|
||||||
(Detached == true -> '$detach_thread'(Id) ; true),
|
(Detached == true -> '$detach_thread'(Id) ; true),
|
||||||
'$current_module'(Module),
|
'$current_module'(Module),
|
||||||
'$system_catch'((G,'$close_thread'),Module,Exception,'$thread_exception'(Exception)).
|
'$system_catch'((G,'$close_thread'(Detached,true) ; '$close_thread'(Detached,false)),Module,Exception,'$thread_exception'(Exception,Detached)).
|
||||||
|
|
||||||
'$top_thread_goal'(_) :-
|
'$top_thread_goal'(_) :-
|
||||||
'$thread_self'(Id0),
|
'$thread_self'(Id0),
|
||||||
recorda('$thread_exit_status', [Id0|false], _),
|
recorda('$thread_exit_status', [Id0|false], _),
|
||||||
'$run_at_thread_exit'(Id0).
|
'$run_at_thread_exit'(Id0).
|
||||||
|
|
||||||
'$close_thread' :-
|
'$close_thread'(Detached, Status) :-
|
||||||
'$thread_self'(Id0),
|
'$thread_self'(Id0),
|
||||||
recorda('$thread_exit_status', [Id0|true], _),
|
(Detached == true ->
|
||||||
|
true
|
||||||
|
;
|
||||||
|
recorda('$thread_exit_status', [Id0|Status], _)
|
||||||
|
),
|
||||||
'$run_at_thread_exit'(Id0).
|
'$run_at_thread_exit'(Id0).
|
||||||
|
|
||||||
'$thread_exception'(Exception) :-
|
'$thread_exception'(Exception,Detached) :-
|
||||||
'$thread_self'(Id0),
|
'$thread_self'(Id0),
|
||||||
recorda('$thread_exit_status', [Id0|exception(Exception)], _),
|
(Detached == true ->
|
||||||
|
true
|
||||||
|
;
|
||||||
|
recorda('$thread_exit_status', [Id0|exception(Exception)], _)
|
||||||
|
),
|
||||||
'$run_at_thread_exit'(Id0).
|
'$run_at_thread_exit'(Id0).
|
||||||
|
|
||||||
thread_create(Goal, Id) :-
|
thread_create(Goal, Id) :-
|
||||||
|
Reference in New Issue
Block a user