c47ffa6d4b
with the new libc_r pthread library
30 lines
1.2 KiB
Plaintext
30 lines
1.2 KiB
Plaintext
*** ../pwlib/src/ptlib/unix/tlibthrd.cxx.orig Thu Nov 16 11:14:48 2000
|
|
--- ../pwlib/src/ptlib/unix/tlibthrd.cxx Thu Nov 16 11:15:21 2000
|
|
*************** void PThread::PX_NewThread(BOOL startSus
|
|
*** 386,391 ****
|
|
--- 386,409 ----
|
|
// pthread_attr_t threadAttr;
|
|
// pthread_attr_init(&threadAttr);
|
|
PAssertOS(pthread_create(&PX_threadId, NULL, PX_ThreadStart, this) == 0);
|
|
+
|
|
+ #if defined(P_FREEBSD)
|
|
+ // There is a potential race condition here which shows up with FreeBSD 4.2
|
|
+ // and later, but really applies to all pthread libraries.
|
|
+ // If a thread is started in suspend mode, we need to make sure
|
|
+ // the thread (PX_ThreadStart) has had a chance to execute and block on the
|
|
+ // sigwait() (blocking on the Resume Signal) before this function returns.
|
|
+ // Otherwise the main program may issue a Resume Signal on the thread
|
|
+ // by calling PThread::Resume() before the thread is ready for it.
|
|
+ // If that happens the program will abort with an unhandled signal error.
|
|
+ // A workaround (not 100% guaranteed) is to yield here, which gives
|
|
+ // the newly created thread (PX_ThreadStart) a chance to execute.
|
|
+
|
|
+ if (startSuspended) {
|
|
+ sched_yield();
|
|
+ }
|
|
+ #endif
|
|
+
|
|
}
|
|
|
|
|