diff options
Diffstat (limited to 'sysdeps/unix')
-rw-r--r-- | sysdeps/unix/sysv/linux/x86_64/recv.c | 14 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/x86_64/send.c | 13 |
2 files changed, 22 insertions, 5 deletions
diff --git a/sysdeps/unix/sysv/linux/x86_64/recv.c b/sysdeps/unix/sysv/linux/x86_64/recv.c index 9ffeb5e7ed..2fa1794d3c 100644 --- a/sysdeps/unix/sysv/linux/x86_64/recv.c +++ b/sysdeps/unix/sysv/linux/x86_64/recv.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2002 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 @@ -18,7 +18,7 @@ #include <errno.h> #include <sys/socket.h> -#include <sysdep.h> +#include <sysdep-cancel.h> /* Read N bytes into BUF from socket FD. Returns the number read or -1 for errors. */ @@ -26,8 +26,16 @@ ssize_t __libc_recv (int fd, void *buf, size_t n, int flags) { + if (SINGLE_THREAD_P) + return INLINE_SYSCALL (recvfrom, 6, fd, buf, n, flags, NULL, NULL); - return INLINE_SYSCALL (recvfrom, 6, fd, buf, n, flags, NULL, NULL); + int oldtype = LIBC_CANCEL_ASYNC (); + + ssize_t result = INLINE_SYSCALL (recvfrom, 6, fd, buf, n, flags, NULL, NULL); + + LIBC_CANCEL_RESET (oldtype); + + return result; } weak_alias (__libc_recv, __recv) diff --git a/sysdeps/unix/sysv/linux/x86_64/send.c b/sysdeps/unix/sysv/linux/x86_64/send.c index bfbd212dc6..c484ce69fe 100644 --- a/sysdeps/unix/sysv/linux/x86_64/send.c +++ b/sysdeps/unix/sysv/linux/x86_64/send.c @@ -18,13 +18,22 @@ #include <errno.h> #include <sys/socket.h> -#include <sysdep.h> +#include <sysdep-cancel.h> /* Send N bytes of BUF to socket FD. Returns the number sent or -1. */ ssize_t __libc_send (int fd, const void *buf, size_t n, int flags) { - return INLINE_SYSCALL (sendto, 6, fd, buf, n, flags, NULL, NULL); + if (SINGLE_THREAD_P) + return INLINE_SYSCALL (sendto, 6, fd, buf, n, flags, NULL, NULL); + + int oldtype = LIBC_CANCEL_ASYNC (); + + ssize_t result = INLINE_SYSCALL (sendto, 6, fd, buf, n, flags, NULL, NULL); + + LIBC_CANCEL_RESET (oldtype); + + return result; } weak_alias (__libc_send, __send) |