diff options
| -rw-r--r-- | ChangeLog | 15 | ||||
| -rw-r--r-- | create.c | 45 | ||||
| -rw-r--r-- | private.c | 65 | 
3 files changed, 61 insertions, 64 deletions
@@ -1,3 +1,18 @@ +Fri Jul 24 00:21:21 1998  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* create.c (pthread_create): Arg to _pthread_new_thread_entry() +	changed. See next entry. Move mutex locks out. Changes made yesterday +	and today allow us to start the new thread running rather than +	temporarily suspended. + +	* private.c (_pthread_new_thread_entry): _pthread_thread_table +	was changed back to a table of thread structures rather than pointers. +	As such we're trading storage for increaded speed. This routine +	was modified to work with the new table. Mutex lock put in around +	global data accesses. +	(_pthread_find_thread_entry): Ditto +	(_pthread_delete_thread_entry): Ditto +  Thu Jul 23 23:25:30 1998  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>  	* global.c: New. Global data objects declared here. These moved from @@ -12,15 +12,20 @@  #include "implement.h"  unsigned -_pthread_start_call(void *this) +_pthread_start_call(void * call)  {    /* We're now in a running thread. Any local variables here are on       this threads private stack so we're safe to leave data in them       until we leave. */ -  unsigned (*func)(void *) = this->call.routine; -  void * arg = this->call.arg; +  _pthread_call_t * this; +  unsigned (*func)(void *); +  void * arg;    unsigned ret; +  this = (_pthread_call_t *) call; +  func = call->routine; +  arg = call->arg; +    ret = (*func)(arg);    /* If we get to here then we're returning naturally and haven't @@ -40,30 +45,19 @@ pthread_create(pthread_t *thread,    HANDLE   handle = NULL;    unsigned flags;    void *   security = NULL; - -  /* FIXME: This needs to be moved into process space.  -     Perhaps into a structure that contains all -     per thread info that is Win32 thread specific but -     not visible from the pthreads API, and -     accessible through HANDLE (or pthread_t). -   */ -  SECURITY_ATTRIBUTES security_attr;    DWORD  threadID; -  /* Success unless otherwise set. */ -  int ret = 0;    pthread_attr_t * attr_copy;    _pthread_threads_thread_t * this; +  /* Success unless otherwise set. */ +  int ret = 0; -  /* CRITICAL SECTION */ -  pthread_mutex_lock(&_pthread_count_mutex); - -  if (_pthread_new_thread_entry((pthread_t) handle, &this) == 0) +  if (_pthread_new_thread_entry((pthread_t) handle, this) == 0)      {        attr_copy = &(this->attr);        if (attr != NULL)   	{ -	  /* Map attributes */ +	  /* Map attributes. */  	  if (attr_copy->stacksize == 0)  	    {  	      attr_copy->stacksize = PTHREAD_STACK_MIN; @@ -72,15 +66,13 @@ pthread_create(pthread_t *thread,  	  attr_copy->cancelability = attr->cancelability;  	} -      /* Start suspended and resume at the last moment to avoid -	 race conditions, ie. where a thread may enquire it's -	 attributes before we finish storing them away. */ -      flags = 1; +      /* Start running, not suspended. */ +      flags = 0;        handle = (HANDLE) _beginthreadex(security,  				       attr_copy->stacksize,  				       _pthread_start_call, -				       (void *) this, +				       (void *) &(this->call),  				       flags,  				       &threadID); @@ -94,17 +86,10 @@ pthread_create(pthread_t *thread,        ret = EAGAIN;      } -  /* Let others in as soon as possible. */ -  pthread_mutex_unlock(&_pthread_count_mutex); -  /* END CRITICAL SECTION */ -    if (ret == 0)      {        /* Let the caller know the thread handle. */        *thread = (pthread_t) handle; - -      /* POSIX threads are always running after creation. */ -      ResumeThread(handle);      }    else      { @@ -25,10 +25,12 @@   */  int -_pthread_new_thread_entry(pthread_t thread,  -			  _pthread_threads_thread_t ** entry) +_pthread_new_thread_entry(pthread_t thread, _pthread_threads_thread_t * entry)  { -  _pthread_threads_thread_t ** this; +  _pthread_threads_thread_t * this; + +  /* CRITICAL SECTION */ +  pthread_mutex_lock(&_pthread_count_mutex);    if (_pthread_threads_count >= PTHREAD_THREADS_MAX)      { @@ -37,7 +39,7 @@ _pthread_new_thread_entry(pthread_t thread,    this = &_pthread_threads_table[_PTHREAD_HASH_INDEX(thread)]; -  while ((*this)->thread != NULL) +  while (this->thread != NULL)      {        this++; @@ -48,45 +50,40 @@ _pthread_new_thread_entry(pthread_t thread,  	}      } -  if ((*this)->thread != NULL) +  if (this->thread != NULL)      {        /* INTERNAL ERROR: There should be at least one slot left. */        return ESRCH;      }    else      { -      new = (_pthread_threads_thread_t *) malloc(sizeof(_pthread_threads_thread_t)); - -      if (new == NULL) -	{ -	  return ENOMEM; -	} - -      new->thread = thread; -      pthread_attr_init(&(new->attr)); -      new->cleanupstack = NULL; -      new->destructorstack = NULL; -      new->forkpreparestack = NULL; -      new->forkparentstack = NULL; -      new->forkchildstack = NULL; -      *this = new; +      this->thread = thread; +      pthread_attr_init(&(this->attr)); +      this->cleanupstack = NULL; +      this->destructorstack = NULL; +      this->forkpreparestack = NULL; +      this->forkparentstack = NULL; +      this->forkchildstack = NULL;      }    _pthread_threads_count++;    entry = this; +  pthread_mutex_unlock(&_pthread_count_mutex); +  /* END CRITICAL SECTION */ +    return 0;  } -_pthread_threads_thread ** +_pthread_threads_thread *  _pthread_find_thread_entry(pthread_t thread)  { -  _pthread_threads_thread_t ** this; -  _pthread_threads_thread_t ** start; +  _pthread_threads_thread_t * this; +  _pthread_threads_thread_t * start;    start = this = &_pthread_threads_table[_PTHREAD_HASH_INDEX(thread)]; -  while ((*this)->thread != thread) +  while (this->thread != thread)      {        this++; @@ -96,7 +93,7 @@ _pthread_find_thread_entry(pthread_t thread)  	  this = _pthread_threads_table;  	} -      if ((*this)->thread == NULL || this == start) +      if (this->thread == NULL || this == start)  	{  	  /* Failed to find the thread. */  	  return -1; @@ -107,12 +104,12 @@ _pthread_find_thread_entry(pthread_t thread)  }  void -_pthread_delete_thread_entry(_pthread_threads_thread_t ** this) +_pthread_delete_thread_entry(_pthread_threads_thread_t * this)  {    /* We don't check that the thread has been properly cleaned up, so       it had better be done already. */ -  _pthread_threads_thread ** this; -  _pthread_threads_thread ** entry; +  _pthread_threads_thread_t * this; +  _pthread_threads_thread_t * entry;    /* CRITICAL SECTION */    pthread_mutex_lock(&_pthread_count_mutex); @@ -125,12 +122,9 @@ _pthread_delete_thread_entry(_pthread_threads_thread_t ** this)        this = _PTHREAD_THIS;      } -  if (this != NULL) +  if (this->thread != NULL)      { -      entry = this; -      /* Do this first to avoid contention and then free the storage. */ -      this = NULL; -      free(*entry); +      this->thread = NULL;        if (_pthread_threads_count > 0)  	{ @@ -141,8 +135,11 @@ _pthread_delete_thread_entry(_pthread_threads_thread_t ** this)  	  /* FIXME: INTERNAL ERROR: This should not happen. */  	}      } +  else +    { +      /* FIXME: INTERNAL ERROR: This should not happen. */ +    }    pthread_mutex_unlock(&_pthread_count_mutex);    /* END CRITICAL SECTION */  } -  | 
