diff --git a/orbis-kernel/include/orbis/sys/sysproto.hpp b/orbis-kernel/include/orbis/sys/sysproto.hpp index b5b1259e0..513367f3e 100644 --- a/orbis-kernel/include/orbis/sys/sysproto.hpp +++ b/orbis-kernel/include/orbis/sys/sysproto.hpp @@ -228,8 +228,8 @@ SysResult sys_ktimer_settime(Thread *thread, sint timerid, sint flags, SysResult sys_ktimer_gettime(Thread *thread, sint timerid, ptr value); SysResult sys_ktimer_getoverrun(Thread *thread, sint timerid); -SysResult sys_nanosleep(Thread *thread, ptr rqtp, - ptr rmtp); +SysResult sys_nanosleep(Thread *thread, cptr rqtp, + ptr rmtp); SysResult sys_ntp_gettime(Thread *thread, ptr ntvp); SysResult sys_minherit(Thread *thread, ptr addr, size_t len, sint inherit); diff --git a/orbis-kernel/src/sys/sys_time.cpp b/orbis-kernel/src/sys/sys_time.cpp index f8f35292c..29e7c658b 100644 --- a/orbis-kernel/src/sys/sys_time.cpp +++ b/orbis-kernel/src/sys/sys_time.cpp @@ -108,9 +108,27 @@ orbis::SysResult orbis::sys_clock_getres(Thread *thread, clockid_t clock_id, ptr tp) { return ErrorCode::NOSYS; } -orbis::SysResult orbis::sys_nanosleep(Thread *thread, ptr rqtp, - ptr rmtp) { - return ErrorCode::NOSYS; +orbis::SysResult orbis::sys_nanosleep(Thread *thread, + cptr rqtp, + ptr rmtp) { + ORBIS_LOG_TRACE(__FUNCTION__, rqtp, rmtp); + struct ::timespec rq; + struct ::timespec rm; + orbis::timespec value; + if (auto e = uread(value, rqtp); e != ErrorCode{}) + return e; + rq.tv_sec = value.sec; + rq.tv_nsec = value.nsec; + if (::nanosleep(&rq, &rm) == EINTR) { + if (rmtp) { + value.sec = rm.tv_sec; + value.nsec = rm.tv_nsec; + if (auto e = uwrite(rmtp, value); e != ErrorCode{}) + return e; + } + return ErrorCode::INTR; + } + return {}; } orbis::SysResult orbis::sys_gettimeofday(Thread *thread, ptr tp, ptr tzp) {