* cygthread.cc (hthreads): Remove unneeded global.
(cygthread::simplestub): New static member function. (cygthread::runner): Don't set hthreads. (cygthread::freerange): New member function. (cygthread::operator new): Call freerange if all cygwin slots are used up. (cygthread::exit_thread): Don't mess with event if freerange thread. (cygthread::detach): Ditto. * cygthread.h (class cygthread): Declare new member functions and variables.
This commit is contained in:
		
							parent
							
								
									64508b36f9
								
							
						
					
					
						commit
						d4d59223ed
					
				|  | @ -1,3 +1,16 @@ | |||
| 2002-08-28  Christopher Faylor  <cgf@redhat.com> | ||||
| 
 | ||||
| 	* cygthread.cc (hthreads): Remove unneeded global. | ||||
| 	(cygthread::simplestub): New static member function. | ||||
| 	(cygthread::runner): Don't set hthreads. | ||||
| 	(cygthread::freerange): New member function. | ||||
| 	(cygthread::operator new): Call freerange if all cygwin slots are used | ||||
| 	up. | ||||
| 	(cygthread::exit_thread): Don't mess with event if freerange thread. | ||||
| 	(cygthread::detach): Ditto. | ||||
| 	* cygthread.h (class cygthread): Declare new member functions and | ||||
| 	variables. | ||||
| 
 | ||||
| 2002-08-28  Christopher Faylor  <cgf@redhat.com> | ||||
| 
 | ||||
| 	* malloc.cc: Protect some definitions to avoid a compile time warning. | ||||
|  |  | |||
|  | @ -8,18 +8,36 @@ details. */ | |||
| 
 | ||||
| #include "winsup.h" | ||||
| #include <windows.h> | ||||
| #include <stdlib.h> | ||||
| #include "exceptions.h" | ||||
| #include "security.h" | ||||
| #include "cygthread.h" | ||||
| 
 | ||||
| #undef CloseHandle | ||||
| 
 | ||||
| static cygthread NO_COPY threads[8]; | ||||
| static cygthread NO_COPY threads[6]; | ||||
| #define NTHREADS (sizeof (threads) / sizeof (threads[0])) | ||||
| 
 | ||||
| static HANDLE NO_COPY hthreads[NTHREADS]; | ||||
| 
 | ||||
| DWORD NO_COPY cygthread::main_thread_id; | ||||
| bool cygthread::initialized; | ||||
| 
 | ||||
| /* Initial stub called by cygthread constructor. Performs initial
 | ||||
|    per-thread initialization and loops waiting for new thread functions | ||||
|    to execute.  */ | ||||
| DWORD WINAPI | ||||
| cygthread::simplestub (VOID *arg) | ||||
| { | ||||
|   DECLARE_TLS_STORAGE; | ||||
|   exception_list except_entry; | ||||
| 
 | ||||
|   /* Initialize this thread's ability to respond to things like
 | ||||
|      SIGSEGV or SIGFPE. */ | ||||
|   init_exceptions (&except_entry); | ||||
| 
 | ||||
|   cygthread *info = (cygthread *) arg; | ||||
|   info->func (info->arg == cygself ? info : info->arg); | ||||
|   ExitThread (0); | ||||
| } | ||||
| 
 | ||||
| /* Initial stub called by cygthread constructor. Performs initial
 | ||||
|    per-thread initialization and loops waiting for new thread functions | ||||
|  | @ -60,9 +78,9 @@ DWORD WINAPI | |||
| cygthread::runner (VOID *arg) | ||||
| { | ||||
|   for (unsigned i = 0; i < NTHREADS; i++) | ||||
|     hthreads[i] = threads[i].h = | ||||
|       CreateThread (&sec_none_nih, 0, cygthread::stub, &threads[i], | ||||
| 		    CREATE_SUSPENDED, &threads[i].avail); | ||||
|     threads[i].h = CreateThread (&sec_none_nih, 0, cygthread::stub, &threads[i], | ||||
| 				 CREATE_SUSPENDED, &threads[i].avail); | ||||
|   cygthread::initialized = true; | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
|  | @ -90,6 +108,17 @@ cygthread::is () | |||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| void * | ||||
| cygthread::freerange () | ||||
| { | ||||
|   cygthread *self = (cygthread *) calloc (1, sizeof (*self)); | ||||
|   self->is_freerange = true; | ||||
|   self->h = CreateThread (&sec_none_nih, 0, cygthread::simplestub, self, | ||||
| 			  CREATE_SUSPENDED, &self->id); | ||||
|   self->ev = self->h; | ||||
|   return self; | ||||
| } | ||||
| 
 | ||||
| void * cygthread::operator | ||||
| new (size_t) | ||||
| { | ||||
|  | @ -110,8 +139,10 @@ new (size_t) | |||
| 	    return info; | ||||
| 	  } | ||||
| 
 | ||||
|       /* thread_runner may not be finished yet. */ | ||||
|       Sleep (0); | ||||
|       if (!initialized) | ||||
| 	Sleep (0); /* thread_runner is not be finished yet. */ | ||||
|       else | ||||
| 	return freerange (); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -179,7 +210,8 @@ HANDLE () | |||
| void | ||||
| cygthread::exit_thread () | ||||
| { | ||||
|   SetEvent (*this); | ||||
|   if (!is_freerange) | ||||
|     SetEvent (*this); | ||||
|   ExitThread (0); | ||||
| } | ||||
| 
 | ||||
|  | @ -204,10 +236,18 @@ cygthread::detach () | |||
| 	  DWORD res = WaitForSingleObject (*this, INFINITE); | ||||
| 	  thread_printf ("WFSO returns %d, id %p", res, id); | ||||
| 	} | ||||
|       ResetEvent (*this); | ||||
|       id = 0; | ||||
|       __name = NULL; | ||||
|       /* Mark the thread as available by setting avail to non-zero */ | ||||
|       (void) InterlockedExchange ((LPLONG) &this->avail, avail); | ||||
|       if (is_freerange) | ||||
| 	{ | ||||
| 	  CloseHandle (h); | ||||
| 	  free (this); | ||||
| 	} | ||||
|       else | ||||
| 	{ | ||||
| 	  ResetEvent (*this); | ||||
| 	  id = 0; | ||||
| 	  __name = NULL; | ||||
| 	  /* Mark the thread as available by setting avail to non-zero */ | ||||
| 	  (void) InterlockedExchange ((LPLONG) &this->avail, avail); | ||||
| 	} | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -15,9 +15,13 @@ class cygthread | |||
|   const char *__name; | ||||
|   LPTHREAD_START_ROUTINE func; | ||||
|   VOID *arg; | ||||
|   bool is_freerange; | ||||
|   static DWORD main_thread_id; | ||||
|   static bool initialized; | ||||
|   static DWORD WINAPI runner (VOID *); | ||||
|   static DWORD WINAPI free_runner (VOID *); | ||||
|   static DWORD WINAPI stub (VOID *); | ||||
|   static DWORD WINAPI simplestub (VOID *); | ||||
|  public: | ||||
|   static const char * name (DWORD = 0); | ||||
|   cygthread (LPTHREAD_START_ROUTINE, LPVOID, const char *); | ||||
|  | @ -27,6 +31,7 @@ class cygthread | |||
|   operator HANDLE (); | ||||
|   static bool is (); | ||||
|   void * operator new (size_t); | ||||
|   static void * freerange (); | ||||
|   void exit_thread (); | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue