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:
@ -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);
|
||||
|
Reference in New Issue
Block a user