summaryrefslogtreecommitdiffstats
path: root/lib/libthr/thread
diff options
context:
space:
mode:
authorvangyzen <vangyzen@FreeBSD.org>2017-05-01 01:36:54 +0000
committervangyzen <vangyzen@FreeBSD.org>2017-05-01 01:36:54 +0000
commit1f3f7c15d6db5da93247e3a10bb3f1ff40f61915 (patch)
tree2c49170567af964db6609d58aff8eb6a7649f4ce /lib/libthr/thread
parent57723a7d7f1db867d4acce11b84c8389cefc9acd (diff)
downloadFreeBSD-src-1f3f7c15d6db5da93247e3a10bb3f1ff40f61915.zip
FreeBSD-src-1f3f7c15d6db5da93247e3a10bb3f1ff40f61915.tar.gz
MFC r315526
Add clock_nanosleep() Add a clock_nanosleep() syscall, as specified by POSIX. Make nanosleep() a wrapper around it. Attach the clock_nanosleep test from NetBSD. Adjust it for the FreeBSD behavior of updating rmtp only when interrupted by a signal. I believe this to be POSIX-compliant, since POSIX mentions the rmtp parameter only in the paragraph about EINTR. This is also what Linux does. (NetBSD updates rmtp unconditionally.) Copy the whole nanosleep.2 man page from NetBSD because it is complete and closely resembles the POSIX description. Edit, polish, and reword it a bit, being sure to keep any relevant text from the FreeBSD page. Regenerate syscall files. Relnotes: yes Sponsored by: Dell EMC
Diffstat (limited to 'lib/libthr/thread')
-rw-r--r--lib/libthr/thread/thr_private.h2
-rw-r--r--lib/libthr/thread/thr_syscalls.c17
2 files changed, 19 insertions, 0 deletions
diff --git a/lib/libthr/thread/thr_private.h b/lib/libthr/thread/thr_private.h
index 9bea65f..56ecdb4 100644
--- a/lib/libthr/thread/thr_private.h
+++ b/lib/libthr/thread/thr_private.h
@@ -865,6 +865,8 @@ int __sys_sigwaitinfo(const sigset_t *set, siginfo_t *info);
/* #include <time.h> */
#ifdef _TIME_H_
+int __sys_clock_nanosleep(clockid_t, int, const struct timespec *,
+ struct timespec *);
int __sys_nanosleep(const struct timespec *, struct timespec *);
#endif
diff --git a/lib/libthr/thread/thr_syscalls.c b/lib/libthr/thread/thr_syscalls.c
index 362826c..92d0c99 100644
--- a/lib/libthr/thread/thr_syscalls.c
+++ b/lib/libthr/thread/thr_syscalls.c
@@ -260,6 +260,22 @@ __thr_msync(void *addr, size_t len, int flags)
}
static int
+__thr_clock_nanosleep(clockid_t clock_id, int flags,
+ const struct timespec *time_to_sleep, struct timespec *time_remaining)
+{
+ struct pthread *curthread;
+ int ret;
+
+ curthread = _get_curthread();
+ _thr_cancel_enter(curthread);
+ ret = __sys_clock_nanosleep(clock_id, flags, time_to_sleep,
+ time_remaining);
+ _thr_cancel_leave(curthread, 1);
+
+ return (ret);
+}
+
+static int
__thr_nanosleep(const struct timespec *time_to_sleep,
struct timespec *time_remaining)
{
@@ -668,6 +684,7 @@ __thr_interpose_libc(void)
SLOT(ppoll);
SLOT(map_stacks_exec);
SLOT(fdatasync);
+ SLOT(clock_nanosleep);
#undef SLOT
*(__libc_interposing_slot(
INTERPOS__pthread_mutex_init_calloc_cb)) =
OpenPOWER on IntegriCloud