Christopher Faylor <cgf@redhat.com>
* init.cc (munge_threadfunc): Handle all instances of search_for. (prime_threads): Test threadfunc_ix[0].
This commit is contained in:
		| @@ -1,3 +1,9 @@ | |||||||
|  | 2004-03-19  Pierre Humblet  <pierre.humblet@ieee.org> | ||||||
|  | 	    Christopher Faylor  <cgf@redhat.com> | ||||||
|  |  | ||||||
|  | 	* init.cc (munge_threadfunc): Handle all instances of search_for. | ||||||
|  | 	(prime_threads): Test threadfunc_ix[0]. | ||||||
|  |  | ||||||
| 2004-03-21  Christopher Faylor  <cgf@redhat.com> | 2004-03-21  Christopher Faylor  <cgf@redhat.com> | ||||||
|  |  | ||||||
| 	* cygheap.cc (init_cheap): Set initial_sz to something or suffer | 	* cygheap.cc (init_cheap): Set initial_sz to something or suffer | ||||||
|   | |||||||
| @@ -17,7 +17,7 @@ details. */ | |||||||
|  |  | ||||||
| int NO_COPY dynamically_loaded; | int NO_COPY dynamically_loaded; | ||||||
| static char *search_for = (char *) cygthread::stub; | static char *search_for = (char *) cygthread::stub; | ||||||
| unsigned threadfunc_ix __attribute__((section ("cygwin_dll_common"), shared)) = 0; | unsigned threadfunc_ix[8] __attribute__((section ("cygwin_dll_common"), shared)); | ||||||
| DWORD tls_func; | DWORD tls_func; | ||||||
|  |  | ||||||
| HANDLE sync_startup; | HANDLE sync_startup; | ||||||
| @@ -45,7 +45,7 @@ calibration_thread (VOID *arg) | |||||||
| void | void | ||||||
| prime_threads () | prime_threads () | ||||||
| { | { | ||||||
|   if (!threadfunc_ix) |   if (!threadfunc_ix[0]) | ||||||
|     { |     { | ||||||
|       DWORD id; |       DWORD id; | ||||||
|       search_for = (char *) calibration_thread; |       search_for = (char *) calibration_thread; | ||||||
| @@ -58,32 +58,30 @@ prime_threads () | |||||||
| static void | static void | ||||||
| munge_threadfunc () | munge_threadfunc () | ||||||
| { | { | ||||||
|  |   int i; | ||||||
|   char **ebp = (char **) __builtin_frame_address (0); |   char **ebp = (char **) __builtin_frame_address (0); | ||||||
|   if (!threadfunc_ix) |   if (!threadfunc_ix[0]) | ||||||
|     { |     { | ||||||
|       for (char **peb = ebp; peb < (char **) _tlsbase; peb++) |       char **peb; | ||||||
|  |       char **top = (char **) _tlsbase; | ||||||
|  |       for (peb = ebp, i = 0; peb < top && i < 7; peb++) | ||||||
| 	if (*peb == search_for) | 	if (*peb == search_for) | ||||||
|  | 	  threadfunc_ix[i++] = peb - ebp; | ||||||
|  |       if (!threadfunc_ix[0]) | ||||||
| 	{ | 	{ | ||||||
| 	    threadfunc_ix = peb - ebp; |  | ||||||
| 	    goto foundit; |  | ||||||
| 	  } |  | ||||||
| #ifdef DEBUGGING_HARD |  | ||||||
|       system_printf ("non-fatal warning: unknown thread! search_for %p, cygthread::stub %p, calibration_thread %p, possible func offset %p", |  | ||||||
| 		     search_for, cygthread::stub, calibration_thread, ebp[137]); |  | ||||||
| #endif |  | ||||||
| 	  try_to_debug (); | 	  try_to_debug (); | ||||||
| 	  return; | 	  return; | ||||||
| 	} | 	} | ||||||
|  |     } | ||||||
|  |  | ||||||
| foundit: |   char *threadfunc = ebp[threadfunc_ix[0]]; | ||||||
|   char *threadfunc = ebp[threadfunc_ix]; |  | ||||||
|   if (threadfunc == (char *) calibration_thread) |   if (threadfunc == (char *) calibration_thread) | ||||||
|     /* no need for the overhead */; |     /* no need for the overhead */; | ||||||
|   else |   else | ||||||
|     { |     { | ||||||
|       ebp[threadfunc_ix] = (char *) threadfunc_fe; |       for (i = 0; threadfunc_ix[i]; i++)		 | ||||||
|  | 	ebp[threadfunc_ix[i]] = (char *) threadfunc_fe; | ||||||
|       ((char **) _tlsbase)[OLDFUNC_OFFSET] = threadfunc; |       ((char **) _tlsbase)[OLDFUNC_OFFSET] = threadfunc; | ||||||
|       // TlsSetValue (tls_func, (void *) threadfunc); |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user