* 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.
This commit is contained in:
Christopher Faylor 2006-05-25 02:33:13 +00:00
parent 99fc5e10f3
commit 38229bcdcf
7 changed files with 104 additions and 112 deletions

View File

@ -1,3 +1,17 @@
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> 2006-05-24 Christopher Faylor <cgf@timesys.com>
* configure.in: Update to newer autoconf. * configure.in: Update to newer autoconf.

View File

@ -64,15 +64,15 @@ void
_cygtls::call (DWORD (*func) (void *, void *), void *arg) _cygtls::call (DWORD (*func) (void *, void *), void *arg)
{ {
char buf[CYGTLS_PADSIZE]; char buf[CYGTLS_PADSIZE];
call2 (func, arg, buf); _my_tls.call2 (func, arg, buf);
} }
void void
_cygtls::call2 (DWORD (*func) (void *, void *), void *arg, void *buf) _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); DWORD res = func (arg, buf);
_my_tls.remove (INFINITE); remove (INFINITE);
ExitThread (res); ExitThread (res);
} }
@ -248,10 +248,7 @@ _cygtls::handle_threadlist_exception (EXCEPTION_RECORD *e, exception_list *frame
return 0; return 0;
} }
/* Set up the exception handler for the current thread. The PowerPC & Mips /* Set up the exception handler for the current thread. The x86 uses segment
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
register fs, offset 0 to point to the current exception handler. */ register fs, offset 0 to point to the current exception handler. */
extern exception_list *_except_list asm ("%fs:0"); extern exception_list *_except_list asm ("%fs:0");
@ -260,9 +257,7 @@ void
_cygtls::init_exception_handler (exception_handler *eh) _cygtls::init_exception_handler (exception_handler *eh)
{ {
el.handler = eh; el.handler = eh;
el.prev = _except_list; el.prev = &el;
if (!el.prev->prev && !el.prev->handler)
el.prev = &el;
_except_list = &el; _except_list = &el;
} }

View File

@ -138,6 +138,7 @@ typedef __uint32_t __stack_t;
struct _cygtls struct _cygtls
{ {
void (*func) /*gentls_offsets*/(int)/*gentls_offsets*/; void (*func) /*gentls_offsets*/(int)/*gentls_offsets*/;
exception_list el;
int saved_errno; int saved_errno;
int sa_flags; int sa_flags;
sigset_t oldmask; sigset_t oldmask;
@ -159,7 +160,6 @@ struct _cygtls
}; };
struct _local_storage locals; struct _local_storage locals;
class cygthread *_ctinfo; class cygthread *_ctinfo;
exception_list el;
san andreas; san andreas;
waitq wq; waitq wq;
struct _cygtls *prev, *next; struct _cygtls *prev, *next;
@ -176,7 +176,7 @@ struct _cygtls
static void init (); static void init ();
void init_thread (void *, DWORD (*) (void *, void *)); void init_thread (void *, DWORD (*) (void *, void *));
static void call (DWORD (*) (void *, 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); static struct _cygtls *find_tls (int sig);
void remove (DWORD); void remove (DWORD);
void push (__stack_t) __attribute__ ((regparm (2))); void push (__stack_t) __attribute__ ((regparm (2)));

View File

@ -784,7 +784,7 @@ dll_crt0_0 ()
opposed to being link-time loaded by Cygwin apps) from a non opposed to being link-time loaded by Cygwin apps) from a non
cygwin app via LoadLibrary. */ cygwin app via LoadLibrary. */
static void static void
dll_crt0_1 (char *) dll_crt0_1 (void *, void *)
{ {
check_sanity_and_sync (user_data); check_sanity_and_sync (user_data);
malloc_init (); malloc_init ();
@ -953,37 +953,17 @@ dll_crt0_1 (char *)
cygwin_exit (user_data->main (__argc, __argv, *user_data->envptr)); 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 extern "C" void __stdcall
_dll_crt0 () _dll_crt0 ()
{ {
main_environ = user_data->envptr; main_environ = user_data->envptr;
char padding[CYGTLS_PADSIZE];
if (in_forkee) if (in_forkee)
fork_info->alloc_stack (); fork_info->alloc_stack ();
else else
__sinit (_impure_ptr); __sinit (_impure_ptr);
initialize_main_tls (padding); _main_tls = &_my_tls;
dll_crt0_1 (padding); _main_tls->call ((DWORD (*) (void *, void *)) dll_crt0_1, NULL);
} }
void void

View File

@ -348,6 +348,8 @@ cygwin_internal (cygwin_getinfo_types t, ...)
case CW_SYNC_WINENV: case CW_SYNC_WINENV:
sync_winenv (); sync_winenv ();
return 0; return 0;
case CW_CYGTLS_PADSIZE:
return CYGTLS_PADSIZE;
default: default:
break; break;
} }

