This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
Jakub Jelinek <jakub@redhat.com> writes:
|> On Fri, Nov 30, 2001 at 10:42:51AM +0100, Andreas Schwab wrote:
|> > + if (sp >= __pthread_initial_thread_bos)
|> > + return &__pthread_initial_thread;
|>
|> How could it be initial thread? Even if it could (it cannot), for
|> FLOATING_STACKS, this is totally bogus test (sp >= -1) and for non-floating
|> stacks there is no guarantee that there are no thread stacks above initial
|> thread stack (think about sparc64, where sp initial thread stack is below VM
|> hole, while thread stacks can be in the mmap area (after VM hole)).
Here is now the updated patch, again tested on ia64:
2001-11-30 Andreas Schwab <schwab@suse.de>
* pthread.c (pthread_handle_sigcancel) [THREAD_SELF]: Double check
that self is the manager thread, and initialize the thread
register if not.
(thread_self_stack) [THREAD_SELF]: New function to find self via
stack pointer.
* manager.c (pthread_handle_create): Don't block cancel signal any
more.
--- manager.c.~1.76.~ Thu Nov 29 10:40:10 2001
+++ manager.c Fri Nov 30 12:26:10 2001
@@ -534,7 +534,6 @@
size_t guardsize = 0;
int pagesize = __getpagesize();
int saved_errno;
- sigset_t newmask, oldmask;
/* First check whether we have to change the policy and if yes, whether
we can do this. Normally this should be done by examining the
@@ -620,11 +619,6 @@
if ((mask & (__pthread_threads_events.event_bits[idx]
| event_maskp->event_bits[idx])) != 0)
{
- /* Block cancel signal in the child until it is fully
- initialized. */
- sigemptyset(&newmask);
- sigaddset(&newmask, __pthread_sig_cancel);
- sigprocmask(SIG_BLOCK, &newmask, &oldmask);
/* Lock the mutex the child will use now so that it will stop. */
__pthread_lock(new_thread->p_lock, NULL);
@@ -653,7 +647,6 @@
__pthread_sig_cancel, new_thread);
#endif
saved_errno = errno;
- sigprocmask(SIG_SETMASK, &oldmask, NULL);
if (pid != -1)
{
/* Now fill in the information about the new thread in
@@ -679,11 +672,6 @@
}
if (pid == 0)
{
- /* Block cancel signal in the child until it is fully
- initialized. */
- sigemptyset(&newmask);
- sigaddset(&newmask, __pthread_sig_cancel);
- sigprocmask(SIG_BLOCK, &newmask, &oldmask);
#ifdef NEED_SEPARATE_REGISTER_STACK
pid = __clone2(pthread_start_thread,
(void **)new_thread_bottom,
@@ -700,7 +688,6 @@
__pthread_sig_cancel, new_thread);
#endif /* !NEED_SEPARATE_REGISTER_STACK */
saved_errno = errno;
- sigprocmask(SIG_SETMASK, &oldmask, NULL);
}
/* Check if cloning succeeded */
if (pid == -1) {
--- pthread.c.~1.88.~ Thu Nov 29 10:40:10 2001
+++ pthread.c Fri Nov 30 12:27:44 2001
@@ -709,7 +709,7 @@
#ifndef THREAD_SELF
-pthread_descr __pthread_find_self()
+pthread_descr __pthread_find_self(void)
{
char * sp = CURRENT_STACK_FRAME;
pthread_handle h;
@@ -721,6 +721,21 @@
return h->h_descr;
}
+#else
+
+static pthread_descr thread_self_stack(void)
+{
+ char *sp = CURRENT_STACK_FRAME;
+ pthread_handle h;
+
+ if (sp >= __pthread_manager_thread_bos && sp < __pthread_manager_thread_tos)
+ return &__pthread_manager_thread;
+ h = __pthread_handles + 2;
+ while (! (sp <= (char *) h->h_descr && sp >= h->h_bottom))
+ h++;
+ return h->h_descr;
+}
+
#endif
/* Thread scheduling */
@@ -769,7 +784,7 @@
return 0;
}
-int __pthread_yield ()
+int __pthread_yield (void)
{
/* For now this is equivalent with the POSIX call. */
return sched_yield ();
@@ -841,8 +856,26 @@
if (self == &__pthread_manager_thread)
{
+#ifdef THREAD_SELF
+ /* A new thread might get a cancel signal before it is fully
+ initialized, so that the thread register might still point to the
+ manager thread. Double check that this is really the manager
+ thread. */
+ pthread_descr real_self = thread_self_stack();
+ if (real_self == &__pthread_manager_thread)
+ {
+ __pthread_manager_sighandler(sig);
+ return;
+ }
+ /* Oops, thread_self() isn't working yet.. */
+ self = real_self;
+# ifdef INIT_THREAD_SELF
+ INIT_THREAD_SELF(self, self->p_nr);
+# endif
+#else
__pthread_manager_sighandler(sig);
return;
+#endif
}
if (__builtin_expect (__pthread_exit_requested, 0)) {
/* Main thread should accumulate times for thread manager and its
@@ -884,7 +917,7 @@
Notice that we can't free the stack segments, as the forked thread
may hold pointers into them. */
-void __pthread_reset_main_thread()
+void __pthread_reset_main_thread(void)
{
pthread_descr self = thread_self();
struct rlimit limit;
--
Andreas Schwab "And now for something
Andreas.Schwab@suse.de completely different."
SuSE Labs, SuSE GmbH, Schanzäckerstr. 10, D-90443 Nürnberg
Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |