[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