Rename pthread::running to pthread::valid throughout.

* thread.h: (pthread::suspend_all_except_self): New static method.
(pthread::resume_all): Ditto.
(pthread::suspend_except_self): New method.
(pthread::resume): Ditto.
* thread.cc (pthread::suspend_except_self): Implement.
(pthread::resume): Ditto.
This commit is contained in:
Thomas Pfaff 2003-10-31 20:42:56 +00:00
parent d3f6bd13cb
commit c6e0f665bc
3 changed files with 46 additions and 7 deletions

View File

@ -1,3 +1,14 @@
2003-10-31 Thomas Pfaff <tpfaff@gmx.net>
Rename pthread::running to pthread::valid throughout.
* thread.h: (pthread::suspend_all_except_self): New static method.
(pthread::resume_all): Ditto.
(pthread::suspend_except_self): New method.
(pthread::resume): Ditto.
* thread.cc (pthread::suspend_except_self): Implement.
(pthread::resume): Ditto.
2003-10-29 Danny Smith <dannysmith@users.sourceforege.net> 2003-10-29 Danny Smith <dannysmith@users.sourceforege.net>
* include/stdint.h: Prevent signed->unsigned conversion for 32 and * include/stdint.h: Prevent signed->unsigned conversion for 32 and

View File

@ -254,7 +254,7 @@ List<pthread> pthread::threads;
/* member methods */ /* member methods */
pthread::pthread ():verifyable_object (PTHREAD_MAGIC), win32_obj_id (0), pthread::pthread ():verifyable_object (PTHREAD_MAGIC), win32_obj_id (0),
running (false), suspended (false), valid (false), suspended (false),
cancelstate (0), canceltype (0), cancel_event (0), cancelstate (0), canceltype (0), cancel_event (0),
joiner (NULL), next (NULL), cleanup_stack (NULL) joiner (NULL), next (NULL), cleanup_stack (NULL)
{ {
@ -344,7 +344,7 @@ pthread::create (void *(*func) (void *), pthread_attr *newattr,
void void
pthread::postcreate () pthread::postcreate ()
{ {
running = true; valid = true;
InterlockedIncrement (&MT_INTERFACE->threadcount); InterlockedIncrement (&MT_INTERFACE->threadcount);
/* FIXME: set the priority appropriately for system contention scope */ /* FIXME: set the priority appropriately for system contention scope */
@ -371,7 +371,7 @@ pthread::exit (void *value_ptr)
delete this; delete this;
else else
{ {
running = false; valid = false;
return_ptr = value_ptr; return_ptr = value_ptr;
mutex.unlock (); mutex.unlock ();
} }
@ -390,7 +390,7 @@ pthread::cancel (void)
mutex.lock (); mutex.lock ();
if (!running) if (!valid)
{ {
mutex.unlock (); mutex.unlock ();
return 0; return 0;
@ -743,6 +743,7 @@ pthread::init_current_thread ()
win32_obj_id = NULL; win32_obj_id = NULL;
set_thread_id_to_current (); set_thread_id_to_current ();
set_tls_self_pointer (this); set_tls_self_pointer (this);
valid = true;
} }
void void
@ -752,12 +753,26 @@ pthread::_fixup_after_fork ()
if (this != pthread::self ()) if (this != pthread::self ())
{ {
magic = 0; magic = 0;
running = false; valid = false;
win32_obj_id = NULL; win32_obj_id = NULL;
cancel_event = NULL; cancel_event = NULL;
} }
} }
void
pthread::suspend_except_self ()
{
if (valid && this != pthread::self ())
SuspendThread (win32_obj_id);
}
void
pthread::resume ()
{
if (valid)
ResumeThread (win32_obj_id);
}
/* static members */ /* static members */
bool bool
pthread_attr::is_good_object (pthread_attr_t const *attr) pthread_attr::is_good_object (pthread_attr_t const *attr)
@ -2332,7 +2347,7 @@ pthread::detach (pthread_t *thread)
} }
// check if thread is still alive // check if thread is still alive
if ((*thread)->running && WaitForSingleObject ((*thread)->win32_obj_id, 0) == WAIT_TIMEOUT) if ((*thread)->valid && WaitForSingleObject ((*thread)->win32_obj_id, 0) == WAIT_TIMEOUT)
{ {
// force cleanup on exit // force cleanup on exit
(*thread)->joiner = *thread; (*thread)->joiner = *thread;

View File

@ -456,7 +456,7 @@ public:
void *(*function) (void *); void *(*function) (void *);
void *arg; void *arg;
void *return_ptr; void *return_ptr;
bool running; bool valid;
bool suspended; bool suspended;
int cancelstate, canceltype; int cancelstate, canceltype;
HANDLE cancel_event; HANDLE cancel_event;
@ -521,12 +521,25 @@ public:
threads.for_each (&pthread::_fixup_after_fork); threads.for_each (&pthread::_fixup_after_fork);
} }
static void suspend_all_except_self ()
{
threads.for_each (&pthread::suspend_except_self);
}
static void resume_all ()
{
threads.for_each (&pthread::resume);
}
private: private:
static List<pthread> threads; static List<pthread> threads;
DWORD thread_id; DWORD thread_id;
__pthread_cleanup_handler *cleanup_stack; __pthread_cleanup_handler *cleanup_stack;
pthread_mutex mutex; pthread_mutex mutex;
void suspend_except_self ();
void resume ();
void _fixup_after_fork (); void _fixup_after_fork ();
void pop_all_cleanup_handlers (void); void pop_all_cleanup_handlers (void);