| 661 | RTM_EXPORT(clock_gettime); |
| 662 | |
| 663 | int 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 | } |
| 718 | RTM_EXPORT(clock_nanosleep); |
| 719 | |
| 720 | int clock_settime(clockid_t clockid, const struct timespec *tp) |
no test coverage detected