+2004-04-09 Thomas Pfaff <tpfaff@gmx.net>
+
+ * thread.h (pthread::init_mainthread): Remove parameter forked.
+ (pthread::set_tls_self_pointer): New static function.
+ * thread.cc (MTinterface::fixup_after_fork): Change call to
+ pthread::init_mainthread.
+ (pthread::init_mainthread): Remove parameter forked. Simplify thread
+ self pointer handling.
+ (pthread::self): Set thread self pointer to null_pthread if thread has
+ not been initialized.
+ (pthread::set_tls_self_pointer): New static function.
+
2004-04-05 Pierre Humblet <pierre.humblet@ieee.org>
* path.cc (path_conv::check): Optimize symlink replacements.
pthread_key::fixup_after_fork ();
threadcount = 0;
- pthread::init_mainthread (true);
+ pthread::init_mainthread ();
pthread::fixup_after_fork ();
pthread_mutex::fixup_after_fork ();
/* 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,
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 *
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 */
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();
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 ();
};