Skip to content

Commit

Permalink
Update.
Browse files Browse the repository at this point in the history
  • Loading branch information
Ulrich Drepper committed Jun 7, 2003
1 parent c3f90e2 commit b1bfeac
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 14 deletions.
4 changes: 0 additions & 4 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
2003-06-06 Ulrich Drepper <drepper@redhat.com>

* sysdeps/unix/sysv/linux/sleep.c (__sleep): Use nanosleep syscall
directly to avoid cancellation in the regular nanosleep
implementation.

* sysdeps/unix/sysv/linux/i386/sysdep.h (ASMFMT_2): Only allow
%edx for first parameter. This means no pushl and therefore the
unwind info isn't screwed up.
Expand Down
16 changes: 6 additions & 10 deletions sysdeps/unix/sysv/linux/sleep.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* Implementation of the POSIX sleep function using nanosleep.
Copyright (C) 1996, 1997, 1998, 1999, 2003 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
Expand All @@ -24,12 +24,8 @@
#include <unistd.h>

/* We are going to use the `nanosleep' syscall of the kernel. But the
kernel does not implement the stupid SysV SIGCHLD vs. SIG_IGN
behaviour for this syscall. Therefore we have to emulate it here.
Also note that we use the syscall directly instead of using the
__nanosleep function. The reason is that nanosleep() is a cancellation
point while sleep() isn't. */
kernel does not implement the sstupid SysV SIGCHLD vs. SIG_IGN
behaviour for this syscall. Therefore we have to emulate it here. */
unsigned int
__sleep (unsigned int seconds)
{
Expand Down Expand Up @@ -71,7 +67,7 @@ __sleep (unsigned int seconds)
if (oact.sa_handler == SIG_IGN)
{
/* We should leave SIGCHLD blocked. */
result = INLINE_SYSCALL (nanosleep, 2, &ts, &ts);
result = __nanosleep (&ts, &ts);

saved_errno = errno;
/* Restore the original signal mask. */
Expand All @@ -82,11 +78,11 @@ __sleep (unsigned int seconds)
{
/* We should unblock SIGCHLD. Restore the original signal mask. */
(void) __sigprocmask (SIG_SETMASK, &oset, (sigset_t *) NULL);
result = INLINE_SYSCALL (nanosleep, 2, &ts, &ts);
result = __nanosleep (&ts, &ts);
}
}
else
result = INLINE_SYSCALL (nanosleep, 2, &ts, &ts);
result = __nanosleep (&ts, &ts);

if (result != 0)
/* Round remaining time. */
Expand Down

0 comments on commit b1bfeac

Please sign in to comment.