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

Function nanosleep

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

Source from the content-addressed store, hash-verified

537
538#if defined(RT_USING_POSIX_DELAY) && defined(RT_USING_KTIME)
539int nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
540{
541 struct timespec old_ts = {0};
542 struct timespec new_ts = {0};
543 struct rt_ktime_hrtimer timer;
544
545 rt_ktime_hrtimer_delay_init(&timer);
546
547 if (rqtp == RT_NULL)
548 {
549 rt_set_errno(EFAULT);
550 return -1;
551 }
552
553 if (rqtp->tv_sec < 0 || rqtp->tv_nsec < 0 || rqtp->tv_nsec >= NANOSECOND_PER_SECOND)
554 {
555 rt_set_errno(EINVAL);
556 return -1;
557 }
558 unsigned long ns = rqtp->tv_sec * NANOSECOND_PER_SECOND + rqtp->tv_nsec;
559 rt_ktime_boottime_get_ns(&old_ts);
560 rt_ktime_hrtimer_ndelay(&timer, ns);
561 if (rt_get_errno() == RT_EINTR)
562 {
563 if (rmtp)
564 {
565 rt_base_t rsec, rnsec;
566 rt_ktime_boottime_get_ns(&new_ts);
567
568 rsec = old_ts.tv_sec + rqtp->tv_sec - new_ts.tv_sec;
569 rnsec = old_ts.tv_nsec + rqtp->tv_nsec - new_ts.tv_nsec;
570 if (rnsec < 0)
571 {
572 rmtp->tv_sec = rsec - 1;
573 rmtp->tv_nsec = NANOSECOND_PER_SECOND + rnsec;
574 }
575 else
576 {
577 rmtp->tv_sec = rsec;
578 rmtp->tv_nsec = rnsec;
579 }
580 }
581
582 rt_ktime_hrtimer_delay_detach(&timer);
583 rt_set_errno(EINTR);
584 return -1;
585 }
586
587 rt_ktime_hrtimer_delay_detach(&timer);
588 return 0;
589}
590RTM_EXPORT(nanosleep);
591#endif /* RT_USING_POSIX_DELAY && RT_USING_KTIME */
592

Callers 2

sys_nanosleepFunction · 0.85
clock_nanosleepFunction · 0.85

Calls 6

rt_set_errnoFunction · 0.85
rt_ktime_boottime_get_nsFunction · 0.85
rt_ktime_hrtimer_ndelayFunction · 0.85
rt_get_errnoFunction · 0.85

Tested by

no test coverage detected