about summary refs log tree commit diff
path: root/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2002-12-15 01:00:22 +0000
committerUlrich Drepper <drepper@redhat.com>2002-12-15 01:00:22 +0000
commit86b2dc4072725edb69ec4b872f9fcd17a4554b74 (patch)
treefcc7abb285572b9e539af7b4c324806a0364daf2 /nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
parent9d263d72848fb561e104a21da3ffccf791078f2a (diff)
downloadglibc-86b2dc4072725edb69ec4b872f9fcd17a4554b74.tar.gz
glibc-86b2dc4072725edb69ec4b872f9fcd17a4554b74.tar.xz
glibc-86b2dc4072725edb69ec4b872f9fcd17a4554b74.zip
Update.
	* sysdeps/generic/sysdep-cancel.h: New file.
	* sysdeps/unix/make-syscalls.sh: Handle C at start of args as
	cancelable syscall.
	* sysdeps/unix/inet/syscalls.list (accept, connect, recv, recvfrom,
	recvmsg, send, sendmsg, sendto): Make cancelable.
	* sysdeps/unix/mman/syscalls.list (msync): Likewise.
	* sysdeps/unix/sysv/linux/alpha/syscalls.list (llseek, pread,
	pwrite, accept, connect, recv, recvfrom, recvmsg, send, sendmsg,
	sendto, osf_select): Likewise.
	* sysdeps/unix/sysv/linux/hppa/syscalls.list (accept, connect, recv,
	recvfrom, recvmsg, send, sendmsg, sendto): Likewise.
	* sysdeps/unix/sysv/linux/ia64/syscalls.list (llseek, pread,
	pwrite, accept, connect, recv, recvfrom, recvmsg, send, sendmsg,
	sendto): Likewise.
	* sysdeps/unix/sysv/linux/mips/syscalls.list (accept, connect, recv,
	recvfrom, recvmsg, send, sendmsg, sendto): Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list (llseek, pread,
	pwrite, accept, connect, recv, recvfrom, recvmsg, send, sendmsg,
	sendto): Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list (llseek, pread,
	pwrite, accept, connect, recv, recvfrom, recvmsg, send, sendmsg,
	sendto, select): Likewise.
	* sysdeps/unix/sysv/linux/x86_64/syscalls.list (llseek, pread,
	pwrite, accept, connect, recvfrom, recvmsg, sendmsg, sendto):
	Likewise.
	* sysdeps/unix/sysv/linux/syscalls.list (creat, nanosleep, pause,
	select, fcntl): Likewise.
	* sysdeps/unix/sysv/syscalls.list (pause, poll): Likewise.
	* sysdeps/unix/syscalls.list (close, fcntl, fsync, lseek, open,
	read, readv, select, sigsuspend, write, writev): Likewise.

2002-12-14  Jakub Jelinek  <jakub@redhat.com>
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h')
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h70
1 files changed, 70 insertions, 0 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
new file mode 100644
index 0000000000..ed9f9420e7
--- /dev/null
+++ b/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
@@ -0,0 +1,70 @@
+/* Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <sysdep.h>
+#include <tls.h>
+
+#if !defined NOT_IN_libc || defined IS_IN_libpthread
+
+#undef PSEUDO
+#define PSEUDO(name, syscall_name, args)				      \
+  .text;								      \
+  ENTRY (name)								      \
+    cmpl $0, %gs:MULTIPLE_THREADS_OFFSET;				      \
+    jne L(pseudo_cancel);						      \
+    DO_CALL (syscall_name, args);					      \
+    cmpl $-4095, %eax;							      \
+    jae SYSCALL_ERROR_LABEL;						      \
+    ret;								      \
+  L(pseudo_cancel):							      \
+    call __libc_enable_asynccancel;					      \
+    SAVE_OLDTYPE_##args							      \
+    PUSHARGS_##args							      \
+    DOCARGS_##args							      \
+    movl $SYS_ify (syscall_name), %eax;					      \
+    int $0x80								      \
+    POPARGS_##args;							      \
+    POPCARGS_##args							      \
+    cmpl $-4095, %eax;							      \
+    jae SYSCALL_ERROR_LABEL;						      \
+  L(pseudo_end):
+
+#define SAVE_OLDTYPE_0	movl %eax, %ecx;
+#define SAVE_OLDTYPE_1	SAVE_OLDTYPE_0
+#define SAVE_OLDTYPE_2	pushl %eax;
+#define SAVE_OLDTYPE_3	SAVE_OLDTYPE_2
+#define SAVE_OLDTYPE_4	SAVE_OLDTYPE_2
+#define SAVE_OLDTYPE_5	SAVE_OLDTYPE_2
+
+#define DOCARGS_0	DOARGS_0
+#define DOCARGS_1	DOARGS_1
+#define DOCARGS_2	_DOARGS_2 (12)
+#define DOCARGS_3	_DOARGS_3 (20)
+#define DOCARGS_4	_DOARGS_4 (28)
+#define DOCARGS_5	_DOARGS_5 (36)
+
+#define DISABLE		call __libc_disable_asynccancel
+#define POPCARGS_0	pushl %eax; movl %ecx, %eax; DISABLE; popl %eax;
+#define POPCARGS_1	POPCARGS_0
+#define POPCARGS_2	xchgl (%esp), %eax; DISABLE; popl %eax;
+#define POPCARGS_3	POPCARGS_2
+#define POPCARGS_4	POPCARGS_2
+#define POPCARGS_5	POPCARGS_2
+
+#endif