Date: Sat, 06 Jun 1998 16:08:58 -0700 From: Amancio Hasty <hasty@rah.star-gate.com> To: John Birrell <jb@cimlogic.com.au> Cc: nirva@ishiboo.com, rhh@ct.picker.com, multimedia@FreeBSD.ORG Subject: Re: Remote device multiplexing Message-ID: <199806062308.QAA11624@rah.star-gate.com> In-Reply-To: Your message of "Sat, 06 Jun 1998 16:34:25 %2B1000." <199806060634.QAA01014@cimlogic.com.au>
next in thread | previous in thread | raw e-mail | index | archive | help
I am going to send mail to the ACE group to see if they can fix the recursive exit problem that we are seeing over here. pthread exit is pthread_exit and thread's hex id start cleanup is cleanupspecific lock number is a key's access lock number clean destructor is when cleanupspecific calls a destructor clean return <phew the destructor return to cleanup specific. thr exit is ACE calling thread exit. locking the thread list for "thread id" is when a thread is about to be placed in the dead list. My take is that our pthread package can not handle recursive pthread exits. I tried getting around this by adding a an exit_flag to the thread structure and fixing the access lock on the key table by relesing the lock before calling the destructor however we get stuck somewhere else now: _spinlock(&key_table[key].access_lock); if (key_table[key].allocated) { if (_thread_run->specific_data[key]) { data = (void *) _thread_run-> specific_data[key]; _thread_run-> specific_data[key] = NULL; _thread_run-> specific_data_count--; printf("clean destructor key %d data_count %d \n",key, _thread_run-> specific_data_count ); /* Unlock the key table entry: */ destructor = key_table[key].destructor; _atomic_unlock(&key_table[key]. access_lock); if (destructor) destructor(data); printf("clean return destructor \n"); } } else { /* Unlock the key table entry: */ _atomic_unlock(&key_table[key].access_lock); } } else { printf("cleanup exit %x \n", _thread_run); free(_thread_run->specific_data); _thread_run->specific_data = NULL; return; } I think is easier if the ACE group prevents the stupid recursive exit call. Cheers, Amancio {root} ./Task_Test pthread exit 8053400 start cleanup 8053400 lock 0 clean destructor key 0 data_count 1 clean return destructor lock 1 lock 2 clean destructor key 2 data_count 0 thr exit pthread exit 8053400 already exiting clean return destructor cleanup exit 8053400 locking the thread list for 8053400 : key[2].access 0 pthread exit 8053200 start cleanup 8053200 lock 0 clean destructor key 0 data_count 1 clean return destructor lock 1 pthread exit 8053800 start cleanup 8053800 lock 0 clean destructor key 0 data_count 1 clean return destructor lock 1 pthread exit 8053600 start cleanup 8053600 lock 0 clean destructor key 0 data_count 1 clean return destructor lock 1 To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-multimedia" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199806062308.QAA11624>