summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarmelo Amoroso <carmelo.amoroso@st.com>2007-11-22 16:09:55 +0000
committerCarmelo Amoroso <carmelo.amoroso@st.com>2007-11-22 16:09:55 +0000
commitf90eda6523848d835adbe7bef598a86a72b1b22a (patch)
treeed6b799ce413dbd67251144be47f7cfe8a5fb746
parent0957a1a07cba013759ac2067979e6792f804af90 (diff)
downloaduClibc-alpine-f90eda6523848d835adbe7bef598a86a72b1b22a.tar.bz2
uClibc-alpine-f90eda6523848d835adbe7bef598a86a72b1b22a.tar.xz
Push back changes to add cancellation handling.
It still needs to reach an agreement on the final solution, anyway this code have been put int to be shared for the mips-sh4 merge Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com>
-rw-r--r--libc/inet/Makefile.in5
-rw-r--r--libc/inet/socketcalls.c85
-rw-r--r--libc/sysdeps/linux/common/Makefile.in9
-rw-r--r--libc/sysdeps/linux/common/fsync.c28
-rw-r--r--libc/sysdeps/linux/common/ioctl.c27
-rw-r--r--libc/sysdeps/linux/common/msync.c24
-rw-r--r--libc/sysdeps/linux/common/nanosleep.c28
-rw-r--r--libc/sysdeps/linux/common/pause.c33
-rw-r--r--libc/sysdeps/linux/common/poll.c40
-rw-r--r--libc/sysdeps/linux/common/select.c28
10 files changed, 236 insertions, 71 deletions
diff --git a/libc/inet/Makefile.in b/libc/inet/Makefile.in
index 66a84c06f..a61d38ee0 100644
--- a/libc/inet/Makefile.in
+++ b/libc/inet/Makefile.in
@@ -30,11 +30,6 @@ CSRC += accept.c bind.c connect.c getpeername.c getsockname.c getsockopt.c \
listen.c recv.c recvfrom.c recvmsg.c send.c sendmsg.c sendto.c \
setsockopt.c shutdown.c socket.c socketpair.c
-ifeq ($(UCLIBC_HAS_THREADS_NATIVE),y)
-CSRC := $(filter-out accept.c connect.c recv.c recvfrom.c recvmsg.c send.c \
- sendmsg.c sendto.c, $(CSRC))
-endif
-
INET_DIR := $(top_srcdir)libc/inet
INET_OUT := $(top_builddir)libc/inet
diff --git a/libc/inet/socketcalls.c b/libc/inet/socketcalls.c
index 9a6e2e151..d684a3aaf 100644
--- a/libc/inet/socketcalls.c
+++ b/libc/inet/socketcalls.c
@@ -33,6 +33,12 @@ extern int __socketcall(int call, unsigned long *args) attribute_hidden;
#define SYS_RECVMSG 17
#endif
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+#include <sysdep-cancel.h>
+#include <pthreadP.h>
+#else
+#define SINGLE_THREAD_P 1
+#endif
#ifdef L_accept
extern __typeof(accept) __libc_accept;
@@ -47,7 +53,17 @@ int __libc_accept(int s, struct sockaddr *addr, socklen_t * addrlen)
args[0] = s;
args[1] = (unsigned long) addr;
args[2] = (unsigned long) addrlen;
- return __socketcall(SYS_ACCEPT, args);
+
+ if (SINGLE_THREAD_P)
+ return __socketcall(SYS_ACCEPT, args);
+
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+ int oldtype = LIBC_CANCEL_ASYNC ();
+ int result = __socketcall(SYS_ACCEPT, args);
+ LIBC_CANCEL_RESET (oldtype);
+ return result;
+#endif
+
}
#endif
libc_hidden_proto(accept)
@@ -86,7 +102,16 @@ int __libc_connect(int sockfd, const struct sockaddr *saddr, socklen_t addrlen)
args[0] = sockfd;
args[1] = (unsigned long) saddr;
args[2] = addrlen;
+
+if (SINGLE_THREAD_P)
return __socketcall(SYS_CONNECT, args);
+
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+ int oldtype = LIBC_CANCEL_ASYNC ();
+ int result = __socketcall(SYS_CONNECT, args);
+ LIBC_CANCEL_RESET (oldtype);
+ return result;
+#endif
}
#endif
libc_hidden_proto(connect)
@@ -179,7 +204,16 @@ ssize_t __libc_recv(int sockfd, __ptr_t buffer, size_t len, int flags)
args[1] = (unsigned long) buffer;
args[2] = len;
args[3] = flags;
- return (__socketcall(SYS_RECV, args));
+
+ if (SINGLE_THREAD_P)
+ return (__socketcall(SYS_RECV, args));
+
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+ int oldtype = LIBC_CANCEL_ASYNC ();
+ int result = __socketcall(SYS_RECV, args);
+ LIBC_CANCEL_RESET (oldtype);
+ return result;
+#endif
}
#elif defined(__NR_recvfrom)
libc_hidden_proto(recvfrom)
@@ -212,7 +246,16 @@ ssize_t __libc_recvfrom(int sockfd, __ptr_t buffer, size_t len, int flags,
args[3] = flags;
args[4] = (unsigned long) to;
args[5] = (unsigned long) tolen;
+
+if (SINGLE_THREAD_P)
return (__socketcall(SYS_RECVFROM, args));
+
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+ int oldtype = LIBC_CANCEL_ASYNC ();
+ int result = __socketcall(SYS_RECVFROM, args);
+ LIBC_CANCEL_RESET (oldtype);
+ return result;
+#endif
}
#endif
libc_hidden_proto(recvfrom)
@@ -233,7 +276,16 @@ ssize_t __libc_recvmsg(int sockfd, struct msghdr *msg, int flags)
args[0] = sockfd;
args[1] = (unsigned long) msg;
args[2] = flags;
- return (__socketcall(SYS_RECVMSG, args));
+
+if (SINGLE_THREAD_P)
+ return (__socketcall(SYS_RECVMSG, args));
+
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+ int oldtype = LIBC_CANCEL_ASYNC ();
+ int result = __socketcall(SYS_RECVMSG, args);
+ LIBC_CANCEL_RESET (oldtype);
+ return result;
+#endif
}
#endif
libc_hidden_proto(recvmsg)
@@ -256,7 +308,16 @@ ssize_t __libc_send(int sockfd, const void *buffer, size_t len, int flags)
args[1] = (unsigned long) buffer;
args[2] = len;
args[3] = flags;
+
+if (SINGLE_THREAD_P)
return (__socketcall(SYS_SEND, args));
+
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+ int oldtype = LIBC_CANCEL_ASYNC ();
+ int result = __socketcall(SYS_SEND, args);
+ LIBC_CANCEL_RESET (oldtype);
+ return result;
+#endif
}
#elif defined(__NR_sendto)
libc_hidden_proto(sendto)
@@ -283,7 +344,16 @@ ssize_t __libc_sendmsg(int sockfd, const struct msghdr *msg, int flags)
args[0] = sockfd;
args[1] = (unsigned long) msg;
args[2] = flags;
+
+if (SINGLE_THREAD_P)
return (__socketcall(SYS_SENDMSG, args));
+
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+ int oldtype = LIBC_CANCEL_ASYNC ();
+ int result = __socketcall(SYS_SENDMSG, args);
+ LIBC_CANCEL_RESET (oldtype);
+ return result;
+#endif
}
#endif
libc_hidden_proto(sendmsg)
@@ -310,7 +380,16 @@ ssize_t __libc_sendto(int sockfd, const void *buffer, size_t len, int flags,
args[3] = flags;
args[4] = (unsigned long) to;
args[5] = tolen;
+
+if (SINGLE_THREAD_P)
return (__socketcall(SYS_SENDTO, args));
+
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+ int oldtype = LIBC_CANCEL_ASYNC ();
+ int result = __socketcall(SYS_SENDTO, args);
+ LIBC_CANCEL_RESET (oldtype);
+ return result;
+#endif
}
#endif
libc_hidden_proto(sendto)
diff --git a/libc/sysdeps/linux/common/Makefile.in b/libc/sysdeps/linux/common/Makefile.in
index 270a2de38..600a9adb8 100644
--- a/libc/sysdeps/linux/common/Makefile.in
+++ b/libc/sysdeps/linux/common/Makefile.in
@@ -25,9 +25,12 @@ CSRC := $(filter-out ssp.c,$(CSRC))
endif
ifeq ($(UCLIBC_HAS_THREADS_NATIVE),y)
-CSRC := $(filter-out fork.c getpid.c raise.c pause.c open.c close.c \
- read.c write.c nanosleep.c __syscall_rt_sigaction.c msync.c \
- lseek.c __syscall_fcntl64.c, $(CSRC))
+CSRC := $(filter-out fork.c getpid.c raise.c open.c close.c read.c write.c waitpid.c, $(CSRC))
+
+endif
+
+ifeq ($(TARGET_ARCH),sh)
+CSRC := $(filter-out longjmp.c vfork.c,$(CSRC))
endif
diff --git a/libc/sysdeps/linux/common/fsync.c b/libc/sysdeps/linux/common/fsync.c
index 7ca709887..ecc203c74 100644
--- a/libc/sysdeps/linux/common/fsync.c
+++ b/libc/sysdeps/linux/common/fsync.c
@@ -9,27 +9,29 @@
#include "syscalls.h"
#include <unistd.h>
-#ifdef __UCLIBC__HAS_THREADS__
-# include <sysdep-cancel.h>
+
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+#include "sysdep-cancel.h"
+#else
+#define SINGLE_THREAD_P 1
#endif
+#define __NR___syscall_fsync __NR_fsync
+static inline _syscall1(int, __syscall_fsync, int, fd);
+
extern __typeof(fsync) __libc_fsync;
-#ifdef __UCLIBC__HAS_THREADS__
-int __libc_fsync (int fd)
+
+int __libc_fsync(int fd)
{
if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (fsync, 1, fd);
+ return __syscall_fsync(fd);
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
int oldtype = LIBC_CANCEL_ASYNC ();
-
- int result = INLINE_SYSCALL (fsync, 1, fd);
-
+ int result = __syscall_fsync(fd);
LIBC_CANCEL_RESET (oldtype);
-
return result;
-}
-#else
-# define __NR___libc_fsync __NR_fsync
-_syscall1(int, __libc_fsync, int, fd);
#endif
+}
+
weak_alias(__libc_fsync, fsync)
diff --git a/libc/sysdeps/linux/common/ioctl.c b/libc/sysdeps/linux/common/ioctl.c
index e8e3a1031..02393b98e 100644
--- a/libc/sysdeps/linux/common/ioctl.c
+++ b/libc/sysdeps/linux/common/ioctl.c
@@ -11,6 +11,12 @@
#include <stdarg.h>
#include <sys/ioctl.h>
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+#include <sysdep-cancel.h>
+#else
+#define SINGLE_THREAD_P 1
+#endif
+
libc_hidden_proto(ioctl)
#define __NR___syscall_ioctl __NR_ioctl
@@ -19,13 +25,22 @@ _syscall3(int, __syscall_ioctl, int, fd, unsigned long int, request, void *, arg
int ioctl(int fd, unsigned long int request, ...)
{
- void *arg;
- va_list list;
+ void *arg;
+ va_list list;
+
+ va_start(list, request);
+ arg = va_arg(list, void *);
+
+ va_end(list);
- va_start(list, request);
- arg = va_arg(list, void *);
+ if (SINGLE_THREAD_P)
+ return __syscall_ioctl(fd, request, arg);
- va_end(list);
- return __syscall_ioctl(fd, request, arg);
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+ int oldtype = LIBC_CANCEL_ASYNC ();
+ int result = __syscall_ioctl(fd, request, arg);
+ LIBC_CANCEL_RESET (oldtype);
+ return result;
+#endif
}
libc_hidden_def(ioctl)
diff --git a/libc/sysdeps/linux/common/msync.c b/libc/sysdeps/linux/common/msync.c
index 494d4afd3..8882a4c91 100644
--- a/libc/sysdeps/linux/common/msync.c
+++ b/libc/sysdeps/linux/common/msync.c
@@ -11,7 +11,27 @@
#include <unistd.h>
#include <sys/mman.h>
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+#include <sysdep-cancel.h>
+#else
+#define SINGLE_THREAD_P 1
+#endif
+
+#define __NR___syscall_msync __NR_msync
+static inline _syscall3(int, __syscall_msync, void *, addr, size_t, length,
+ int, flags);
+
extern __typeof(msync) __libc_msync;
-#define __NR___libc_msync __NR_msync
-_syscall3(int, __libc_msync, void *, addr, size_t, length, int, flags);
+int __libc_msync(void * addr, size_t length, int flags)
+{
+ if (SINGLE_THREAD_P)
+ return __syscall_msync(addr, length, flags);
+
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+ int oldtype = LIBC_CANCEL_ASYNC ();
+ int result = __syscall_msync(addr, length, flags);
+ LIBC_CANCEL_RESET (oldtype);
+ return result;
+#endif
+}
weak_alias(__libc_msync,msync)
diff --git a/libc/sysdeps/linux/common/nanosleep.c b/libc/sysdeps/linux/common/nanosleep.c
index 76cab97f2..1e541500b 100644
--- a/libc/sysdeps/linux/common/nanosleep.c
+++ b/libc/sysdeps/linux/common/nanosleep.c
@@ -10,10 +10,32 @@
#include "syscalls.h"
#include <time.h>
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+#include <sysdep-cancel.h>
+#include <pthreadP.h>
+#else
+#define SINGLE_THREAD_P 1
+#endif
+
+#define __NR___syscall_nanosleep __NR_nanosleep
+static inline _syscall2(int, __syscall_nanosleep, const struct timespec *, req,
+ struct timespec *, rem);
+
extern __typeof(nanosleep) __libc_nanosleep;
-#define __NR___libc_nanosleep __NR_nanosleep
-_syscall2(int, __libc_nanosleep, const struct timespec *, req,
- struct timespec *, rem);
+
+int __libc_nanosleep(const struct timespec *req, struct timespec *rem)
+{
+ if (SINGLE_THREAD_P)
+ return __syscall_nanosleep(req, rem);
+
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+ int oldtype = LIBC_CANCEL_ASYNC ();
+ int result = __syscall_nanosleep(req, rem);
+ LIBC_CANCEL_RESET (oldtype);
+ return result;
+#endif
+}
+
libc_hidden_proto(nanosleep)
weak_alias(__libc_nanosleep,nanosleep)
libc_hidden_weak(nanosleep)
diff --git a/libc/sysdeps/linux/common/pause.c b/libc/sysdeps/linux/common/pause.c
index 751b6b6a9..74115b281 100644
--- a/libc/sysdeps/linux/common/pause.c
+++ b/libc/sysdeps/linux/common/pause.c
@@ -7,22 +7,25 @@
* Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
*/
-#define __UCLIBC_HIDE_DEPRECATED__
-#include "syscalls.h"
-#include <unistd.h>
-
-extern __typeof(pause) __libc_pause;
-#ifdef __NR_pause
-#define __NR___libc_pause __NR_pause
-_syscall0(int, __libc_pause);
-#else
#include <signal.h>
-libc_hidden_proto(__sigpause)
-libc_hidden_proto(sigblock)
+#include <unistd.h>
+#include <sysdep-cancel.h>
-int __libc_pause(void)
+/* Suspend the process until a signal arrives.
+ This always returns -1 and sets errno to EINTR. */
+int
+__libc_pause (void)
{
- return (__sigpause(sigblock(0), 0));
+ sigset_t set;
+
+ __sigemptyset (&set);
+ sigprocmask (SIG_BLOCK, NULL, &set);
+
+ /* pause is a cancellation point, but so is sigsuspend.
+ So no need for anything special here. */
+
+ return sigsuspend (&set);
}
-#endif
-weak_alias(__libc_pause,pause)
+weak_alias (__libc_pause, pause)
+
+LIBC_CANCEL_HANDLED (); /* sigsuspend handles our cancellation. */
diff --git a/libc/sysdeps/linux/common/poll.c b/libc/sysdeps/linux/common/poll.c
index 61c6d18ea..7ce1446f5 100644
--- a/libc/sysdeps/linux/common/poll.c
+++ b/libc/sysdeps/linux/common/poll.c
@@ -20,31 +20,33 @@
#include "syscalls.h"
#include <sys/poll.h>
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+#include <sysdep-cancel.h>
+#else
+#define SINGLE_THREAD_P 1
+#endif
+
libc_hidden_proto(poll)
#ifdef __NR_poll
-# ifdef __UCLIBC__HAS_THREADS__
-# include <sysdep-cancel.h>
-
-/* The real implementation. */
-int poll (struct pollfd *fds, nfsd_t nfds, int timeout)
-{
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (poll, 3, fds, nfds, timeout);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
- int result = INLINE_SYSCALL (poll, 3, fds, nfds, timeout);
+#define __NR___syscall_poll __NR_poll
+static inline _syscall3(int, __syscall_poll, struct pollfd *, fds,
+ unsigned long int, nfds, int, timeout);
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+int poll(struct pollfd *fds, nfds_t nfds, int timeout)
+{
+ if (SINGLE_THREAD_P)
+ return __syscall_poll(fds, nfds, timeout);
+
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+ int oldtype = LIBC_CANCEL_ASYNC ();
+ int result = __syscall_poll(fds, nfds, timeout);
+ LIBC_CANCEL_RESET (oldtype);
+ return result;
+#endif
}
-# else
-_syscall3(int, poll, struct pollfd *, fds,
- unsigned long int, nfds, int, timeout);
-# endif
-#else
+#else /* !__NR_poll */
#include <alloca.h>
#include <sys/types.h>
diff --git a/libc/sysdeps/linux/common/select.c b/libc/sysdeps/linux/common/select.c
index 9a50d198a..55f4c23fb 100644
--- a/libc/sysdeps/linux/common/select.c
+++ b/libc/sysdeps/linux/common/select.c
@@ -10,12 +10,36 @@
#include "syscalls.h"
#include <sys/select.h>
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+#include <sysdep-cancel.h>
+#else
+#define SINGLE_THREAD_P 1
+#endif
+
+
libc_hidden_proto(select)
#ifdef __NR__newselect
# undef __NR_select
# define __NR_select __NR__newselect
#endif
-_syscall5(int, select, int, n, fd_set *, readfds, fd_set *, writefds,
- fd_set *, exceptfds, struct timeval *, timeout);
+
+#define __NR___syscall_select __NR_select
+static inline _syscall5(int, __syscall_select, int, n, fd_set *, readfds,
+ fd_set *, writefds, fd_set *, exceptfds, struct timeval *, timeout);
+
+int select(int n, fd_set * readfds, fd_set * writefds, fd_set * exceptfds,
+ struct timeval * timeout)
+{
+ if (SINGLE_THREAD_P)
+ return __syscall_select(n, readfds, writefds, exceptfds, timeout);
+
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+ int oldtype = LIBC_CANCEL_ASYNC ();
+ int result = __syscall_select(n, readfds, writefds, exceptfds, timeout);
+ LIBC_CANCEL_RESET (oldtype);
+ return result;
+#endif
+}
+
libc_hidden_def(select)