Messages in this thread | | | From | (Eric W. Biederman) | Date | Thu, 24 Jun 2010 17:08:10 -0700 | Subject | Re: while_each_thread() under rcu_read_lock() is broken? |
| |
Oleg Nesterov <oleg@redhat.com> writes:
> On 06/24, Chris Friesen wrote: >> >> On 06/24/2010 12:07 PM, Paul E. McKenney wrote: >> >> > 3. The thread-group leader might do pthread_exit(), removing itself >> > from the thread group -- and might do so while the hapless reader >> > is referencing that thread. >> > >> > But isn't this prohibited? Or is it really legal to do a >> > pthread_create() to create a new thread and then have the >> > parent thread call pthread_exit()? Not something I would >> > consider trying in my own code! Well, I might, just to >> > be perverse, but... ;-) >> >> I believe SUS allows the main thread to explicitly call pthread_exit(), >> leaving the other threads to run. If the main() routine just returns >> then it implicitly calls exit(). > > Correct. > > But, to clarify, if the main thread does pthread_exit() (sys_exit, > actually), it won't be removed from the group. It will be zombie > until all other threads exit.
That we don't cleanup that zombie leaders is unfortunate really, it means we have the entire de_thread special case. But short fixing libpthread to not make bad assumptions there is little we can do about it really.
I'm only half following this conversation.
If what we are looking for is a stable list_head that won't disappear on us we should be able to put one in sighand_struct or signal_struct (I forget which is which at the moment) and have a list_head that lives for the life of the longest living thread, and that won't get messed up by things like de_thread, and then next_thread could simply return NULL when we hit the end of the list.
Eric
| |