summaryrefslogtreecommitdiffstats
path: root/libc/sysdeps/linux/common/fsync.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/common/fsync.c')
-rw-r--r--libc/sysdeps/linux/common/fsync.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/libc/sysdeps/linux/common/fsync.c b/libc/sysdeps/linux/common/fsync.c
index 677f3e3d6..7ca709887 100644
--- a/libc/sysdeps/linux/common/fsync.c
+++ b/libc/sysdeps/linux/common/fsync.c
@@ -9,8 +9,27 @@
#include "syscalls.h"
#include <unistd.h>
+#ifdef __UCLIBC__HAS_THREADS__
+# include <sysdep-cancel.h>
+#endif
extern __typeof(fsync) __libc_fsync;
-#define __NR___libc_fsync __NR_fsync
+#ifdef __UCLIBC__HAS_THREADS__
+int __libc_fsync (int fd)
+{
+ if (SINGLE_THREAD_P)
+ return INLINE_SYSCALL (fsync, 1, fd);
+
+ int oldtype = LIBC_CANCEL_ASYNC ();
+
+ int result = INLINE_SYSCALL (fsync, 1, 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)