View File

@ -86,7 +86,8 @@ typedef enum
CW_ARGV, CW_ARGV,
CW_ENVP, CW_ENVP,
CW_DEBUG_SELF, CW_DEBUG_SELF,
CW_SYNC_WINENV CW_SYNC_WINENV,
CW_CYGTLS_PADSIZE
} cygwin_getinfo_types; } cygwin_getinfo_types;
#define CW_NEXTPID 0x80000000 /* or with pid to get next one */ #define CW_NEXTPID 0x80000000 /* or with pid to get next one */

View File

@ -3,44 +3,44 @@
//; $tls::sizeof__cygtls = 4212; //; $tls::sizeof__cygtls = 4212;
//; $tls::func = -12636; //; $tls::func = -12636;
//; $tls::pfunc = 0; //; $tls::pfunc = 0;
//; $tls::saved_errno = -12632; //; $tls::el = -12632;
//; $tls::psaved_errno = 4; //; $tls::pel = 4;
//; $tls::sa_flags = -12628; //; $tls::saved_errno = -12624;
//; $tls::psa_flags = 8; //; $tls::psaved_errno = 12;
//; $tls::oldmask = -12624; //; $tls::sa_flags = -12620;
//; $tls::poldmask = 12; //; $tls::psa_flags = 16;
//; $tls::deltamask = -12620; //; $tls::oldmask = -12616;
//; $tls::pdeltamask = 16; //; $tls::poldmask = 20;
//; $tls::event = -12616; //; $tls::deltamask = -12612;
//; $tls::pevent = 20; //; $tls::pdeltamask = 24;
//; $tls::errno_addr = -12612; //; $tls::event = -12608;
//; $tls::perrno_addr = 24; //; $tls::pevent = 28;
//; $tls::sigmask = -12608; //; $tls::errno_addr = -12604;
//; $tls::psigmask = 28; //; $tls::perrno_addr = 32;
//; $tls::sigwait_mask = -12604; //; $tls::sigmask = -12600;
//; $tls::psigwait_mask = 32; //; $tls::psigmask = 36;
//; $tls::sigwait_info = -12600; //; $tls::sigwait_mask = -12596;
//; $tls::psigwait_info = 36; //; $tls::psigwait_mask = 40;
//; $tls::thread_context = -12596; //; $tls::sigwait_info = -12592;
//; $tls::pthread_context = 40; //; $tls::psigwait_info = 44;
//; $tls::thread_id = -12384; //; $tls::thread_context = -12588;
//; $tls::pthread_id = 252; //; $tls::pthread_context = 48;
//; $tls::threadkill = -12380; //; $tls::thread_id = -12376;
//; $tls::pthreadkill = 256; //; $tls::pthread_id = 260;
//; $tls::infodata = -12376; //; $tls::threadkill = -12372;
//; $tls::pinfodata = 260; //; $tls::pthreadkill = 264;
//; $tls::tid = -12228; //; $tls::infodata = -12368;
//; $tls::ptid = 408; //; $tls::pinfodata = 268;
//; $tls::local_clib = -12224; //; $tls::tid = -12220;
//; $tls::plocal_clib = 412; //; $tls::ptid = 416;
//; $tls::__dontuse = -12224; //; $tls::local_clib = -12216;
//; $tls::p__dontuse = 412; //; $tls::plocal_clib = 420;
//; $tls::locals = -11160; //; $tls::__dontuse = -12216;
//; $tls::plocals = 1476; //; $tls::p__dontuse = 420;
//; $tls::_ctinfo = -9528; //; $tls::locals = -11152;
//; $tls::p_ctinfo = 3108; //; $tls::plocals = 1484;
//; $tls::el = -9524; //; $tls::_ctinfo = -9520;
//; $tls::pel = 3112; //; $tls::p_ctinfo = 3116;
//; $tls::andreas = -9516; //; $tls::andreas = -9516;
//; $tls::pandreas = 3120; //; $tls::pandreas = 3120;
//; $tls::wq = -9508; //; $tls::wq = -9508;
@ -67,44 +67,44 @@
#define tls_func (-12636) #define tls_func (-12636)
#define tls_pfunc (0) #define tls_pfunc (0)
#define tls_saved_errno (-12632) #define tls_el (-12632)
#define tls_psaved_errno (4) #define tls_pel (4)
#define tls_sa_flags (-12628) #define tls_saved_errno (-12624)
#define tls_psa_flags (8) #define tls_psaved_errno (12)
#define tls_oldmask (-12624) #define tls_sa_flags (-12620)
#define tls_poldmask (12) #define tls_psa_flags (16)
#define tls_deltamask (-12620) #define tls_oldmask (-12616)
#define tls_pdeltamask (16) #define tls_poldmask (20)
#define tls_event (-12616) #define tls_deltamask (-12612)
#define tls_pevent (20) #define tls_pdeltamask (24)
#define tls_errno_addr (-12612) #define tls_event (-12608)
#define tls_perrno_addr (24) #define tls_pevent (28)
#define tls_sigmask (-12608) #define tls_errno_addr (-12604)
#define tls_psigmask (28) #define tls_perrno_addr (32)
#define tls_sigwait_mask (-12604) #define tls_sigmask (-12600)
#define tls_psigwait_mask (32) #define tls_psigmask (36)
#define tls_sigwait_info (-12600) #define tls_sigwait_mask (-12596)
#define tls_psigwait_info (36) #define tls_psigwait_mask (40)
#define tls_thread_context (-12596) #define tls_sigwait_info (-12592)
#define tls_pthread_context (40) #define tls_psigwait_info (44)
#define tls_thread_id (-12384) #define tls_thread_context (-12588)
#define tls_pthread_id (252) #define tls_pthread_context (48)
#define tls_threadkill (-12380) #define tls_thread_id (-12376)
#define tls_pthreadkill (256) #define tls_pthread_id (260)
#define tls_infodata (-12376) #define tls_threadkill (-12372)
#define tls_pinfodata (260) #define tls_pthreadkill (264)
#define tls_tid (-12228) #define tls_infodata (-12368)
#define tls_ptid (408) #define tls_pinfodata (268)
#define tls_local_clib (-12224) #define tls_tid (-12220)
#define tls_plocal_clib (412) #define tls_ptid (416)
#define tls___dontuse (-12224) #define tls_local_clib (-12216)
#define tls_p__dontuse (412) #define tls_plocal_clib (420)
#define tls_locals (-11160) #define tls___dontuse (-12216)
#define tls_plocals (1476) #define tls_p__dontuse (420)
#define tls__ctinfo (-9528) #define tls_locals (-11152)
#define tls_p_ctinfo (3108) #define tls_plocals (1484)
#define tls_el (-9524) #define tls__ctinfo (-9520)
#define tls_pel (3112) #define tls_p_ctinfo (3116)
#define tls_andreas (-9516) #define tls_andreas (-9516)
#define tls_pandreas (3120) #define tls_pandreas (3120)
#define tls_wq (-9508) #define tls_wq (-9508)