MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / clock_nanosleep

Function clock_nanosleep

components/libc/compilers/common/ctime.c:663–717  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

661RTM_EXPORT(clock_gettime);
662
663int clock_nanosleep(clockid_t clockid, int flags, const struct timespec *rqtp, struct timespec *rmtp)
664{
665 struct timespec ts = {0};
666 rt_err_t err = -RT_EINVAL;
667
668 if (rqtp == RT_NULL)
669 {
670 rt_set_errno(EFAULT);
671 return -1;
672 }
673
674 if (rqtp->tv_sec < 0 || rqtp->tv_nsec < 0 || rqtp->tv_nsec >= NANOSECOND_PER_SECOND)
675 {
676 rt_set_errno(EINVAL);
677 return -1;
678 }
679
680 switch (clockid)
681 {
682 case CLOCK_REALTIME: // use RTC
683#ifdef RT_USING_RTC
684 if (flags & TIMER_ABSTIME)
685 err = _control_rtc(RT_DEVICE_CTRL_RTC_GET_TIMESPEC, &ts);
686 break;
687#endif /* RT_USING_RTC */
688
689 case CLOCK_MONOTONIC: // use boottime
690 case CLOCK_PROCESS_CPUTIME_ID:
691 if (flags & TIMER_ABSTIME)
692 err = rt_ktime_boottime_get_ns(&ts);
693 break;
694
695 default:
696 rt_set_errno(EINVAL);
697 return -1;
698 }
699
700 if (err != RT_EOK)
701 return err;
702
703 rt_int64_t ns = rqtp->tv_nsec - ts.tv_nsec + (rt_int64_t)(rqtp->tv_sec - ts.tv_sec) * NANOSECOND_PER_SECOND;
704 if (ns <= 0)
705 return 0;
706
707 if (flags & TIMER_ABSTIME)
708 {
709 ts.tv_nsec = ns % NANOSECOND_PER_SECOND;
710 ts.tv_sec = ns / NANOSECOND_PER_SECOND;
711 return nanosleep(&ts, rmtp);
712 }
713 else
714 {
715 return nanosleep(rqtp, rmtp);
716 }
717}
718RTM_EXPORT(clock_nanosleep);
719
720int clock_settime(clockid_t clockid, const struct timespec *tp)

Callers 1

sys_clock_nanosleepFunction · 0.85

Calls 4

rt_set_errnoFunction · 0.85
_control_rtcFunction · 0.85
rt_ktime_boottime_get_nsFunction · 0.85
nanosleepFunction · 0.85

Tested by

no test coverage detected