* 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>
* configure.in: Update to newer autoconf.

View 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;
}

View 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)));

View 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

View 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;
}

View 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 */

View 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;
@ -67,44 +67,44 @@
#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)