* sysdeps/unix/sysv/linux/fork.c (__libc_fork): Reset refcntr in

new thread, don't just decrement it.
	Patch by Suzuki K P <suzuki@in.ibm.com>.
This commit is contained in:
Ulrich Drepper 2007-02-25 21:44:22 +00:00
parent 621c133d40
commit 00a1430e3f
3 changed files with 14 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2007-02-25 Ulrich Drepper <drepper@redhat.com>
* sysdeps/unix/sysv/linux/fork.c (__libc_fork): Reset refcntr in
new thread, don't just decrement it.
Patch by Suzuki K P <suzuki@in.ibm.com>.
2007-02-21 Ulrich Drepper <drepper@redhat.com> 2007-02-21 Ulrich Drepper <drepper@redhat.com>
* sysdeps/pthread/pthread-functions.h: Correct last patch, correct * sysdeps/pthread/pthread-functions.h: Correct last patch, correct

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. /* Copyright (C) 2002, 2003, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@ -167,8 +167,11 @@ __libc_fork (void)
allp->handler->child_handler (); allp->handler->child_handler ();
/* Note that we do not have to wake any possible waiter. /* Note that we do not have to wake any possible waiter.
This is the only thread in the new process. */ This is the only thread in the new process. The count
--allp->handler->refcntr; may have been bumped up by other threads doing a fork.
We reset it to 1, to avoid waiting for non-existing
thread(s) to release the count. */
allp->handler->refcntr = 1;
/* XXX We could at this point look through the object pool /* XXX We could at this point look through the object pool
and mark all objects not on the __fork_handlers list as and mark all objects not on the __fork_handlers list as

View File

@ -1031,13 +1031,13 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
exponent -= incr; exponent -= incr;
} }
if (int_no + exponent > MAX_10_EXP + 1) if (__builtin_expect (int_no + exponent > MAX_10_EXP + 1, 0))
{ {
__set_errno (ERANGE); __set_errno (ERANGE);
return negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL; return negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL;
} }
if (exponent < MIN_10_EXP - (DIG + 1)) if (__builtin_expect (exponent < MIN_10_EXP - (DIG + 1), 0))
{ {
__set_errno (ERANGE); __set_errno (ERANGE);
return 0.0; return 0.0;