aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/s390/s390-64
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-01-05 07:05:40 +0000
committerUlrich Drepper <drepper@redhat.com>2003-01-05 07:05:40 +0000
commit00e58701f31f8628106948aa6486487ed89ece52 (patch)
treec2863d340412486d844030b6586bf719fc24400b /sysdeps/unix/sysv/linux/s390/s390-64
parentb74121ae4bc5fcedd4872353dac3af07b5e7eb0f (diff)
downloadglibc-00e58701f31f8628106948aa6486487ed89ece52.tar
glibc-00e58701f31f8628106948aa6486487ed89ece52.tar.gz
glibc-00e58701f31f8628106948aa6486487ed89ece52.tar.bz2
glibc-00e58701f31f8628106948aa6486487ed89ece52.zip
Update.
2003-01-05 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/s390/s390-32/socket.S: Add support for cancellation handling. * sysdeps/unix/sysv/linux/s390/s390-64/socket.S: Likewise. * sysdeps/unix/sysv/linux/s390/s390-64/sigsuspend.c: Likewise. 2003-01-04 Ulrich Drepper <drepper@redhat.com> * sysdeps/unix/sysv/linux/i386/system.c (cancel_handler): Correct order of parameters passed to kill. * sysdeps/unix/sysv/linux/m68k/bits/stat.h: Add nanosecond fields.
Diffstat (limited to 'sysdeps/unix/sysv/linux/s390/s390-64')
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/sigsuspend.c15
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/socket.S31
2 files changed, 41 insertions, 5 deletions
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sigsuspend.c b/sysdeps/unix/sysv/linux/s390/s390-64/sigsuspend.c
index 4fa30ec3c8..f5e8de3160 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/sigsuspend.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/sigsuspend.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2001, 2002, 2003 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 <signal.h>
#include <unistd.h>
-#include <sysdep.h>
+#include <sysdep-cancel.h>
#include <sys/syscall.h>
extern int __syscall_rt_sigsuspend (const sigset_t *, size_t);
@@ -34,7 +34,16 @@ __sigsuspend (set)
{
/* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */
- return INLINE_SYSCALL (rt_sigsuspend, 2, set, _NSIG / 8);
+ if (SINGLE_THREAD_P)
+ return INLINE_SYSCALL (rt_sigsuspend, 2, set, _NSIG / 8);
+
+ int oldtype = LIBC_CANCEL_ASYNC ();
+
+ int result = INLINE_SYSCALL (rt_sigsuspend, 2, set, _NSIG / 8);
+
+ LIBC_CANCEL_RESET (oldtype);
+
+ return result;
}
libc_hidden_def (__sigsuspend)
weak_alias (__sigsuspend, sigsuspend)
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/socket.S b/sysdeps/unix/sysv/linux/s390/s390-64/socket.S
index 405802f61f..c9bd02baee 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/socket.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/socket.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001 Free Software Foundation, Inc.
+/* Copyright (C) 2001, 2003 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
@@ -17,7 +17,7 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-#include <sysdep.h>
+#include <sysdep-cancel.h>
#include <socketcall.h>
/* &%/$&!! preprocessor */
@@ -73,6 +73,12 @@ ENTRY(__socket)
stg %r3,168(%r15) /* Store into parameter list. */
stg %r2,160(%r15)
#endif
+
+#if defined NEED_CANCELLATION && defined CENABLE
+ SINGLE_THREAD_P
+ jne L(socket_cancel)
+#endif
+
/* Load subcode for socket syscall. */
lghi %r2,P(SOCKOP_,socket)
la %r3,160(%r15) /* Load address of parameter list. */
@@ -80,6 +86,7 @@ ENTRY(__socket)
/* Do the system call trap. */
svc SYS_ify(socketcall)
+4:
lg %r15,0(%r15) /* Load back chain. */
lmg %r6,15,48(%r15) /* Load registers. */
@@ -91,6 +98,26 @@ ENTRY(__socket)
/* Successful; return the syscall's value. */
br %r14
+#if defined NEED_CANCELLATION && defined CENABLE
+L(socket_cancel):
+ brasl %r14,CENABLE
+ lr %r0,%r2
+
+ /* Load subcode for socket syscall. */
+ lghi %r2,P(SOCKOP_,socket)
+ la %r3,160(%r15) /* Load address of parameter list. */
+
+ /* Do the system call trap. */
+ svc SYS_ify(socketcall)
+
+ lgr %r12,%r2
+ lr %r2,%r0
+ brasl %r14,CDISABLE
+
+ lgr %r2,%r12
+ j 4b
+#endif
+
PSEUDO_END (__socket)
#ifndef NO_WEAK_ALIAS