Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2004-02-08 22:59:27 +0300
committerChristopher Faylor <me@cgf.cx>2004-02-08 22:59:27 +0300
commit6946073e784471e1fc51fffd705b0cbc4d58e730 (patch)
tree76e1a45c0d78871721c0c1c807bc89e343cd1454 /winsup/cygwin/exceptions.cc
parentf5133f95b085c4fbe92fc5ca8fee9d5016257e4e (diff)
* localtime.cc (localtime_r): Call tzset.
* Makefile.in: Make version.h/cygwin.din version check a warning since it is not foolproof. * cygheap.h (CYGHEAPSIZE): Bump size down. * cygtls.h (_threadinfo::stacklock): New element. (_threadinfo::pop): Make regparm. (_threadinfo::lock): New function. (_threadinfo::unlock): New function. * cygtls.cc (_threadinfo::push): Wait for a lock on the stack before performing the operation. (_threadinfo::pop): Move to another file. * cygwin.din: More SIGFE changes. * exceptions.cc (try_to_debug): Always display messages on console. (handle_exceptions): Unwind stack only when actually about to call sig_send. (setup_handler): Lock stack prior to performing any operations. * gendef (_sigfe): Ditto. (_sigbe): Ditto. (_threadinfo::pop): Ditto. Move here. * gen_tlsoffsets: Generate positive offsets. * tlsoffsets.h: Regenerate.
Diffstat (limited to 'winsup/cygwin/exceptions.cc')
-rw-r--r--winsup/cygwin/exceptions.cc24
1 files changed, 14 insertions, 10 deletions
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index 4983a2ede..e90d093a2 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -361,8 +361,8 @@ try_to_debug (bool waitloop)
}
}
- small_printf ("*** starting debugger for pid %u\n",
- cygwin_pid (GetCurrentProcessId ()));
+ console_printf ("*** starting debugger for pid %u\n",
+ cygwin_pid (GetCurrentProcessId ()));
BOOL dbg;
dbg = CreateProcess (NULL,
debugger_command,
@@ -380,17 +380,18 @@ try_to_debug (bool waitloop)
else
{
if (!waitloop)
- return 1;
+ return dbg;
SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_IDLE);
while (!being_debugged ())
Sleep (0);
Sleep (2000);
- small_printf ("*** continuing pid %u from debugger call\n",
- cygwin_pid (GetCurrentProcessId ()));
}
+ console_printf ("*** continuing pid %u from debugger call (%d)\n",
+ cygwin_pid (GetCurrentProcessId ()), dbg);
+
SetThreadPriority (GetCurrentThread (), prio);
- return 0;
+ return dbg;
}
/* Main exception handler. */
@@ -416,10 +417,6 @@ handle_exceptions (EXCEPTION_RECORD *e0, void *frame, CONTEXT *in0, void *)
EXCEPTION_RECORD e = *e0;
CONTEXT in = *in0;
- extern DWORD ret_here[];
- RtlUnwind (frame, ret_here, e0, 0);
- __asm__ volatile (".equ _ret_here,.");
-
siginfo_t si;
/* Coerce win32 value to posix value. */
switch (e.ExceptionCode)
@@ -557,6 +554,10 @@ handle_exceptions (EXCEPTION_RECORD *e0, void *frame, CONTEXT *in0, void *)
signal_exit (0x80 | si.si_signo); // Flag signal + core dump
}
+ extern DWORD ret_here[];
+ RtlUnwind (frame, ret_here, e0, 0);
+ __asm__ volatile (".equ _ret_here,.");
+
si.si_addr = ebp;
si.si_code = SI_KERNEL;
si.si_errno = si.si_pid = si.si_uid = 0;
@@ -766,12 +767,15 @@ setup_handler (int sig, void *handler, struct sigaction& siga, _threadinfo *tls)
__stack_t *retaddr_on_stack = tls->stackptr - 1;
if (retaddr_on_stack >= tls->stack)
{
+ if (!tls->lock (false))
+ continue;
__stack_t retaddr = InterlockedExchange ((LONG *) retaddr_on_stack, 0);
if (!retaddr)
continue;
tls->reset_exception ();
tls->interrupt_setup (sig, handler, siga, retaddr);
sigproc_printf ("interrupted known cygwin routine");
+ tls->unlock ();
interrupted = true;
break;
}