OSDN Git Service

* cygtls.cc (_cygtls::call): Call call2 using _my_tls.
authorcgf <cgf>
Thu, 25 May 2006 02:33:10 +0000 (02:33 +0000)
committercgf <cgf>
Thu, 25 May 2006 02:33:10 +0000 (02:33 +0000)
(_cygtls::init_exception_handler): Always replace existing exception handler
with cygwin exception handler.
* cygtls.h (_cygtls::call2): Remove static designation.
* dcrto.cc (dll_crt0_1): Define in a way that allows calling via _cygtls::call.
(_initialize_main_tls): Delete.
(_dll_crt0): Call dll_crt0_1 via cygtls::call.  Set _main_tls here.
* external.cc (cygwin_internal): Implement CW_CYGTLS_PADSIZE.
* include/sys/cygwin.h (CW_CYGTLS_PADSIZE): Define.
* tlsoffsets.h: Regenerate.

winsup/cygwin/ChangeLog
winsup/cygwin/cygtls.cc
winsup/cygwin/cygtls.h
winsup/cygwin/dcrt0.cc
winsup/cygwin/external.cc
winsup/cygwin/include/sys/cygwin.h
winsup/cygwin/tlsoffsets.h

index 67ecac1..fd23727 100644 (file)
@@ -1,5 +1,19 @@
 2006-05-24  Christopher Faylor  <cgf@timesys.com>
 
+       * cygtls.cc (_cygtls::call): Call call2 using _my_tls.
+       (_cygtls::init_exception_handler): Always replace existing exception
+       handler with cygwin exception handler.
+       * cygtls.h (_cygtls::call2): Remove static designation.
+       * dcrto.cc (dll_crt0_1): Define in a way that allows calling via
+       _cygtls::call.
+       (_initialize_main_tls): Delete.
+       (_dll_crt0): Call dll_crt0_1 via cygtls::call.  Set _main_tls here.
+       * external.cc (cygwin_internal): Implement CW_CYGTLS_PADSIZE.
+       * include/sys/cygwin.h (CW_CYGTLS_PADSIZE): Define.
+       * tlsoffsets.h: Regenerate.
+
+2006-05-24  Christopher Faylor  <cgf@timesys.com>
+
        * configure.in: Update to newer autoconf.
        (thanks to Steve Ellcey)
        * configure: Regenerate.
index 4f4fe06..d3a6756 100644 (file)
@@ -64,15 +64,15 @@ void
 _cygtls::call (DWORD (*func) (void *, void *), void *arg)
 {
   char buf[CYGTLS_PADSIZE];
-  call2 (func, arg, buf);
+  _my_tls.call2 (func, arg, buf);
 }
 
 void
 _cygtls::call2 (DWORD (*func) (void *, void *), void *arg, void *buf)
 {
-  _my_tls.init_thread (buf, func);
+  init_thread (buf, func);
   DWORD res = func (arg, buf);
-  _my_tls.remove (INFINITE);
+  remove (INFINITE);
   ExitThread (res);
 }
 
@@ -248,10 +248,7 @@ _cygtls::handle_threadlist_exception (EXCEPTION_RECORD *e, exception_list *frame
   return 0;
 }
 
-/* Set up the exception handler for the current thread.  The PowerPC & Mips
-   use compiler generated tables to set up the exception handlers for each
-   region of code, and the kernel walks the call list until it finds a region
-   of code that handles exceptions.  The x86 on the other hand uses segment
+/* Set up the exception handler for the current thread.  The x86 uses segment
    register fs, offset 0 to point to the current exception handler. */
 
 extern exception_list *_except_list asm ("%fs:0");
@@ -260,9 +257,7 @@ void
 _cygtls::init_exception_handler (exception_handler *eh)
 {
   el.handler = eh;
-  el.prev = _except_list;
-  if (!el.prev->prev && !el.prev->handler)
-    el.prev = &el;
+  el.prev = &el;
   _except_list = &el;
 }
 
index fb34df2..6379f8c 100644 (file)
@@ -138,6 +138,7 @@ typedef __uint32_t __stack_t;
 struct _cygtls
 {
   void (*func) /*gentls_offsets*/(int)/*gentls_offsets*/;
+  exception_list el;
   int saved_errno;
   int sa_flags;
   sigset_t oldmask;
@@ -159,7 +160,6 @@ struct _cygtls
   };
   struct _local_storage locals;
   class cygthread *_ctinfo;
-  exception_list el;
   san andreas;
   waitq wq;
   struct _cygtls *prev, *next;
@@ -176,7 +176,7 @@ struct _cygtls
   static void init ();
   void init_thread (void *, DWORD (*) (void *, void *));
   static void call (DWORD (*) (void *, void *), void *);
