[ECOS] Re: Per Thread Destructors Question

Ivan Horvat ihorvat@xylon.hr
Sat Jan 31 14:27:00 GMT 2004


> I am writing an application that dynamically creates threads. After
> consulting the documentation, it is not clear if per thread destructors
> [created via cyg_thread_add_destructor()] can be used to do a
> cyg_thread_delete() on one's own exited thread and follow that up with a
> free() of the thread stack, etc?

The destructors are called from Cyg_Thread::exit(), which looks like this:

void Cyg_Thread::exit(){

    Cyg_Thread *self = Cyg_Thread::self();

    cyg_ucount16 i;
       if (NULL != self->destructors[i].fn) {
          destructor_fn fn = self->destructors[i].fn;
          CYG_ADDRWORD data = self->destructors[i].data;

So, there are two problems:

   1. when thread is trying to delete itself
   2. cleaning the stack

When You attempt 1., cyg_thread_delete() calls thread->kill() method, 
which will
return upon detecting that it is "killing itself":

void Cyg_Thread::kill() {

    // If this is called by the current thread on itself,
    // just call exit(), which is what he should have done
    // in the first place.
    if( this == Cyg_Scheduler::get_current_thread() )

The exit() method is running on the thread stack, so if You try 2. to 
free it in per-thread
destructors, there is chance to crash the system (destroying the ground 
under Your feet).

> In other words, does the destructor run in the context of the thread itself
> or as part of kernel after the thread itself has exited - such that all
> thread context can be free'd.

The destructor is running in the context of the thread that called 
exit(), so it can't be used
to free the thread "context".

> If this procedure is not legal what is the recommended way to allow all such
> resources to be reclaimed on thread exit.

The question is what is the most elegant way to do it. :-) There are 
some proposals in the
"Threads on ecos" confirmation needed... message and follow-ups...


Before posting, please read the FAQ: http://sources.redhat.com/fom/ecos
and search the list archive: http://sources.redhat.com/ml/ecos-discuss

More information about the Ecos-discuss mailing list