From f549233427db72d1f3f51a1d4bca548361231b46 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 3 Feb 1999 09:31:42 +0000 Subject: [PATCH] Update. 1999-02-03 Jakub Jelinek * sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S: Set branch prediction correctly. * sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h: Signal takes a pointer to __sigcontext_t. * sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S: Do a nop after retl. * sysdeps/unix/sysv/linux/sparc/sparc32/Dist: Remove fork.S. --- ChangeLog | 10 ++++++++++ linuxthreads/ChangeLog | 11 +++++++++++ linuxthreads/manager.c | 8 +++----- linuxthreads/pthread.c | 7 ++++++- sysdeps/unix/sysv/linux/sparc/sparc32/Dist | 2 -- .../unix/sysv/linux/sparc/sparc32/profil-counter.h | 6 +++--- sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S | 10 +++++----- sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S | 3 ++- 8 files changed, 40 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 37874a6ac2..c732150085 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +1999-02-03 Jakub Jelinek + + * sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S: Set branch + prediction correctly. + + * sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h: Signal + takes a pointer to __sigcontext_t. + * sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S: Do a nop after retl. + * sysdeps/unix/sysv/linux/sparc/sparc32/Dist: Remove fork.S. + 1999-02-02 Andreas Schwab * manual/time.texi (General Time String Parsing): Fix typos. Fix diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index e65ee76222..352b34356f 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,14 @@ +1999-02-03 H.J. Lu + + * manager.c (__pthread_manager): Do block __pthread_sig_debug. + Don't restart the thread which sent REQ_DEBUG. + (pthread_start_thread): Check if __pthread_sig_debug > 0 + before debugging. + + * pthread.c (__pthread_initialize_manager): Suspend ourself + after sending __pthread_sig_debug to gdb instead of + __pthread_sig_cancel. + 1999-01-24 H.J. Lu * manager.c (__pthread_manager): Delete __pthread_sig_debug diff --git a/linuxthreads/manager.c b/linuxthreads/manager.c index 033e5adc5f..9657cc5731 100644 --- a/linuxthreads/manager.c +++ b/linuxthreads/manager.c @@ -104,8 +104,6 @@ int __pthread_manager(void *arg) /* Block all signals except __pthread_sig_cancel and SIGTRAP */ sigfillset(&mask); sigdelset(&mask, __pthread_sig_cancel); /* for thread termination */ - if (__pthread_sig_debug > 0) - sigdelset(&mask, __pthread_sig_debug); /* for debugging purposes */ sigdelset(&mask, SIGTRAP); /* for debugging purposes */ sigprocmask(SIG_SETMASK, &mask, NULL); /* Raise our priority to match that of main thread */ @@ -162,10 +160,10 @@ int __pthread_manager(void *arg) sem_post(request.req_args.post); break; case REQ_DEBUG: - /* Make gdb aware of new thread */ + /* Make gdb aware of new thread and gdb will restart the + new thread when it is ready to handle the new thread. */ if (__pthread_threads_debug && __pthread_sig_debug > 0) raise(__pthread_sig_debug); - restart(request.req_thread); break; } } @@ -195,7 +193,7 @@ static int pthread_start_thread(void *arg) THREAD_GETMEM(self, p_start_args.schedpolicy), &self->p_start_args.schedparam); /* Make gdb aware of new thread */ - if (__pthread_threads_debug) { + if (__pthread_threads_debug && __pthread_sig_debug > 0) { request.req_thread = self; request.req_kind = REQ_DEBUG; __libc_write(__pthread_manager_request, diff --git a/linuxthreads/pthread.c b/linuxthreads/pthread.c index 4d182a8695..42ed581bdb 100644 --- a/linuxthreads/pthread.c +++ b/linuxthreads/pthread.c @@ -309,7 +309,12 @@ int __pthread_initialize_manager(void) __pthread_manager_thread.p_pid = pid; /* Make gdb aware of new thread manager */ if (__pthread_threads_debug && __pthread_sig_debug > 0) - raise(__pthread_sig_cancel); + { + raise(__pthread_sig_debug); + /* We suspend ourself and gdb will wake us up when it is + ready to handle us. */ + suspend(thread_self()); + } /* Synchronize debugging of the thread manager */ request.req_kind = REQ_DEBUG; __libc_write(__pthread_manager_request, (char *) &request, sizeof(request)); diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/Dist b/sysdeps/unix/sysv/linux/sparc/sparc32/Dist index db60e2c49c..28968fd133 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/Dist +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/Dist @@ -1,6 +1,4 @@ clone.S -pipe.S -fork.S kernel_stat.h init-first.h setresuid.c diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h b/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h index 1bd06482c9..4937725ddf 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h @@ -1,5 +1,5 @@ /* Low-level statistical profiling support function. Linux/SPARC version. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 1999 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -20,7 +20,7 @@ #include void -profil_counter (int signo, __siginfo_t si) +profil_counter (int signo, __siginfo_t *si) { - profil_count ((void *) si.si_regs.pc); + profil_count ((void *) si->si_regs.pc); } diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S b/sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S index 38a6f8f8b8..49b1d28ac8 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S @@ -1,4 +1,4 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. +/* Copyright (C) 1997, 1999 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Miguel de Icaza , 1997. @@ -20,15 +20,15 @@ #include ENTRY (__libc_pipe) - mov %o0, %o2 /* Save PIPEDES. */ + mov %o0, %o2 /* Save PIPEDES. */ LOADSYSCALL(pipe) ta 0x6d - bcc,pn %xcc, 2f + bcc,pt %xcc, 2f nop SYSCALL_ERROR_HANDLER -2: st %o0, [%o2] /* PIPEDES[0] = %o0; */ - st %o1, [%o2 + 4] /* PIPEDES[1] = %o1; */ +2: st %o0, [%o2] /* PIPEDES[0] = %o0; */ + st %o1, [%o2 + 4] /* PIPEDES[1] = %o1; */ retl clr %o0 PSEUDO_END (__libc_pipe) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S b/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S index 5864bfcbc3..945d2e4df1 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S @@ -1,4 +1,4 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. +/* Copyright (C) 1997, 1999 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -35,5 +35,6 @@ ENTRY (syscall) SYSCALL_ERROR_HANDLER 1: retl + nop PSEUDO_END (syscall)