-  static void call2 (DWORD (*) (void *, void *), void *, void *) __attribute__ ((regparm (3)));
+  void call2 (DWORD (*) (void *, void *), void *, void *) __attribute__ ((regparm (3)));
   static struct _cygtls *find_tls (int sig);
   void remove (DWORD);
   void push (__stack_t) __attribute__ ((regparm (2)));
index 667699d..5469e75 100644 (file)
@@ -784,7 +784,7 @@ dll_crt0_0 ()
    opposed to being link-time loaded by Cygwin apps) from a non
    cygwin app via LoadLibrary.  */
 static void
-dll_crt0_1 (char *)
+dll_crt0_1 (void *, void *)
 {
   check_sanity_and_sync (user_data);
   malloc_init ();
@@ -953,37 +953,17 @@ dll_crt0_1 (char *)
     cygwin_exit (user_data->main (__argc, __argv, *user_data->envptr));
 }
 
-static void
-initialize_main_tls (char *padding)
-{
-  if (!_main_tls)
-    {
-      _main_tls = &_my_tls;
-      _main_tls->init_thread (padding, NULL);
-    }
-  return;
-}
-
-/* Wrap the real one, otherwise gdb gets confused about
-   two symbols with the same name, but different addresses.
-
-   UPTR is a pointer to global data that lives on the libc side of the
-   line [if one distinguishes the application from the dll].  */
-
 extern "C" void __stdcall
 _dll_crt0 ()
 {
   main_environ = user_data->envptr;
-
-  char padding[CYGTLS_PADSIZE];
-
   if (in_forkee)
     fork_info->alloc_stack ();
   else
     __sinit (_impure_ptr);
 
-  initialize_main_tls (padding);
-  dll_crt0_1 (padding);
+  _main_tls = &_my_tls;
+  _main_tls->call ((DWORD (*) (void *, void *)) dll_crt0_1, NULL);
 }
 
 void
index 6200730..a033df0 100644 (file)
@@ -348,6 +348,8 @@ cygwin_internal (cygwin_getinfo_types t, ...)
       case CW_SYNC_WINENV:
        sync_winenv ();
        return 0;
+      case CW_CYGTLS_PADSIZE:
+       return CYGTLS_PADSIZE;
       default:
        break;
     }
index 1380194..26bfee0 100644 (file)
@@ -86,7 +86,8 @@ typedef enum
     CW_ARGV,
     CW_ENVP,
     CW_DEBUG_SELF,
-    CW_SYNC_WINENV
+    CW_SYNC_WINENV,
+    CW_CYGTLS_PADSIZE
   } cygwin_getinfo_types;
 
 #define CW_NEXTPID     0x80000000      /* or with pid to get next one */
index 08702da..b0ddd9a 100644 (file)
@@ -3,44 +3,44 @@
 //; $tls::sizeof__cygtls = 4212;
 //; $tls::func = -12636;
 //; $tls::pfunc = 0;
-//; $tls::saved_errno = -12632;
-//; $tls::psaved_errno = 4;
-//; $tls::sa_flags = -12628;
-//; $tls::psa_flags = 8;
-//; $tls::oldmask = -12624;
-//; $tls::poldmask = 12;
-//; $tls::deltamask = -12620;
-//; $tls::pdeltamask = 16;
-//; $tls::event = -12616;
-//; $tls::pevent = 20;
-//; $tls::errno_addr = -12612;
-//; $tls::perrno_addr = 24;
-//; $tls::sigmask = -12608;
-//; $tls::psigmask = 28;
-//; $tls::sigwait_mask = -12604;
-//; $tls::psigwait_mask = 32;
-//; $tls::sigwait_info = -12600;
-//; $tls::psigwait_info = 36;
-//; $tls::thread_context = -12596;
-//; $tls::pthread_context = 40;
-//; $tls::thread_id = -12384;
-//; $tls::pthread_id = 252;
-//; $tls::threadkill = -12380;
-//; $tls::pthreadkill = 256;
-//; $tls::infodata = -12376;
-//; $tls::pinfodata = 260;
-//; $tls::tid = -12228;
-//; $tls::ptid = 408;
-//; $tls::local_clib = -12224;
-//; $tls::plocal_clib = 412;
-//; $tls::__dontuse = -12224;
-//; $tls::p__dontuse = 412;
-//; $tls::locals = -11160;
-//; $tls::plocals = 1476;
-//; $tls::_ctinfo = -9528;
-//; $tls::p_ctinfo = 3108;
-//; $tls::el = -9524;
-//; $tls::pel = 3112;
+//; $tls::el = -12632;
+//; $tls::pel = 4;
+//; $tls::saved_errno = -12624;
+//; $tls::psaved_errno = 12;
+//; $tls::sa_flags = -12620;
+//; $tls::psa_flags = 16;
+//; $tls::oldmask = -12616;
+//; $tls::poldmask = 20;
+//; $tls::deltamask = -12612;
+//; $tls::pdeltamask = 24;
+//; $tls::event = -12608;
+//; $tls::pevent = 28;
+//; $tls::errno_addr = -12604;
+//; $tls::perrno_addr = 32;
+//; $tls::sigmask = -12600;
+//; $tls::psigmask = 36;
+//; $tls::sigwait_mask = -12596;
+//; $tls::psigwait_mask = 40;
+//; $tls::sigwait_info = -12592;
+//; $tls::psigwait_info = 44;
+//; $tls::thread_context = -12588;
+//; $tls::pthread_context = 48;
+//; $tls::thread_id = -12376;
+//; $tls::pthread_id = 260;
+//; $tls::threadkill = -12372;
+//; $tls::pthreadkill = 264;
+//; $tls::infodata = -12368;
+//; $tls::pinfodata = 268;
+//; $tls::tid = -12220;
+//; $tls::ptid = 416;
+//; $tls::local_clib = -12216;
+//; $tls::plocal_clib = 420;
+//; $tls::__dontuse = -12216;
+//; $tls::p__dontuse = 420;
+//; $tls::locals = -11152;
+//; $tls::plocals = 1484;
+//; $tls::_ctinfo = -9520;
+//; $tls::p_ctinfo = 3116;
 //; $tls::andreas = -9516;
 //; $tls::pandreas = 3120;
 //; $tls::wq = -9508;
 
 #define tls_func (-12636)
 #define tls_pfunc (0)
