* 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.
This commit is contained in:
parent
f5133f95b0
commit
6946073e78
|
@ -1,3 +1,30 @@
|
|||
2004-02-08 Christopher Faylor <cgf@redhat.com>
|
||||
|
||||
* 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.
|
||||
|
||||
2004-02-06 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* cygserver.h (CYGWIN_SERVER_VERSION_API): Bump.
|
||||
|
|
|
@ -384,8 +384,7 @@ $(LIBGMON_A): $(GMON_OFILES) $(GMON_START)
|
|||
$(AR) rcv $(LIBGMON_A) $(GMON_OFILES)
|
||||
|
||||
$(API_VER): $(srcdir)/cygwin.din
|
||||
@echo Error: Version info is older than DLL API!;\
|
||||
false
|
||||
@echo Error: Version info is older than DLL API!
|
||||
|
||||
version.cc winver.o: winver_stamp
|
||||
@ :
|
||||
|
|
|
@ -272,7 +272,7 @@ struct init_cygheap
|
|||
void close_ctty ();
|
||||
};
|
||||
|
||||
#define CYGHEAPSIZE (sizeof (init_cygheap) + (20000 * sizeof (fhandler_union)) + (64 * 1024 * 1024))
|
||||
#define CYGHEAPSIZE (sizeof (init_cygheap) + (20000 * sizeof (fhandler_union)) + (32 * 1024 * 1024))
|
||||
|
||||
extern init_cygheap *cygheap;
|
||||
extern void *cygheap_max;
|
||||
|
|
|
@ -155,24 +155,14 @@ _threadinfo::remove (DWORD wait)
|
|||
void
|
||||
_threadinfo::push (__stack_t addr, bool exception)
|
||||
{
|
||||
if (exception)
|
||||
lock (true);
|
||||
*stackptr++ = (__stack_t) addr;
|
||||
if (exception)
|
||||
unlock ();
|
||||
set_state (exception);
|
||||
}
|
||||
|
||||
__stack_t
|
||||
_threadinfo::pop ()
|
||||
{
|
||||
#ifdef DEBUGGING
|
||||
assert (stackptr > stack);
|
||||
#endif
|
||||
__stack_t res = *--stackptr;
|
||||
#ifdef DEBUGGING
|
||||
*stackptr = 0;
|
||||
debug_printf ("popped %p, stack %p, stackptr %p", res, stack, stackptr);
|
||||
#endif
|
||||
return res;
|
||||
}
|
||||
|
||||
#define BAD_IX ((size_t) -1)
|
||||
static size_t NO_COPY threadlist_ix = BAD_IX;
|
||||
|
||||
|
|
|
@ -111,6 +111,7 @@ struct _threadinfo
|
|||
struct _threadinfo *prev, *next;
|
||||
__stack_t *stackptr;
|
||||
int sig;
|
||||
unsigned stacklock;
|
||||
__stack_t stack[TLS_STACK_SIZE];
|
||||
unsigned padding[0];
|
||||
|
||||
|
@ -123,7 +124,7 @@ struct _threadinfo
|
|||
static struct _threadinfo *find_tls (int sig);
|
||||
void remove (DWORD);
|
||||
void push (__stack_t, bool = false) __attribute__ ((regparm (3)));
|
||||
__stack_t pop ();
|
||||
__stack_t pop () __attribute__ ((regparm (1)));
|
||||
bool isinitialized () {return initialized == CYGTLS_INITIALIZED || initialized == CYGTLS_EXCEPTION;}
|
||||
void set_state (bool);
|
||||
void reset_exception ();
|
||||
|
@ -136,6 +137,8 @@ struct _threadinfo
|
|||
void set_siginfo (struct sigpacket *) __attribute__ ((regparm (3)));
|
||||
void set_threadkill () {threadkill = true;}
|
||||
void reset_threadkill () {threadkill = false;}
|
||||
int lock (int wait) __attribute__ ((regparm (2)));
|
||||
void unlock () __attribute__ ((regparm (1)));
|
||||
/*gentls_offsets*/
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
|
|
@ -479,19 +479,19 @@ fdimf NOSIGFE
|
|||
fdopen SIGFE
|
||||
_fdopen = fdopen SIGFE
|
||||
_fdopen64 = fdopen64 SIGFE
|
||||
feof NOSIGFE
|
||||
_feof = feof NOSIGFE
|
||||
feof SIGFE
|
||||
_feof = feof SIGFE
|
||||
ferror NOSIGFE
|
||||
_ferror = ferror NOSIGFE
|
||||
fflush NOSIGFE
|
||||
_fflush = fflush NOSIGFE
|
||||
fflush SIGFE
|
||||
_fflush = fflush SIGFE
|
||||
ffs NOSIGFE
|
||||
_ffs = ffs NOSIGFE
|
||||
fgetc SIGFE
|
||||
_fgetc = fgetc SIGFE
|
||||
fgetpos NOSIGFE
|
||||
_fgetpos = fgetpos NOSIGFE
|
||||
_fgetpos64 = fgetpos64 NOSIGFE
|
||||
fgetpos SIGFE
|
||||
_fgetpos = fgetpos SIGFE
|
||||
_fgetpos64 = fgetpos64 SIGFE
|
||||
fgets SIGFE
|
||||
_fgets = fgets SIGFE
|
||||
fileno NOSIGFE
|
||||
|
@ -503,7 +503,6 @@ _finitef = finitef NOSIGFE
|
|||
fiprintf SIGFE
|
||||
_fiprintf = fiprintf SIGFE
|
||||
flock SIGFE
|
||||
flock SIGFE
|
||||
floor NOSIGFE
|
||||
_floor = floor NOSIGFE
|
||||
floorf NOSIGFE
|
||||
|
@ -559,11 +558,11 @@ fstatfs SIGFE
|
|||
_fstatfs = fstatfs SIGFE
|
||||
fsync SIGFE
|
||||
_fsync = fsync SIGFE
|
||||
ftell NOSIGFE
|
||||
_ftell = ftell NOSIGFE
|
||||
ftello NOSIGFE
|
||||
_ftello = ftello NOSIGFE
|
||||
_ftello64 = ftello64 NOSIGFE
|
||||
ftell SIGFE
|
||||
_ftell = ftell SIGFE
|
||||
ftello SIGFE
|
||||
_ftello = ftello SIGFE
|
||||
_ftello64 = ftello64 SIGFE
|
||||
ftime SIGFE
|
||||
_ftime = ftime SIGFE
|
||||
ftok SIGFE
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -88,40 +88,79 @@ EOF
|
|||
if (!$main::first++) {
|
||||
$res = <<EOF . longjmp () . $res;
|
||||
.text
|
||||
.global __sigbe
|
||||
.global _sigreturn
|
||||
.global _sigdelayed
|
||||
|
||||
.stabs "_sigfe:F(0,1)",36,0,0,__sigbe
|
||||
__sigfe:
|
||||
pushl %edx
|
||||
movl %fs:4,%eax
|
||||
movl \$4,%edx
|
||||
xadd %edx,$tls::stackptr(%eax)
|
||||
leal __sigbe,%eax
|
||||
xchg %eax,8(%esp)
|
||||
movl %eax,(%edx)
|
||||
movl %fs:4,%edx
|
||||
1: movl \$1,%eax
|
||||
lock cmpxchg %eax,$tls::stacklock(%edx)
|
||||
jne 2f
|
||||
xorl %eax,%eax
|
||||
call _low_priority_sleep
|
||||
jmp 1b
|
||||
2: movl \$4,%eax
|
||||
xadd %eax,$tls::stackptr(%edx)
|
||||
decl $tls::stacklock(%edx)
|
||||
leal __sigbe,%edx
|
||||
xchg %edx,8(%esp)
|
||||
movl %edx,(%eax)
|
||||
popl %edx
|
||||
ret
|
||||
|
||||
.global __sigbe
|
||||
.stabs "_sigbe:F(0,1)",36,0,0,__sigbe
|
||||
__sigbe:
|
||||
pushl %eax
|
||||
pushl %edx
|
||||
movl \$-4,%edx
|
||||
1: movl %fs:4,%eax
|
||||
xadd %edx,$tls::stackptr(%eax)
|
||||
pushl %eax
|
||||
movl %fs:4,%edx
|
||||
1: movl \$1,%eax
|
||||
lock cmpxchg %eax,$tls::stacklock(%edx)
|
||||
jne 2f
|
||||
xorl %eax,%eax
|
||||
lock xchg %eax,-4(%edx)
|
||||
testl %eax,%eax
|
||||
jnz 2f
|
||||
call _low_priority_sleep
|
||||
xorl %edx,%edx
|
||||
jmp 1b
|
||||
2: xchg %eax,4(%esp)
|
||||
popl %edx
|
||||
2: movl \$-4,%eax
|
||||
xadd %eax,$tls::stackptr(%edx)
|
||||
xchg %edx,-4(%eax)
|
||||
xchg %edx,4(%esp)
|
||||
popl %eax
|
||||
ret
|
||||
|
||||
.global __ZN11_threadinfo3popEv
|
||||
__ZN11_threadinfo3popEv:
|
||||
1: pushl %ebx
|
||||
movl %eax,%edx
|
||||
movl \$-4,%ebx
|
||||
xadd %ebx,$tls::pstackptr(%edx)
|
||||
xorl %eax,%eax
|
||||
xchg %eax,-4(%ebx)
|
||||
decl $tls::pstacklock(%edx)
|
||||
popl %ebx
|
||||
ret
|
||||
|
||||
.global __ZN11_threadinfo4lockEi
|
||||
__ZN11_threadinfo4lockEi:
|
||||
pushl %ebx
|
||||
movl %eax,%ebx
|
||||
1: movl \$1,%eax
|
||||
lock cmpxchg %eax,$tls::pstacklock(%ebx)
|
||||
jne 2f
|
||||
cmpl %edx,%edx
|
||||
jz 2f
|
||||
xorl %eax,%eax
|
||||
call _low_priority_sleep
|
||||
jmp 1b
|
||||
2: xorl \$1,%eax
|
||||
popl %ebx
|
||||
ret
|
||||
|
||||
.global __ZN11_threadinfo6unlockEv
|
||||
__ZN11_threadinfo6unlockEv:
|
||||
decl $tls::pstacklock(%eax)
|
||||
ret
|
||||
|
||||
.global _sigreturn
|
||||
.stabs "sigreturn:F(0,1)",36,0,0,_sigreturn
|
||||
_sigreturn:
|
||||
addl \$4,%esp # Remove argument
|
||||
|
@ -147,6 +186,7 @@ _sigreturn:
|
|||
popl %ebp
|
||||
jmp __sigbe
|
||||
|
||||
.global _sigdelayed
|
||||
.stabs "sigdelayed:F(0,1)",36,0,0,_sigdelayed
|
||||
_sigdelayed:
|
||||
pushl %ebp
|
||||
|
|
|
@ -50,14 +50,17 @@ main(int argc, char **argv)
|
|||
$struct foo[1];
|
||||
# define foo_end ((char *) (foo + 1))
|
||||
# define offset(f) (((char *) &(foo->f)) - foo_end)
|
||||
# define poffset(f) (((char *) &(foo->f)) - ((char *) foo))
|
||||
EOF
|
||||
print TMP 'puts ("//;# autogenerated: Do not edit.\n");', "\n\n";
|
||||
for my $f (@fields) {
|
||||
print TMP ' printf ("//; $tls::', $f, ' = %d;\n", ', "offset($f));\n";
|
||||
print TMP ' printf ("//; $tls::p', $f, ' = %d;\n", ', "poffset($f));\n";
|
||||
}
|
||||
print TMP ' puts ("//; __DATA__\n");', "\n";
|
||||
for my $f (@fields) {
|
||||
print TMP ' printf ("#define tls_', $f, ' (%d)\n", ', "offset($f));\n";
|
||||
print TMP ' printf ("#define tls_p', $f, ' (%d)\n", ', "poffset($f));\n";
|
||||
}
|
||||
|
||||
print TMP <<EOF;
|
||||
|
|
|
@ -1565,6 +1565,7 @@ localtime(const time_t *timep)
|
|||
extern "C" struct tm *
|
||||
localtime_r(const time_t *timep, struct tm *tm)
|
||||
{
|
||||
tzset();
|
||||
localsub(timep, 0L, tm);
|
||||
return tm;
|
||||
}
|
||||
|
|
|
@ -1,48 +1,96 @@
|
|||
//;# autogenerated: Do not edit.
|
||||
|
||||
//; $tls::func = -3736;
|
||||
//; $tls::saved_errno = -3732;
|
||||
//; $tls::sa_flags = -3728;
|
||||
//; $tls::oldmask = -3724;
|
||||
//; $tls::newmask = -3720;
|
||||
//; $tls::event = -3716;
|
||||
//; $tls::errno_addr = -3712;
|
||||
//; $tls::initialized = -3708;
|
||||
//; $tls::sigmask = -3704;
|
||||
//; $tls::sigwait_mask = -3700;
|
||||
//; $tls::sigwait_info = -3696;
|
||||
//; $tls::threadkill = -3692;
|
||||
//; $tls::infodata = -3688;
|
||||
//; $tls::tid = -3540;
|
||||
//; $tls::local_clib = -3536;
|
||||
//; $tls::locals = -2608;
|
||||
//; $tls::prev = -1040;
|
||||
//; $tls::next = -1036;
|
||||
//; $tls::stackptr = -1032;
|
||||
//; $tls::sig = -1028;
|
||||
//; $tls::func = -3740;
|
||||
//; $tls::pfunc = 0;
|
||||
//; $tls::saved_errno = -3736;
|
||||
//; $tls::psaved_errno = 4;
|
||||
//; $tls::sa_flags = -3732;
|
||||
//; $tls::psa_flags = 8;
|
||||
//; $tls::oldmask = -3728;
|
||||
//; $tls::poldmask = 12;
|
||||
//; $tls::newmask = -3724;
|
||||
//; $tls::pnewmask = 16;
|
||||
//; $tls::event = -3720;
|
||||
//; $tls::pevent = 20;
|
||||
//; $tls::errno_addr = -3716;
|
||||
//; $tls::perrno_addr = 24;
|
||||
//; $tls::initialized = -3712;
|
||||
//; $tls::pinitialized = 28;
|
||||
//; $tls::sigmask = -3708;
|
||||
//; $tls::psigmask = 32;
|
||||
//; $tls::sigwait_mask = -3704;
|
||||
//; $tls::psigwait_mask = 36;
|
||||
//; $tls::sigwait_info = -3700;
|
||||
//; $tls::psigwait_info = 40;
|
||||
//; $tls::threadkill = -3696;
|
||||
//; $tls::pthreadkill = 44;
|
||||
//; $tls::infodata = -3692;
|
||||
//; $tls::pinfodata = 48;
|
||||
//; $tls::tid = -3544;
|
||||
//; $tls::ptid = 196;
|
||||
//; $tls::local_clib = -3540;
|
||||
//; $tls::plocal_clib = 200;
|
||||
//; $tls::locals = -2612;
|
||||
//; $tls::plocals = 1128;
|
||||
//; $tls::prev = -1044;
|
||||
//; $tls::pprev = 2696;
|
||||
//; $tls::next = -1040;
|
||||
//; $tls::pnext = 2700;
|
||||
//; $tls::stackptr = -1036;
|
||||
//; $tls::pstackptr = 2704;
|
||||
//; $tls::sig = -1032;
|
||||
//; $tls::psig = 2708;
|
||||
//; $tls::stacklock = -1028;
|
||||
//; $tls::pstacklock = 2712;
|
||||
//; $tls::stack = -1024;
|
||||
//; $tls::pstack = 2716;
|
||||
//; $tls::padding = 0;
|
||||
//; $tls::ppadding = 3740;
|
||||
//; __DATA__
|
||||
|
||||
#define tls_func (-3736)
|
||||
#define tls_saved_errno (-3732)
|
||||
#define tls_sa_flags (-3728)
|
||||
#define tls_oldmask (-3724)
|
||||
#define tls_newmask (-3720)
|
||||
#define tls_event (-3716)
|
||||
#define tls_errno_addr (-3712)
|
||||
#define tls_initialized (-3708)
|
||||
#define tls_sigmask (-3704)
|
||||
#define tls_sigwait_mask (-3700)
|
||||
#define tls_sigwait_info (-3696)
|
||||
#define tls_threadkill (-3692)
|
||||
#define tls_infodata (-3688)
|
||||
#define tls_tid (-3540)
|
||||
#define tls_local_clib (-3536)
|
||||
#define tls_locals (-2608)
|
||||
#define tls_prev (-1040)
|
||||
#define tls_next (-1036)
|
||||
#define tls_stackptr (-1032)
|
||||
#define tls_sig (-1028)
|
||||
#define tls_func (-3740)
|
||||
#define tls_pfunc (0)
|
||||
#define tls_saved_errno (-3736)
|
||||
#define tls_psaved_errno (4)
|
||||
#define tls_sa_flags (-3732)
|
||||
#define tls_psa_flags (8)
|
||||
#define tls_oldmask (-3728)
|
||||
#define tls_poldmask (12)
|
||||
#define tls_newmask (-3724)
|
||||
#define tls_pnewmask (16)
|
||||
#define tls_event (-3720)
|
||||
#define tls_pevent (20)
|
||||
#define tls_errno_addr (-3716)
|
||||
#define tls_perrno_addr (24)
|
||||
#define tls_initialized (-3712)
|
||||
#define tls_pinitialized (28)
|
||||
#define tls_sigmask (-3708)
|
||||
#define tls_psigmask (32)
|
||||
#define tls_sigwait_mask (-3704)
|
||||
#define tls_psigwait_mask (36)
|
||||
#define tls_sigwait_info (-3700)
|
||||
#define tls_psigwait_info (40)
|
||||
#define tls_threadkill (-3696)
|
||||
#define tls_pthreadkill (44)
|
||||
#define tls_infodata (-3692)
|
||||
#define tls_pinfodata (48)
|
||||
#define tls_tid (-3544)
|
||||
#define tls_ptid (196)
|
||||
#define tls_local_clib (-3540)
|
||||
#define tls_plocal_clib (200)
|
||||
#define tls_locals (-2612)
|
||||
#define tls_plocals (1128)
|
||||
#define tls_prev (-1044)
|
||||
#define tls_pprev (2696)
|
||||
#define tls_next (-1040)
|
||||
#define tls_pnext (2700)
|
||||
#define tls_stackptr (-1036)
|
||||
#define tls_pstackptr (2704)
|
||||
#define tls_sig (-1032)
|
||||
#define tls_psig (2708)
|
||||
#define tls_stacklock (-1028)
|
||||
#define tls_pstacklock (2712)
|
||||
#define tls_stack (-1024)
|
||||
#define tls_pstack (2716)
|
||||
#define tls_padding (0)
|
||||
#define tls_ppadding (3740)
|
||||
|
|
Loading…
Reference in New Issue