diff options
Diffstat (limited to 'libc/sysdeps/linux/common/fsync.c')
-rw-r--r-- | libc/sysdeps/linux/common/fsync.c | 21 |
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) |