> > The way I see it, each process has a single pool instance as the parent
> > for all the threads. Resetting or destroying that pool should 
> effectively
> > kill all threads. What am I missing?
> 
> As I see it, the problem is:
> 
> [ Platforms with SAFE_ACCEPT == APR_SUCCESS rather than the lock don't
>   apply here. ]
> 
> All threads are stuck in the accept mutex except for one.  It reads the
> POD.  And, it is time to die.  It sets workers_may_exit to 1.  It then
> releases the accept mutex and exits.  Another *child process* acquires 
> the accept mutex.  Depending upon how many child processes you have, it 
> may take a while for all of the threads in the doomed child process to
> acquire the mutex, wake up, check workers_may_exit, release the mutex,
> and then exit.  Only when all of the threads in the doomed child process
> are exited does any cleanup occur.
> 
> These sibling threads are blocked until they receive the mutex.  They 
> aren't going to be going anywhere until the mutex is turned over to 
> them.  They can't check the value of workers_may_exit *until* they
> acquire the mutex.  Condition variables help *somewhat*, but the
> problem is now of scope - you have an interprocess condition and a
> intraprocess condition to check.  Does this work?  I don't know.
> 
> And, you can't kick the thread out of the mutex acquire (pthread_cancel 
> or similar strategies don't cancel a mutex operation), so you are
> screwed.  

Err, doesn't destruction of the mutex wake everyone up?
Oh, wait, does every process share the same mutex?

> And, destroying its parent pool does *NOT* destroy the thread.
> Look at the code again.  

Well, it should, although it may not do so now.

> The only person that can call
> pthread_exit() is the actual thread itself.  You can't call 
> pthread_exit on behalf of another thread (i.e. from the thread that
> knows it is doomed or a cleanup thread).  It just doesn't work like 
> that.
> 
> I just don't agree with Ryan's assessment here.  But, it's possible 
> I'm missing some major piece of code.  -- justin

Could be I'm way off too.

Sander

Reply via email to