diff -urp cygwin.org/thread.cc cygwin/thread.cc
--- cygwin.org/thread.cc	2004-04-01 09:44:44.735432000 +0200
+++ cygwin/thread.cc	2004-04-01 09:47:25.756969600 +0200
@@ -153,7 +153,7 @@ MTinterface::fixup_after_fork (void)
   pthread_key::fixup_after_fork ();
 
   threadcount = 0;
-  pthread::init_mainthread (true);
+  pthread::init_mainthread ();
 
   pthread::fixup_after_fork ();
   pthread_mutex::fixup_after_fork ();
@@ -166,23 +166,17 @@ MTinterface::fixup_after_fork (void)
 
 /* static methods */
 void
-pthread::init_mainthread (const bool forked)
+pthread::init_mainthread ()
 {
   pthread *thread = get_tls_self_pointer ();
   if (!thread)
     {
-      if (forked)
-        thread = pthread_null::get_null_pthread ();
-      else
-        {
-          thread = new pthread ();
-          if (!thread)
-            api_fatal ("failed to create mainthread object");
-        }
+      thread = new pthread ();
+      if (!thread)
+        api_fatal ("failed to create mainthread object");
     }
 
-  thread->cygtls = &_my_tls;
-  _my_tls.tid = thread;
+  set_tls_self_pointer (thread);
   thread->thread_id = GetCurrentThreadId ();
   if (!DuplicateHandle (GetCurrentProcess (), GetCurrentThread (),
 			GetCurrentProcess (), &thread->win32_obj_id,
@@ -198,9 +192,12 @@ pthread *
 pthread::self ()
 {
   pthread *thread = get_tls_self_pointer ();
-  if (thread)
-    return thread;
-  return pthread_null::get_null_pthread ();
+  if (!thread)
+    {
+      thread = pthread_null::get_null_pthread ();
+      set_tls_self_pointer (thread);
+    }
+  return thread;
 }
 
 pthread *
@@ -209,6 +206,13 @@ pthread::get_tls_self_pointer ()
   return _my_tls.tid;
 }
 
+void
+pthread::set_tls_self_pointer (pthread *thread)
+{
+  thread->cygtls = &_my_tls;
+  _my_tls.tid = thread;
+}
+
 List<pthread> pthread::threads;
 
 /* member methods */
diff -urp cygwin.org/thread.h cygwin/thread.h
--- cygwin.org/thread.h	2004-04-01 09:44:37.474992000 +0200
+++ cygwin/thread.h	2004-04-01 09:45:49.158067200 +0200
@@ -373,7 +373,7 @@ public:
   pthread ();
   virtual ~pthread ();
 
-  static void init_mainthread (const bool forked = false);
+  static void init_mainthread ();
   static bool is_good_object(pthread_t const *);
   static void atforkprepare();
   static void atforkparent();
@@ -447,9 +447,9 @@ private:
   void pop_all_cleanup_handlers (void);
   void precreate (pthread_attr *);
   void postcreate ();
-  void set_tls_self_pointer ();
   bool create_cancel_event ();
   static pthread *get_tls_self_pointer ();
+  static void set_tls_self_pointer (pthread *);
   void cancel_self ();
   DWORD get_thread_id ();
 };
