Trigger GC prior to thread exit

This commit is contained in:
Justin Ethier 2015-12-20 21:59:40 -05:00
parent aad3cebd7a
commit 6463b2bf06
2 changed files with 10 additions and 2 deletions

View file

@ -189,6 +189,7 @@ object memqp(void *,object,list);
object Cyc_spawn_thread(object thunk); object Cyc_spawn_thread(object thunk);
void Cyc_start_thread(gc_thread_data *thd); void Cyc_start_thread(gc_thread_data *thd);
void Cyc_end_thread(gc_thread_data *thd); void Cyc_end_thread(gc_thread_data *thd);
void Cyc_exit_thread(gc_thread_data *thd);
object Cyc_thread_sleep(void *data, object timeout); object Cyc_thread_sleep(void *data, object timeout);
void GC(void *,closure,object*,int); void GC(void *,closure,object*,int);

View file

@ -3152,6 +3152,7 @@ void *Cyc_init_thread(object thunk)
// returns instance so would need to malloc here // returns instance so would need to malloc here
// would also need to update termination code to free that memory // would also need to update termination code to free that memory
gc_add_mutator(thd); gc_add_mutator(thd);
ATOMIC_SET_IF_EQ(&(thd->thread_state), CYC_THREAD_STATE_NEW, CYC_THREAD_STATE_RUNNABLE);
Cyc_start_thread(thd); Cyc_start_thread(thd);
return NULL; return NULL;
} }
@ -3195,6 +3196,12 @@ to look at the lock-free structures provided by ck?
* Terminate a thread * Terminate a thread
*/ */
void Cyc_end_thread(gc_thread_data *thd) void Cyc_end_thread(gc_thread_data *thd)
{
mclosure0(clo, Cyc_exit_thread);
GC(thd, &clo, thd->gc_args, 0);
}
void Cyc_exit_thread(gc_thread_data *thd)
{ {
// alternatively could call longjmp with a null continuation, but that seems // alternatively could call longjmp with a null continuation, but that seems
// more complicated than necessary. or does it... see next comment: // more complicated than necessary. or does it... see next comment:
@ -3203,8 +3210,8 @@ void Cyc_end_thread(gc_thread_data *thd)
// referenced? might want to do one more minor GC to clear the stack before // referenced? might want to do one more minor GC to clear the stack before
// terminating the thread // terminating the thread
// TODO: use ATOMIC set to modify this printf("DEBUG - exiting thread\n");
thd->thread_state = CYC_THREAD_STATE_TERMINATED; ATOMIC_SET_IF_EQ(&(thd->thread_state), CYC_THREAD_STATE_RUNNABLE, CYC_THREAD_STATE_TERMINATED);
pthread_exit(NULL); // For now, just a proof of concept pthread_exit(NULL); // For now, just a proof of concept
} }