2002-11-05 Thomas Pfaff <tpfaff@gmx.net>

* dcrt0.cc (dll_crt0_1): Add call to pthread::initMainThread to
        initialize mainthread when it is safe to call new.
        * init.cc (dll_entry): Change call to store reents in tls key.
        * thread.cc (_reent_clib) : Change call to get reents from tls
        key.
        (_reent_winsup): Ditto.
        (MTinterface::Init): Key handling changed. Remove initialization
        of member variables.
        (MTinterface::fixup_after_fork): Reinitialize mainthread object
        after fork. Reset threadount to 1.
        (pthread::initMainThread): Create mainthread object dynamically.
        and initialize with valid handles.
        (pthread::self): Remove calls to create thread objects.
        (pthread::setTlsSelfPointer): Change call to store thread self
        handle in tls key.
        (pthread::getTlsSelfPointer): New static method.
        (pthread::exit): Remove setTlsSelfPointer call.
        (pthread::initCurrentThread): New method.
        (pthread::thread_init_wrapper): Change call to store thread self
        handle in tls key.
        (pthread::join): Check for a valid joiner.
        (pthreadNull::pthreadNull): Mark Null object as detached.
        (pthreadNull::exit): Terminate thread via ExitThread.
        * thread.h (pthread::initMainThread): Change parameter in function
        call.
        (pthread::getTlsSelfPointer): New static method.
        (pthread::initCurrentThread): New method.
        (MTinterface::reent_key): Remove.
        (MTinterface::thread_self_dwTlsIndex): Ditto..
        (MTinterface::indexallocated): Ditto.
        (MTinterface::mainthread): Ditto.
        (MTinterface::reent_key): New member.
        (MTinterface::thread_self_key): Ditto.
        (MTinterface::MTinterface): Initialize all members.
This commit is contained in:
Robert Collins
2002-11-24 13:54:14 +00:00
parent 4f0de34d37
commit f8c8e13b7e
5 changed files with 110 additions and 78 deletions

View File

@ -344,7 +344,7 @@ public:
pthread ();
virtual ~pthread ();
static void initMainThread(pthread *, HANDLE);
static void initMainThread (bool);
static bool isGoodObject(pthread_t const *);
static void atforkprepare();
static void atforkparent();
@ -387,10 +387,12 @@ private:
void pop_all_cleanup_handlers (void);
void precreate (pthread_attr *);
void postcreate ();
void setThreadIdtoCurrent();
static void setTlsSelfPointer(pthread *);
void setThreadIdtoCurrent ();
static void setTlsSelfPointer (pthread *);
static pthread *getTlsSelfPointer ();
void cancel_self ();
DWORD getThreadId ();
void initCurrentThread ();
};
class pthreadNull : public pthread
@ -493,17 +495,12 @@ class MTinterface
{
public:
// General
DWORD reent_index;
DWORD thread_self_dwTlsIndex;
/* we may get 0 for the Tls index.. grrr */
int indexallocated;
int concurrency;
long int threadcount;
// Used for main thread data, and sigproc thread
struct __reent_t reents;
struct _winsup_t winsup_reent;
pthread mainthread;
callback *pthread_prepare;
callback *pthread_child;
@ -514,18 +511,25 @@ public:
class pthread_cond * conds;
class semaphore * semaphores;
pthread_key reent_key;
pthread_key thread_self_key;
void Init (int);
void fixup_before_fork (void);
void fixup_after_fork (void);
MTinterface ():reent_index (0), indexallocated (0), threadcount (1)
MTinterface () :
concurrency (0), threadcount (1),
pthread_prepare (NULL), pthread_child (NULL), pthread_parent (NULL),
mutexs (NULL), conds (NULL), semaphores (NULL),
reent_key (NULL), thread_self_key (NULL)
{
pthread_prepare = NULL;
pthread_child = NULL;
pthread_parent = NULL;
}
};
#define MT_INTERFACE user_data->threadinterface
extern "C"
{
int __pthread_attr_init (pthread_attr_t * attr);