*** empty log message ***
authorAndreas Schwab <schwab@suse.de>
Fri, 27 Dec 2002 22:15:56 +0000 (22:15 +0000)
committerAndreas Schwab <schwab@suse.de>
Fri, 27 Dec 2002 22:15:56 +0000 (22:15 +0000)
2002-12-27  Andreas Schwab  <schwab@suse.de>

* sysdeps/unix/sysv/linux/m68k/socket.S: Add cancellation support.

ChangeLog
linuxthreads/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h
sysdeps/unix/sysv/linux/m68k/socket.S

index f24dbc3..28503a9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2002-12-27  Andreas Schwab  <schwab@suse.de>
+
+       * sysdeps/unix/sysv/linux/m68k/socket.S: Add cancellation support. 
+
 2002-12-27  Jakub Jelinek  <jakub@redhat.com>
 
        * malloc/arena.c (ptmalloc_init): Don't call next_env_entry if
index 1f1f65f..fb6e92c 100644 (file)
@@ -37,6 +37,7 @@
   .Lpseudo_cancel:                                                           \
     CENABLE;                                                                 \
     DOCARGS_##args                                                           \
+    move.l %d0, -(%sp);                                                              \
     move.l &SYS_ify (syscall_name), %d0;                                     \
     trap &0;                                                                 \
     move.l %d0, %d2;                                                         \
index 3592d2a..1d10f33 100644 (file)
@@ -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)
 
 .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