aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2003-10-02 04:46:59 +0000
committerChristopher Faylor <me@cgf.cx>2003-10-02 04:46:59 +0000
commit89238062995e04a31600ccad4d5605064c63998e (patch)
tree8a277492502952f5c94d608b8fefb1f478f610e6
parent6cb54a4ceef86fbc1e83e2f2a79d1d4f120fde04 (diff)
downloadnewlib-89238062995e04a31600ccad4d5605064c63998e.zip
newlib-89238062995e04a31600ccad4d5605064c63998e.tar.gz
newlib-89238062995e04a31600ccad4d5605064c63998e.tar.bz2
* dcrt0.cc (dll_crt0_1): Call newlib __sinit routine to ensure that stdio
buffers are initialized to avoid thread initialization races.
-rw-r--r--winsup/cygwin/ChangeLog5
-rw-r--r--winsup/cygwin/dcrt0.cc7
2 files changed, 11 insertions, 1 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 41c6071..59bd2eb 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,8 @@
+2003-10-02 Christopher Faylor <cgf@redhat.com>
+
+ * dcrt0.cc (dll_crt0_1): Call newlib __sinit routine to ensure that
+ stdio buffers are initialized to avoid thread initialization races.
+
2003-10-01 Christopher Faylor <cgf@redhat.com>
* path.cc (win32_device_name): Only fill out destination buffer when
diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc
index 377d6dd..a09b7e8 100644
--- a/winsup/cygwin/dcrt0.cc
+++ b/winsup/cygwin/dcrt0.cc
@@ -533,6 +533,8 @@ sigthread::init (const char *s)
id = GetCurrentThreadId ();
}
+extern "C" void __sinit (_reent *);
+
/* Take over from libc's crt0.o and start the application. Note the
various special cases when Cygwin DLL is being runtime loaded (as
opposed to being link-time loaded by Cygwin apps) from a non
@@ -633,7 +635,10 @@ dll_crt0_1 ()
/* Initialize pthread mainthread when not forked and it is save to call new,
otherwise it is reinitalized in fixup_after_fork */
if (!user_data->forkee)
- pthread::init_mainthread ();
+ {
+ __sinit (_impure_ptr);
+ pthread::init_mainthread ();
+ }
#ifdef DEBUGGING
strace.microseconds ();