Update some copyrights.
* cygtls.cc (_cygtls::call): Invoke new exception protection here. (_cygtls::init_thread): Remove conditionalized exception handler setup. (exception_list): Delete declaration. (_cygtls::init_exception_handler): Delete obsolete function. * cygtls.h: Remove (now) unneeded include. (_cygtls): Make this a real C++ class. (_cygtls::handle_exceptions): Remove. (_cygtls::init_exception_handler): Remove. (_cygtls::call2): Make private. (myfault::faulted): Remove unneeded parentheses. * dcrt0.cc (dll_crt0_1): Remove exception handler setup. * dlfcn.cc (dlopen): Ditto. (dlclose): Ditto. * dll_init.cc (dll_dllcrt0_1): Ditto. (dll_list::detach): Use new exception handler protection. * exceptions.cc (dump_exception): Rename to prevent confusion with new class. (exception::handle): Rename from _cygtls::handle_exceptions. Accommodate new exception class. Accommodate rename to dump_exception. * tlsoffsets.h: Regenerate.
This commit is contained in:
parent
d5d5bf4dd5
commit
98a97ac6cf
|
@ -1,3 +1,27 @@
|
||||||
|
2010-02-27 Christopher Faylor <me+cygwin@cgf.cx>
|
||||||
|
|
||||||
|
Update some copyrights.
|
||||||
|
* cygtls.cc (_cygtls::call): Invoke new exception protection here.
|
||||||
|
(_cygtls::init_thread): Remove conditionalized exception handler setup.
|
||||||
|
(exception_list): Delete declaration.
|
||||||
|
(_cygtls::init_exception_handler): Delete obsolete function.
|
||||||
|
* cygtls.h: Remove (now) unneeded include.
|
||||||
|
(_cygtls): Make this a real C++ class.
|
||||||
|
(_cygtls::handle_exceptions): Remove.
|
||||||
|
(_cygtls::init_exception_handler): Remove.
|
||||||
|
(_cygtls::call2): Make private.
|
||||||
|
(myfault::faulted): Remove unneeded parentheses.
|
||||||
|
* dcrt0.cc (dll_crt0_1): Remove exception handler setup.
|
||||||
|
* dlfcn.cc (dlopen): Ditto.
|
||||||
|
(dlclose): Ditto.
|
||||||
|
* dll_init.cc (dll_dllcrt0_1): Ditto.
|
||||||
|
(dll_list::detach): Use new exception handler protection.
|
||||||
|
* exceptions.cc (dump_exception): Rename to prevent confusion with new
|
||||||
|
class.
|
||||||
|
(exception::handle): Rename from _cygtls::handle_exceptions.
|
||||||
|
Accommodate new exception class. Accommodate rename to dump_exception.
|
||||||
|
* tlsoffsets.h: Regenerate.
|
||||||
|
|
||||||
2010-02-26 Christopher Faylor <me+cygwin@cgf.cx>
|
2010-02-26 Christopher Faylor <me+cygwin@cgf.cx>
|
||||||
|
|
||||||
* cygtls.h (_cygtls::init_exception_handler): Eliminate argument.
|
* cygtls.h (_cygtls::init_exception_handler): Eliminate argument.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* cygtls.cc
|
/* cygtls.cc
|
||||||
|
|
||||||
Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Red Hat, Inc.
|
Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Red Hat, Inc.
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of the
|
This software is a copyrighted work licensed under the terms of the
|
||||||
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||||
|
@ -15,6 +15,7 @@ details. */
|
||||||
#include "dtable.h"
|
#include "dtable.h"
|
||||||
#include "cygheap.h"
|
#include "cygheap.h"
|
||||||
#include "sigproc.h"
|
#include "sigproc.h"
|
||||||
|
#include "exception.h"
|
||||||
|
|
||||||
class sentry
|
class sentry
|
||||||
{
|
{
|
||||||
|
@ -54,6 +55,9 @@ 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];
|
||||||
|
/* Initialize this thread's ability to respond to things like
|
||||||
|
SIGSEGV or SIGFPE. */
|
||||||
|
exception protect;
|
||||||
_my_tls.call2 (func, arg, buf);
|
_my_tls.call2 (func, arg, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,9 +93,6 @@ _cygtls::init_thread (void *x, DWORD (*func) (void *, void *))
|
||||||
}
|
}
|
||||||
local_clib._current_locale = "C";
|
local_clib._current_locale = "C";
|
||||||
locals.process_logmask = LOG_UPTO (LOG_DEBUG);
|
locals.process_logmask = LOG_UPTO (LOG_DEBUG);
|
||||||
/* Initialize this thread's ability to respond to things like
|
|
||||||
SIGSEGV or SIGFPE. */
|
|
||||||
init_exception_handler ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
thread_id = GetCurrentThreadId ();
|
thread_id = GetCurrentThreadId ();
|
||||||
|
@ -219,63 +220,3 @@ _cygtls::set_siginfo (sigpacket *pack)
|
||||||
{
|
{
|
||||||
infodata = pack->si;
|
infodata = pack->si;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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");
|
|
||||||
|
|
||||||
void
|
|
||||||
_cygtls::init_exception_handler ()
|
|
||||||
{
|
|
||||||
/* Here in the distant past of 17-Jul-2009, we had an issue where Windows
|
|
||||||
2008 became YA perplexed because the cygwin exception handler was added
|
|
||||||
at the start of the SEH while still being in the list further on. This
|
|
||||||
was because we added a loop by setting el.prev to _except_list here.
|
|
||||||
Since el is reused in this thread, and this function can be called
|
|
||||||
more than once when a dll is loaded, this is not a good thing.
|
|
||||||
|
|
||||||
So, for now, until the next required tweak, we will just avoid adding the
|
|
||||||
cygwin exception handler if it is already on this list. This could present
|
|
||||||
a problem if some previous exception handler tries to do things that are
|
|
||||||
better left to Cygwin. I await the cygwin mailing list notification of
|
|
||||||
this event with bated breath.
|
|
||||||
(cgf 2009-07-17)
|
|
||||||
|
|
||||||
A change in plans: In the not-so-distant past of 2010-02-23 it was
|
|
||||||
discovered that something was moving in ahead of cygwin's exception
|
|
||||||
handler so just detecting that the exception handler was loaded wasn't
|
|
||||||
good enough. I sort of anticipated this. So, the next step is to remove
|
|
||||||
the old exception handler from the list and add it to the beginning.
|
|
||||||
|
|
||||||
The next step will probably be to call this function at various points
|
|
||||||
in cygwin (like from _cygtls::setup_fault maybe) to absolutely ensure that
|
|
||||||
we have control. For now, however, this seems good enough.
|
|
||||||
(cgf 2010-02-23)
|
|
||||||
*/
|
|
||||||
exception_list *e = _except_list;
|
|
||||||
if (e == &el)
|
|
||||||
return;
|
|
||||||
while (e && e != (exception_list *) -1)
|
|
||||||
if (e->prev != &el)
|
|
||||||
e = e->prev;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
e->prev = el.prev;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Apparently Windows stores some information about an exception and tries
|
|
||||||
to figure out if the SEH which returned 0 last time actually solved the
|
|
||||||
problem, or if the problem still persists (e.g. same exception at same
|
|
||||||
address). In this case Windows seems to decide that it can't trust
|
|
||||||
that SEH and calls the next handler in the chain instead.
|
|
||||||
|
|
||||||
At one point this was a loop (el.prev = ⪙). This outsmarted the
|
|
||||||
above behaviour. Unfortunately this trick doesn't work anymore with
|
|
||||||
Windows 2008, which irremediably gets into an endless loop, taking 100%
|
|
||||||
CPU. That's why we reverted to a normal SEH chain and changed the way
|
|
||||||
the exception handler returns to the application. */
|
|
||||||
el.handler = handle_exceptions;
|
|
||||||
el.prev = _except_list;
|
|
||||||
_except_list = ⪙
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* cygtls.h
|
/* cygtls.h
|
||||||
|
|
||||||
Copyright 2003, 2004, 2005, 2008, 2009 Red Hat, Inc.
|
Copyright 2003, 2004, 2005, 2008, 2009, 2010 Red Hat, Inc.
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of the
|
This software is a copyrighted work licensed under the terms of the
|
||||||
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||||
|
@ -17,7 +17,6 @@ details. */
|
||||||
#include <mntent.h>
|
#include <mntent.h>
|
||||||
#undef _NOMNTENT_FUNCS
|
#undef _NOMNTENT_FUNCS
|
||||||
#include <setjmp.h>
|
#include <setjmp.h>
|
||||||
#include <exceptions.h>
|
|
||||||
|
|
||||||
#define CYGTLS_INITIALIZED 0xc763173f
|
#define CYGTLS_INITIALIZED 0xc763173f
|
||||||
|
|
||||||
|
@ -173,10 +172,11 @@ extern "C" int __ljfault (jmp_buf, int);
|
||||||
/*gentls_offsets*/
|
/*gentls_offsets*/
|
||||||
|
|
||||||
typedef __uint32_t __stack_t;
|
typedef __uint32_t __stack_t;
|
||||||
struct _cygtls
|
|
||||||
|
class _cygtls
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
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;
|
||||||
|
@ -213,7 +213,6 @@ 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 *);
|
||||||
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)));
|
||||||
|
@ -229,10 +228,7 @@ struct _cygtls
|
||||||
struct sigaction& siga)
|
struct sigaction& siga)
|
||||||
__attribute__((regparm(3)));
|
__attribute__((regparm(3)));
|
||||||
|
|
||||||
/* exception handling */
|
|
||||||
static int handle_exceptions (EXCEPTION_RECORD *, exception_list *, CONTEXT *, void *);
|
|
||||||
bool inside_kernel (CONTEXT *);
|
bool inside_kernel (CONTEXT *);
|
||||||
void init_exception_handler () __attribute__ ((regparm(1)));
|
|
||||||
void signal_exit (int) __attribute__ ((noreturn, regparm(2)));
|
void signal_exit (int) __attribute__ ((noreturn, regparm(2)));
|
||||||
void copy_context (CONTEXT *) __attribute__ ((regparm(2)));
|
void copy_context (CONTEXT *) __attribute__ ((regparm(2)));
|
||||||
void signal_debugger (int) __attribute__ ((regparm(2)));
|
void signal_debugger (int) __attribute__ ((regparm(2)));
|
||||||
|
@ -249,6 +245,8 @@ struct _cygtls
|
||||||
void lock () __attribute__ ((regparm (1)));
|
void lock () __attribute__ ((regparm (1)));
|
||||||
void unlock () __attribute__ ((regparm (1)));
|
void unlock () __attribute__ ((regparm (1)));
|
||||||
bool locked () __attribute__ ((regparm (1)));
|
bool locked () __attribute__ ((regparm (1)));
|
||||||
|
private:
|
||||||
|
void call2 (DWORD (*) (void *, void *), void *, void *) __attribute__ ((regparm (3)));
|
||||||
/*gentls_offsets*/
|
/*gentls_offsets*/
|
||||||
};
|
};
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
@ -306,7 +304,7 @@ public:
|
||||||
}
|
}
|
||||||
inline int faulted (void const *obj, int myerrno = 0) __attribute__ ((always_inline))
|
inline int faulted (void const *obj, int myerrno = 0) __attribute__ ((always_inline))
|
||||||
{
|
{
|
||||||
return (!obj || !(*(const char **)obj)) || sebastian.setup (myerrno);
|
return !obj || !(*(const char **) obj) || sebastian.setup (myerrno);
|
||||||
}
|
}
|
||||||
inline int faulted (int myerrno) __attribute__ ((always_inline))
|
inline int faulted (int myerrno) __attribute__ ((always_inline))
|
||||||
{
|
{
|
||||||
|
|
|
@ -34,6 +34,7 @@ details. */
|
||||||
#include "dll_init.h"
|
#include "dll_init.h"
|
||||||
#include "heap.h"
|
#include "heap.h"
|
||||||
#include "tls_pbuf.h"
|
#include "tls_pbuf.h"
|
||||||
|
#include "exception.h"
|
||||||
|
|
||||||
#define MAX_AT_FILE_LEVEL 10
|
#define MAX_AT_FILE_LEVEL 10
|
||||||
|
|
||||||
|
@ -823,7 +824,6 @@ dll_crt0_1 (void *)
|
||||||
{
|
{
|
||||||
_tlsbase = (char *) fork_info->stackbottom;
|
_tlsbase = (char *) fork_info->stackbottom;
|
||||||
_tlstop = (char *) fork_info->stacktop;
|
_tlstop = (char *) fork_info->stacktop;
|
||||||
_my_tls.init_exception_handler ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
longjmp (fork_info->jmp, true);
|
longjmp (fork_info->jmp, true);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* dlfcn.cc
|
/* dlfcn.cc
|
||||||
|
|
||||||
Copyright 1998, 2000, 2001, 2002, 2003, 2004, 2008, 2009 Red Hat, Inc.
|
Copyright 1998, 2000, 2001, 2002, 2003, 2004, 2008, 2009, 2010 Red Hat, Inc.
|
||||||
|
|
||||||
This file is part of Cygwin.
|
This file is part of Cygwin.
|
||||||
|
|
||||||
|
@ -109,9 +109,6 @@ dlopen (const char *name, int)
|
||||||
|
|
||||||
ret = (void *) LoadLibraryW (path);
|
ret = (void *) LoadLibraryW (path);
|
||||||
|
|
||||||
/* In case it was removed by LoadLibrary. */
|
|
||||||
_my_tls.init_exception_handler ();
|
|
||||||
|
|
||||||
/* Restore original cxx_malloc pointer. */
|
/* Restore original cxx_malloc pointer. */
|
||||||
__cygwin_user_data.cxx_malloc = tmp_malloc;
|
__cygwin_user_data.cxx_malloc = tmp_malloc;
|
||||||
|
|
||||||
|
@ -163,15 +160,10 @@ dlclose (void *handle)
|
||||||
int ret;
|
int ret;
|
||||||
if (handle == GetModuleHandle (NULL))
|
if (handle == GetModuleHandle (NULL))
|
||||||
ret = 0;
|
ret = 0;
|
||||||
else
|
else if (FreeLibrary ((HMODULE) handle))
|
||||||
{
|
|
||||||
if (FreeLibrary ((HMODULE) handle))
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
else
|
else
|
||||||
ret = -1;
|
ret = -1;
|
||||||
/* In case it was removed by FreeLibrary */
|
|
||||||
_my_tls.init_exception_handler ();
|
|
||||||
}
|
|
||||||
if (ret)
|
if (ret)
|
||||||
set_dl_error ("dlclose");
|
set_dl_error ("dlclose");
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* dll_init.cc
|
/* dll_init.cc
|
||||||
|
|
||||||
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
|
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
|
||||||
2007, 2008, 2009 Red Hat, Inc.
|
2007, 2008, 2009, 2010 Red Hat, Inc.
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of the
|
This software is a copyrighted work licensed under the terms of the
|
||||||
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||||
|
@ -19,6 +19,7 @@ details. */
|
||||||
#include "cygheap.h"
|
#include "cygheap.h"
|
||||||
#include "pinfo.h"
|
#include "pinfo.h"
|
||||||
#include "cygtls.h"
|
#include "cygtls.h"
|
||||||
|
#include "exception.h"
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
#include <sys/reent.h>
|
#include <sys/reent.h>
|
||||||
|
|
||||||
|
@ -169,8 +170,8 @@ dll_list::detach (void *retaddr)
|
||||||
system_printf ("WARNING: trying to detach an already detached dll ...");
|
system_printf ("WARNING: trying to detach an already detached dll ...");
|
||||||
if (--d->count == 0)
|
if (--d->count == 0)
|
||||||
{
|
{
|
||||||
/* Make sure our exception handler is enabled for destructors */
|
/* Ensure our exception handler is enabled for destructors */
|
||||||
_my_tls.init_exception_handler ();
|
exception protect;
|
||||||
__cxa_finalize (d);
|
__cxa_finalize (d);
|
||||||
d->run_dtors ();
|
d->run_dtors ();
|
||||||
d->prev->next = d->next;
|
d->prev->next = d->next;
|
||||||
|
@ -324,15 +325,6 @@ dll_dllcrt0_1 (VOID *x)
|
||||||
per_process*& p = ((dllcrt0_info *)x)->p;
|
per_process*& p = ((dllcrt0_info *)x)->p;
|
||||||
int& res = ((dllcrt0_info *)x)->res;
|
int& res = ((dllcrt0_info *)x)->res;
|
||||||
|
|
||||||
/* Make sure that our exception handler is installed.
|
|
||||||
That should always be the case but this just makes sure.
|
|
||||||
|
|
||||||
At some point, we may want to just remove this code since
|
|
||||||
the exception handler should be guaranteed to be installed.
|
|
||||||
I'm leaving it in until potentially after the release of
|
|
||||||
1.7.1 */
|
|
||||||
_my_tls.init_exception_handler ();
|
|
||||||
|
|
||||||
if (p == NULL)
|
if (p == NULL)
|
||||||
p = &__cygwin_user_data;
|
p = &__cygwin_user_data;
|
||||||
else
|
else
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
/* exception.h
|
||||||
|
|
||||||
|
Copyright 2003, 2004, 2005, 2008, 2009 Red Hat, Inc.
|
||||||
|
|
||||||
|
This software is a copyrighted work licensed under the terms of the
|
||||||
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||||
|
details. */
|
||||||
|
|
||||||
|
#ifndef _EXCEPTION_H
|
||||||
|
#define _EXCEPTION_H
|
||||||
|
|
||||||
|
#include <exceptions.h>
|
||||||
|
|
||||||
|
extern exception_list *_except_list asm ("%fs:0");
|
||||||
|
|
||||||
|
class exception
|
||||||
|
{
|
||||||
|
exception_list el;
|
||||||
|
exception_list *save;
|
||||||
|
static int handle (EXCEPTION_RECORD *, exception_list *, CONTEXT *, void *);
|
||||||
|
public:
|
||||||
|
#ifdef DEBUG_EXCEPTION
|
||||||
|
exception ();
|
||||||
|
~exception ();
|
||||||
|
#else
|
||||||
|
exception () __attribute__ ((always_inline))
|
||||||
|
{
|
||||||
|
save = _except_list;
|
||||||
|
el.handler = handle;
|
||||||
|
el.prev = _except_list;
|
||||||
|
_except_list = ⪙
|
||||||
|
};
|
||||||
|
~exception () __attribute__ ((always_inline)) { _except_list = save; }
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /*_CYGTLS_H*/ /*gentls_offsets*/
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* exceptions.cc
|
/* exceptions.cc
|
||||||
|
|
||||||
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
||||||
2005, 2006, 2007, 2008, 2009 Red Hat, Inc.
|
2005, 2006, 2007, 2008, 2009, 2010 Red Hat, Inc.
|
||||||
|
|
||||||
This file is part of Cygwin.
|
This file is part of Cygwin.
|
||||||
|
|
||||||
|
@ -30,6 +30,7 @@ details. */
|
||||||
#include "cygheap.h"
|
#include "cygheap.h"
|
||||||
#include "child_info.h"
|
#include "child_info.h"
|
||||||
#include "ntdll.h"
|
#include "ntdll.h"
|
||||||
|
#include "exception.h"
|
||||||
|
|
||||||
#define CALL_HANDLER_RETRY 20
|
#define CALL_HANDLER_RETRY 20
|
||||||
|
|
||||||
|
@ -174,7 +175,7 @@ open_stackdumpfile ()
|
||||||
/* Utilities for dumping the stack, etc. */
|
/* Utilities for dumping the stack, etc. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
exception (EXCEPTION_RECORD *e, CONTEXT *in)
|
dump_exception (EXCEPTION_RECORD *e, CONTEXT *in)
|
||||||
{
|
{
|
||||||
const char *exception_name = NULL;
|
const char *exception_name = NULL;
|
||||||
|
|
||||||
|
@ -476,7 +477,7 @@ rtl_unwind (exception_list *frame, PEXCEPTION_RECORD e)
|
||||||
extern exception_list *_except_list asm ("%fs:0");
|
extern exception_list *_except_list asm ("%fs:0");
|
||||||
|
|
||||||
int
|
int
|
||||||
_cygtls::handle_exceptions (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, void *)
|
exception::handle (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, void *)
|
||||||
{
|
{
|
||||||
static bool NO_COPY debugging;
|
static bool NO_COPY debugging;
|
||||||
static int NO_COPY recursed;
|
static int NO_COPY recursed;
|
||||||
|
@ -630,7 +631,7 @@ _cygtls::handle_exceptions (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT
|
||||||
/* Temporarily replace windows top level SEH with our own handler.
|
/* Temporarily replace windows top level SEH with our own handler.
|
||||||
We don't want any Windows magic kicking in. This top level frame
|
We don't want any Windows magic kicking in. This top level frame
|
||||||
will be removed automatically after our exception handler returns. */
|
will be removed automatically after our exception handler returns. */
|
||||||
_except_list->handler = _cygtls::handle_exceptions;
|
_except_list->handler = handle;
|
||||||
|
|
||||||
if (masked
|
if (masked
|
||||||
|| &me == _sig_tls
|
|| &me == _sig_tls
|
||||||
|
@ -662,7 +663,7 @@ _cygtls::handle_exceptions (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT
|
||||||
|
|
||||||
rtl_unwind (frame, e);
|
rtl_unwind (frame, e);
|
||||||
open_stackdumpfile ();
|
open_stackdumpfile ();
|
||||||
exception (e, in);
|
dump_exception (e, in);
|
||||||
stackdump ((DWORD) ebp, 0, 1);
|
stackdump ((DWORD) ebp, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,121 +1,117 @@
|
||||||
//;# autogenerated: Do not edit.
|
//;# autogenerated: Do not edit.
|
||||||
|
|
||||||
//; $tls::sizeof__cygtls = 4312;
|
//; $tls::sizeof__cygtls = 4304;
|
||||||
//; $tls::func = -12700;
|
//; $tls::func = -12700;
|
||||||
//; $tls::pfunc = 0;
|
//; $tls::pfunc = 0;
|
||||||
//; $tls::el = -12696;
|
//; $tls::saved_errno = -12696;
|
||||||
//; $tls::pel = 4;
|
//; $tls::psaved_errno = 4;
|
||||||
//; $tls::saved_errno = -12688;
|
//; $tls::sa_flags = -12692;
|
||||||
//; $tls::psaved_errno = 12;
|
//; $tls::psa_flags = 8;
|
||||||
//; $tls::sa_flags = -12684;
|
//; $tls::oldmask = -12688;
|
||||||
//; $tls::psa_flags = 16;
|
//; $tls::poldmask = 12;
|
||||||
//; $tls::oldmask = -12680;
|
//; $tls::deltamask = -12684;
|
||||||
//; $tls::poldmask = 20;
|
//; $tls::pdeltamask = 16;
|
||||||
//; $tls::deltamask = -12676;
|
//; $tls::event = -12680;
|
||||||
//; $tls::pdeltamask = 24;
|
//; $tls::pevent = 20;
|
||||||
//; $tls::event = -12672;
|
//; $tls::errno_addr = -12676;
|
||||||
//; $tls::pevent = 28;
|
//; $tls::perrno_addr = 24;
|
||||||
//; $tls::errno_addr = -12668;
|
//; $tls::sigmask = -12672;
|
||||||
//; $tls::perrno_addr = 32;
|
//; $tls::psigmask = 28;
|
||||||
//; $tls::sigmask = -12664;
|
//; $tls::sigwait_mask = -12668;
|
||||||
//; $tls::psigmask = 36;
|
//; $tls::psigwait_mask = 32;
|
||||||
//; $tls::sigwait_mask = -12660;
|
//; $tls::sigwait_info = -12664;
|
||||||
//; $tls::psigwait_mask = 40;
|
//; $tls::psigwait_info = 36;
|
||||||
//; $tls::sigwait_info = -12656;
|
//; $tls::thread_context = -12660;
|
||||||
//; $tls::psigwait_info = 44;
|
//; $tls::pthread_context = 40;
|
||||||
//; $tls::thread_context = -12652;
|
//; $tls::thread_id = -12448;
|
||||||
//; $tls::pthread_context = 48;
|
//; $tls::pthread_id = 252;
|
||||||
//; $tls::thread_id = -12440;
|
//; $tls::threadkill = -12444;
|
||||||
//; $tls::pthread_id = 260;
|
//; $tls::pthreadkill = 256;
|
||||||
//; $tls::threadkill = -12436;
|
//; $tls::infodata = -12440;
|
||||||
//; $tls::pthreadkill = 264;
|
//; $tls::pinfodata = 260;
|
||||||
//; $tls::infodata = -12432;
|
//; $tls::tid = -12292;
|
||||||
//; $tls::pinfodata = 268;
|
//; $tls::ptid = 408;
|
||||||
//; $tls::tid = -12284;
|
//; $tls::local_clib = -12288;
|
||||||
//; $tls::ptid = 416;
|
//; $tls::plocal_clib = 412;
|
||||||
//; $tls::local_clib = -12280;
|
//; $tls::__dontuse = -12288;
|
||||||
//; $tls::plocal_clib = 420;
|
//; $tls::p__dontuse = 412;
|
||||||
//; $tls::__dontuse = -12280;
|
//; $tls::locals = -11200;
|
||||||
//; $tls::p__dontuse = 420;
|
//; $tls::plocals = 1500;
|
||||||
//; $tls::locals = -11192;
|
//; $tls::_ctinfo = -9480;
|
||||||
//; $tls::plocals = 1508;
|
//; $tls::p_ctinfo = 3220;
|
||||||
//; $tls::_ctinfo = -9472;
|
//; $tls::andreas = -9476;
|
||||||
//; $tls::p_ctinfo = 3228;
|
//; $tls::pandreas = 3224;
|
||||||
//; $tls::andreas = -9468;
|
//; $tls::wq = -9472;
|
||||||
//; $tls::pandreas = 3232;
|
//; $tls::pwq = 3228;
|
||||||
//; $tls::wq = -9464;
|
//; $tls::sig = -9444;
|
||||||
//; $tls::pwq = 3236;
|
//; $tls::psig = 3256;
|
||||||
//; $tls::sig = -9436;
|
//; $tls::incyg = -9440;
|
||||||
//; $tls::psig = 3264;
|
//; $tls::pincyg = 3260;
|
||||||
//; $tls::incyg = -9432;
|
//; $tls::spinning = -9436;
|
||||||
//; $tls::pincyg = 3268;
|
//; $tls::pspinning = 3264;
|
||||||
//; $tls::spinning = -9428;
|
//; $tls::stacklock = -9432;
|
||||||
//; $tls::pspinning = 3272;
|
//; $tls::pstacklock = 3268;
|
||||||
//; $tls::stacklock = -9424;
|
//; $tls::stackptr = -9428;
|
||||||
//; $tls::pstacklock = 3276;
|
//; $tls::pstackptr = 3272;
|
||||||
//; $tls::stackptr = -9420;
|
//; $tls::stack = -9424;
|
||||||
//; $tls::pstackptr = 3280;
|
//; $tls::pstack = 3276;
|
||||||
//; $tls::stack = -9416;
|
//; $tls::initialized = -8400;
|
||||||
//; $tls::pstack = 3284;
|
//; $tls::pinitialized = 4300;
|
||||||
//; $tls::initialized = -8392;
|
|
||||||
//; $tls::pinitialized = 4308;
|
|
||||||
//; __DATA__
|
//; __DATA__
|
||||||
|
|
||||||
#define tls_func (-12700)
|
#define tls_func (-12700)
|
||||||
#define tls_pfunc (0)
|
#define tls_pfunc (0)
|
||||||
#define tls_el (-12696)
|
#define tls_saved_errno (-12696)
|
||||||
#define tls_pel (4)
|
#define tls_psaved_errno (4)
|
||||||
#define tls_saved_errno (-12688)
|
#define tls_sa_flags (-12692)
|
||||||
#define tls_psaved_errno (12)
|
#define tls_psa_flags (8)
|
||||||
#define tls_sa_flags (-12684)
|
#define tls_oldmask (-12688)
|
||||||
#define tls_psa_flags (16)
|
#define tls_poldmask (12)
|
||||||
#define tls_oldmask (-12680)
|
#define tls_deltamask (-12684)
|
||||||
#define tls_poldmask (20)
|
#define tls_pdeltamask (16)
|
||||||
#define tls_deltamask (-12676)
|
#define tls_event (-12680)
|
||||||
#define tls_pdeltamask (24)
|
#define tls_pevent (20)
|
||||||
#define tls_event (-12672)
|
#define tls_errno_addr (-12676)
|
||||||
#define tls_pevent (28)
|
#define tls_perrno_addr (24)
|
||||||
#define tls_errno_addr (-12668)
|
#define tls_sigmask (-12672)
|
||||||
#define tls_perrno_addr (32)
|
#define tls_psigmask (28)
|
||||||
#define tls_sigmask (-12664)
|
#define tls_sigwait_mask (-12668)
|
||||||
#define tls_psigmask (36)
|
#define tls_psigwait_mask (32)
|
||||||
#define tls_sigwait_mask (-12660)
|
#define tls_sigwait_info (-12664)
|
||||||
#define tls_psigwait_mask (40)
|
#define tls_psigwait_info (36)
|
||||||
#define tls_sigwait_info (-12656)
|
#define tls_thread_context (-12660)
|
||||||
#define tls_psigwait_info (44)
|
#define tls_pthread_context (40)
|
||||||
#define tls_thread_context (-12652)
|
#define tls_thread_id (-12448)
|
||||||
#define tls_pthread_context (48)
|
#define tls_pthread_id (252)
|
||||||
#define tls_thread_id (-12440)
|
#define tls_threadkill (-12444)
|
||||||
#define tls_pthread_id (260)
|
#define tls_pthreadkill (256)
|
||||||
#define tls_threadkill (-12436)
|
#define tls_infodata (-12440)
|
||||||
#define tls_pthreadkill (264)
|
#define tls_pinfodata (260)
|
||||||
#define tls_infodata (-12432)
|
#define tls_tid (-12292)
|
||||||
#define tls_pinfodata (268)
|
#define tls_ptid (408)
|
||||||
#define tls_tid (-12284)
|
#define tls_local_clib (-12288)
|
||||||
#define tls_ptid (416)
|
#define tls_plocal_clib (412)
|
||||||
#define tls_local_clib (-12280)
|
#define tls___dontuse (-12288)
|
||||||
#define tls_plocal_clib (420)
|
#define tls_p__dontuse (412)
|
||||||
#define tls___dontuse (-12280)
|
#define tls_locals (-11200)
|
||||||
#define tls_p__dontuse (420)
|
#define tls_plocals (1500)
|
||||||
#define tls_locals (-11192)
|
#define tls__ctinfo (-9480)
|
||||||
#define tls_plocals (1508)
|
#define tls_p_ctinfo (3220)
|
||||||
#define tls__ctinfo (-9472)
|
#define tls_andreas (-9476)
|
||||||
#define tls_p_ctinfo (3228)
|
#define tls_pandreas (3224)
|
||||||
#define tls_andreas (-9468)
|
#define tls_wq (-9472)
|
||||||
#define tls_pandreas (3232)
|
#define tls_pwq (3228)
|
||||||
#define tls_wq (-9464)
|
#define tls_sig (-9444)
|
||||||
#define tls_pwq (3236)
|
#define tls_psig (3256)
|
||||||
#define tls_sig (-9436)
|
#define tls_incyg (-9440)
|
||||||
#define tls_psig (3264)
|
#define tls_pincyg (3260)
|
||||||
#define tls_incyg (-9432)
|
#define tls_spinning (-9436)
|
||||||
#define tls_pincyg (3268)
|
#define tls_pspinning (3264)
|
||||||
#define tls_spinning (-9428)
|
#define tls_stacklock (-9432)
|
||||||
#define tls_pspinning (3272)
|
#define tls_pstacklock (3268)
|
||||||
#define tls_stacklock (-9424)
|
#define tls_stackptr (-9428)
|
||||||
#define tls_pstacklock (3276)
|
#define tls_pstackptr (3272)
|
||||||
#define tls_stackptr (-9420)
|
#define tls_stack (-9424)
|
||||||
#define tls_pstackptr (3280)
|
#define tls_pstack (3276)
|
||||||
#define tls_stack (-9416)
|
#define tls_initialized (-8400)
|
||||||
#define tls_pstack (3284)
|
#define tls_pinitialized (4300)
|
||||||
#define tls_initialized (-8392)
|
|
||||||
#define tls_pinitialized (4308)
|
|
||||||
|
|
Loading…
Reference in New Issue