Re[2]: [Gc] pthread_suspend failed - using pthread_exit(0)

Ivan Maidanski ivmai at mail.ru
Thu Aug 18 00:04:10 PDT 2011


Hi Paul,

I assume you are using the latest GC alpha release (or Git snapshot).

Yes, the problem exists as we don't expect that application calls pthread_exit for the primordial thread.
I think we should handle this by redirecting pthread_exit (for now pthread_exit is redirected only on linux for handling cancellation).

It would be good if you could propose a draft patch fixing this.

Note also, that the code shown bellow is not used unless you call GC_use_threads_discovery at startup (this may workaround the bug):

>     kern_result = thread_suspend(thread);
>     if (kern_result != KERN_SUCCESS) {
>       /* The thread may have quit since the thread_threads() call we  */
>       /* mark already suspended so it's not dealt with anymore later. */
>       if (!found)
>         GC_mach_threads[GC_mach_threads_count++].already_suspended = TRUE;
>       continue;
>     }

Regards.

18 09 2011, 03:52 Bruce Hoult <bruce at hoult.org>:
> On Thu, Aug 18, 2011 at 5:30 AM, Paul Poley <baylorpaul at gmail.com> wrote:
> > Using the Boehm garbage collector, I have recently run into a case where I
> > am getting an error "pthread_suspend failed" using OSX.
> > At that point, the main thread had called pthread_exit(0), so as not to
> > terminate while other threads are still running.  Shortly afterwords, the
> > error occurs.
> > If I wait on a condition (in order to keep the process alive), rather than
> > invoke pthread_exit(0), the error does not occur.
> 
> If you look in darwin_stop_world.c you can find in GC_stop_world():
> 
>       for (p = GC_threads[i]; p != NULL; p = p->next) {
>         if ((p->flags & FINISHED) == 0 && !p->thread_blocked &&
>              p->stop_info.mach_thread != my_thread) {
> 
>           kern_result = thread_suspend(p->stop_info.mach_thread);
>           if (kern_result != KERN_SUCCESS)
>             ABORT("thread_suspend failed");
>         }
>       }
> 
> The code tries to avoid calling thread_suspend() in situations in
> which it will fail (or for the current thread), but perhaps there is
> another case that can be added.
> 
> In GC_suspend_thread_list() it is assumed that an error on a call to
> thread_suspend() means the thread has been suspended (or terminated?)
> since the threads were last enumerated and the error is basically
> ignored.
> 
>     kern_result = thread_suspend(thread);
>     if (kern_result != KERN_SUCCESS) {
>       /* The thread may have quit since the thread_threads() call we  */
>       /* mark already suspended so it's not dealt with anymore later. */
>       if (!found)
>         GC_mach_threads[GC_mach_threads_count++].already_suspended = TRUE;
>       continue;
>     }
> 
> Perhaps another test can  be added in GC_stop_world() that will detect
> the situation where the thread has called pthread_exit(0) and avoid
> the error.
> 
> Or perhaps it's safe to simply ignore the error, as in GC_suspend_thread_list().
> 
> Or perhaps #dontdothat.
> 
> I don't know enough about Darwin to say, but maybe someone else here
> does, given the above code fragments.
> 
> _______________________________________________
> Gc mailing list
> Gc at linux.hpl.hp.com
> http://www.hpl.hp.com/hosted/linux/mail-archives/gc/
> 



More information about the Gc mailing list