-#define tls_saved_errno (-12632)
-#define tls_psaved_errno (4)
-#define tls_sa_flags (-12628)
-#define tls_psa_flags (8)
-#define tls_oldmask (-12624)
-#define tls_poldmask (12)
-#define tls_deltamask (-12620)
-#define tls_pdeltamask (16)
-#define tls_event (-12616)
-#define tls_pevent (20)
-#define tls_errno_addr (-12612)
-#define tls_perrno_addr (24)
-#define tls_sigmask (-12608)
-#define tls_psigmask (28)
-#define tls_sigwait_mask (-12604)
-#define tls_psigwait_mask (32)
-#define tls_sigwait_info (-12600)
-#define tls_psigwait_info (36)
-#define tls_thread_context (-12596)
-#define tls_pthread_context (40)
-#define tls_thread_id (-12384)
-#define tls_pthread_id (252)
-#define tls_threadkill (-12380)
-#define tls_pthreadkill (256)
-#define tls_infodata (-12376)
-#define tls_pinfodata (260)
-#define tls_tid (-12228)
-#define tls_ptid (408)
-#define tls_local_clib (-12224)
-#define tls_plocal_clib (412)
-#define tls___dontuse (-12224)
-#define tls_p__dontuse (412)
-#define tls_locals (-11160)
-#define tls_plocals (1476)
-#define tls__ctinfo (-9528)
-#define tls_p_ctinfo (3108)
-#define tls_el (-9524)
-#define tls_pel (3112)
+#define tls_el (-12632)
+#define tls_pel (4)
+#define tls_saved_errno (-12624)
+#define tls_psaved_errno (12)
+#define tls_sa_flags (-12620)
+#define tls_psa_flags (16)
+#define tls_oldmask (-12616)
+#define tls_poldmask (20)
+#define tls_deltamask (-12612)
+#define tls_pdeltamask (24)
+#define tls_event (-12608)
+#define tls_pevent (28)
+#define tls_errno_addr (-12604)
+#define tls_perrno_addr (32)
+#define tls_sigmask (-12600)
+#define tls_psigmask (36)
+#define tls_sigwait_mask (-12596)
+#define tls_psigwait_mask (40)
+#define tls_sigwait_info (-12592)
+#define tls_psigwait_info (44)
+#define tls_thread_context (-12588)
+#define tls_pthread_context (48)
+#define tls_thread_id (-12376)
+#define tls_pthread_id (260)
+#define tls_threadkill (-12372)
+#define tls_pthreadkill (264)
+#define tls_infodata (-12368)
+#define tls_pinfodata (268)
+#define tls_tid (-12220)
+#define tls_ptid (416)
+#define tls_local_clib (-12216)
+#define tls_plocal_clib (420)
+#define tls___dontuse (-12216)
+#define tls_p__dontuse (420)
+#define tls_locals (-11152)
+#define tls_plocals (1484)
+#define tls__ctinfo (-9520)
+#define tls_p_ctinfo (3116)
 #define tls_andreas (-9516)
 #define tls_pandreas (3120)
 #define tls_wq (-9508)