Ping? Is no one using the GNUstep port?
On Sun, Apr 10, 2016 at 10:05 PM, Philip Guenther <[email protected]> wrote: > > The libpthread fork() wrapper makes two changes to the flags for the > process: it clears the 'detached' flag and sets the 'original' flag. I > now believe those are both wrong and should be left as they are from the > original process. > > For the 'detached' flag, the POSIX spec does *not* mention the detached > state as changed by fork() and GNU libc doesn't change it across fork(). > A ping to the austin-group mailing list appears to confirm this reading. I > apparently introduced this bug when I submitted the fork() wrapper before > I was a committer; about time I fixed it! > > The 'original' flag just controls the result of the pthread_main_np() > function. The description of that function isn't 100% clear: "identifies > the main thread", ok, but where is "main thread" defined? We had > interpreted it as meaning "the first thread in *this* process", and so > would return 1 in the thread created by fork(). However it can also be > interpreted as "this thread's call history traces back to main()", which > is true of the child of fork() iff it was true in the parent, and is what > the THREAD_INITIAL_STACK flag already conveys. So I looked at the ports > tree and the only code that I can see using pthread_main_np() is > x11/gnustep/base where the latter semantic appears to be the desired > behavior. This diff thus eliminates the separate THREAD_ORIGINAL flag and > change pthread_main_np() to test THREAD_INITIAL_STACK. > > So, any GNUstep users who can test this? > > oks? > > > Philip Guenther > > > Index: rthread.c > =================================================================== > RCS file: /data/src/openbsd/src/lib/librthread/rthread.c,v > retrieving revision 1.90 > diff -u -p -r1.90 rthread.c > --- rthread.c 2 Apr 2016 19:56:53 -0000 1.90 > +++ rthread.c 11 Apr 2016 04:37:28 -0000 > @@ -193,7 +193,7 @@ _rthread_init(void) > thread->tid = getthrid(); > thread->donesem.lock = _SPINLOCK_UNLOCKED_ASSIGN; > thread->flags |= THREAD_CANCEL_ENABLE | THREAD_CANCEL_DEFERRED | > - THREAD_ORIGINAL | THREAD_INITIAL_STACK; > + THREAD_INITIAL_STACK; > thread->flags_lock = _SPINLOCK_UNLOCKED_ASSIGN; > strlcpy(thread->name, "Main process", sizeof(thread->name)); > LIST_INSERT_HEAD(&_thread_list, thread, threads); > Index: rthread.h > =================================================================== > RCS file: /data/src/openbsd/src/lib/librthread/rthread.h,v > retrieving revision 1.56 > diff -u -p -r1.56 rthread.h > --- rthread.h 2 Apr 2016 19:00:51 -0000 1.56 > +++ rthread.h 11 Apr 2016 04:37:39 -0000 > @@ -189,7 +189,6 @@ struct pthread { > #define THREAD_CANCEL_DEFERRED 0x010 > #define THREAD_CANCEL_DELAY 0x020 > #define THREAD_DYING 0x040 > -#define THREAD_ORIGINAL 0x080 /* original thread from fork > */ > #define THREAD_INITIAL_STACK 0x100 /* thread with stack from > exec */ > > #define IS_CANCELED(thread) \ > Index: rthread_fork.c > =================================================================== > RCS file: /data/src/openbsd/src/lib/librthread/rthread_fork.c,v > retrieving revision 1.16 > diff -u -p -r1.16 rthread_fork.c > --- rthread_fork.c 2 Apr 2016 19:00:51 -0000 1.16 > +++ rthread_fork.c 11 Apr 2016 04:31:13 -0000 > @@ -99,11 +99,7 @@ _dofork(int is_vfork) > /* update this thread's structure */ > me->tid = getthrid(); > me->donesem.lock = _SPINLOCK_UNLOCKED_ASSIGN; > - me->flags &= ~THREAD_DETACHED; > me->flags_lock = _SPINLOCK_UNLOCKED_ASSIGN; > - > - /* this thread is the initial thread for the new process */ > - me->flags |= THREAD_ORIGINAL; > > /* reinit the thread list */ > LIST_INIT(&_thread_list); > Index: rthread_np.c > =================================================================== > mRCS file: /data/src/openbsd/src/lib/librthread/rthread_np.c,v > retrieving revision 1.18 > diff -u -p -r1.18 rthread_np.c > --- rthread_np.c 2 Apr 2016 19:00:51 -0000 1.18 > +++ rthread_np.c 11 Apr 2016 04:38:09 -0000 > @@ -47,8 +47,8 @@ pthread_set_name_np(pthread_t thread, co > int > pthread_main_np(void) > { > - return (!_threads_ready || (pthread_self()->flags & THREAD_ORIGINAL) > - ? 1 : 0); > + return (!_threads_ready || > + (pthread_self()->flags & THREAD_INITIAL_STACK) ? 1 : 0); > } > >
