[PATCH] pread_write.c: add cancellation to mips pread/pwrite
maksim.rayskiy at gmail.com
maksim.rayskiy at gmail.com
Thu May 12 00:42:15 UTC 2011
From: Maksim Rayskiy <mrayskiy at broadcom.com>
pread() and pwrite() are mandatory cancellation points.
copypasted from sh implementation
Signed-off-by: Maksim Rayskiy <mrayskiy at broadcom.com>
---
libc/sysdeps/linux/mips/pread_write.c | 26 ++++++++++++++++++++++++--
1 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/libc/sysdeps/linux/mips/pread_write.c b/libc/sysdeps/linux/mips/pread_write.c
index ea6b15f..03b45de 100644
--- a/libc/sysdeps/linux/mips/pread_write.c
+++ b/libc/sysdeps/linux/mips/pread_write.c
@@ -35,6 +35,11 @@ extern __typeof(pwrite64) __libc_pwrite64;
#include <bits/kernel_types.h>
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+#include "sysdep-cancel.h"
+#else
+#define SINGLE_THREAD_P 1
+#endif
#ifdef __NR_pread
@@ -54,7 +59,16 @@ static __inline__ _syscall6(ssize_t, __syscall_pread, int, fd, void *, buf,
ssize_t __libc_pread(int fd, void *buf, size_t count, off_t offset)
{
- return(__syscall_pread(fd,buf,count,0,__LONG_LONG_PAIR(offset>>31,offset)));
+ if (SINGLE_THREAD_P)
+ return(__syscall_pread(fd,buf,count,0,__LONG_LONG_PAIR(offset>>31,offset)));
+
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+ int oldtype = LIBC_CANCEL_ASYNC ();
+ int result = __syscall_pread(fd, buf, count, 0, __LONG_LONG_PAIR(offset>>31,offset));
+ LIBC_CANCEL_RESET (oldtype);
+ return result;
+#endif
+
}
weak_alias(__libc_pread,pread)
@@ -98,7 +112,15 @@ static __inline__ _syscall6(ssize_t, __syscall_pwrite, int, fd, const void *, bu
ssize_t __libc_pwrite(int fd, const void *buf, size_t count, off_t offset)
{
- return(__syscall_pwrite(fd,buf,count,0,__LONG_LONG_PAIR(offset>>31,offset)));
+ if (SINGLE_THREAD_P)
+ return(__syscall_pwrite(fd,buf,count,0,__LONG_LONG_PAIR(offset>>31,offset)));
+
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+ int oldtype = LIBC_CANCEL_ASYNC ();
+ int result = __syscall_pwrite(fd, buf, count, 0, __LONG_LONG_PAIR(offset>>31,offset));
+ LIBC_CANCEL_RESET (oldtype);
+ return result;
+#endif
}
weak_alias(__libc_pwrite,pwrite)
--
1.7.4.1
More information about the uClibc
mailing list