diff options
author | Andreas Schwab <schwab@suse.de> | 2002-12-27 22:15:18 +0000 |
---|---|---|
committer | Andreas Schwab <schwab@suse.de> | 2002-12-27 22:15:18 +0000 |
commit | e88c122c4f7eb9d46436c0cb607e0f8e585c151b (patch) | |
tree | c3cf0817bf8b861ff32108ad38660cf5fb3f4263 | |
parent | 4b5b9a0718ecd714fb0620d5ba0b0b7101277e9b (diff) | |
download | glibc-e88c122c4f7eb9d46436c0cb607e0f8e585c151b.tar glibc-e88c122c4f7eb9d46436c0cb607e0f8e585c151b.tar.gz glibc-e88c122c4f7eb9d46436c0cb607e0f8e585c151b.tar.bz2 glibc-e88c122c4f7eb9d46436c0cb607e0f8e585c151b.zip |
Add cancellation support.
-rw-r--r-- | sysdeps/unix/sysv/linux/m68k/socket.S | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/sysdeps/unix/sysv/linux/m68k/socket.S b/sysdeps/unix/sysv/linux/m68k/socket.S index 3592d2a580..1d10f33e17 100644 --- a/sysdeps/unix/sysv/linux/m68k/socket.S +++ b/sysdeps/unix/sysv/linux/m68k/socket.S @@ -16,7 +16,7 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include <sysdep.h> +#include <sysdep-cancel.h> #include <socketcall.h> #define P(a, b) P2(a, b) @@ -41,6 +41,10 @@ .globl __socket ENTRY (__socket) +#if defined NEED_CANCELLATION && defined CENABLE + SINGLE_THREAD_P + jne 1f +#endif /* Save registers. */ move.l %d2, %a0 @@ -64,6 +68,42 @@ ENTRY (__socket) /* Successful; return the syscall's value. */ rts + +#if defined NEED_CANCELLATION && defined CENABLE +1: /* Enable asynchronous cancellation. */ + CENABLE + + /* Save registers. */ + move.l %d2, -(%sp) + move.l %d0, -(%sp) + + move.l #SYS_ify (socketcall), %d0 /* System call number in %d0. */ + + /* Use ## so `socket' is a separate token that might be #define'd. */ + move.l #P (SOCKOP_,socket), %d1 /* Subcode is first arg to syscall. */ + lea 4+8(%sp), %a1 /* Address of args is 2nd arg. */ + move.l %a1, %d2 + + /* Do the system call trap. */ + trap #0 + + /* Restore cancellation. */ + move.l %d0, %d2 + CDISABLE + addq.l #4, %sp + move.l %d2, %d0 + + /* Restore registers. */ + move.l (%sp)+, %d2 + + /* %d0 is < 0 if there was an error. */ + tst.l %d0 + jmi SYSCALL_ERROR_LABEL + + /* Successful; return the syscall's value. */ + rts +#endif + PSEUDO_END (__socket) #ifndef NO_WEAK_ALIAS |