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

Function timerfd_do_gettime

components/libc/posix/io/timerfd/timerfd.c:495–547  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

493}
494
495static int timerfd_do_gettime(int fd, struct itimerspec *cur)
496{
497 struct rt_timerfd *tfd;
498 struct dfs_file *df = RT_NULL;
499 struct timespec cur_time;
500 rt_int64_t tv_sec = 0;
501 rt_int64_t tv_nsec = 0;
502
503 df = fd_get(fd);
504
505 if (df == RT_NULL)
506 {
507 rt_set_errno(EINVAL);
508 return -1;
509 }
510
511 tfd = df->vnode->data;
512
513 get_current_time(tfd, &cur_time);
514
515 rt_mutex_take(&tfd->lock, RT_WAITING_FOREVER);
516
517 tv_sec = cur_time.tv_sec - tfd->pre_time.tv_sec;
518 tv_nsec = cur_time.tv_nsec - tfd->pre_time.tv_nsec;
519 timerfd_time_operation(&tv_sec, &tv_nsec);
520 cur->it_interval.tv_nsec = tfd->ittimer.it_interval.tv_nsec;
521 cur->it_interval.tv_sec = tfd->ittimer.it_interval.tv_sec;
522
523 if (tfd->isperiodic == ENTER_PERIODIC)
524 {
525 cur->it_value.tv_nsec = tfd->ittimer.it_interval.tv_nsec - tv_nsec;
526 cur->it_value.tv_sec = tfd->ittimer.it_interval.tv_sec - tv_sec;
527 timerfd_time_operation(&cur->it_value.tv_sec, &cur->it_value.tv_nsec);
528 }
529 else
530 {
531 if (rt_atomic_load(&(tfd->timeout_num)) == 1)
532 {
533 cur->it_value.tv_nsec = 0;
534 cur->it_value.tv_sec = 0;
535 }
536 else
537 {
538 cur->it_value.tv_nsec = tfd->ittimer.it_value.tv_nsec - tv_nsec;
539 cur->it_value.tv_sec = tfd->ittimer.it_value.tv_sec - tv_sec;
540 timerfd_time_operation(&cur->it_value.tv_sec, &cur->it_value.tv_nsec);
541 }
542 }
543
544 rt_mutex_release(&tfd->lock);
545
546 return 0;
547}
548
549/**
550 * @brief Creates a file descriptor for a timer.

Callers 1

timerfd_gettimeFunction · 0.85

Calls 6

rt_set_errnoFunction · 0.85
get_current_timeFunction · 0.85
rt_mutex_takeFunction · 0.85
timerfd_time_operationFunction · 0.85
rt_mutex_releaseFunction · 0.85
fd_getFunction · 0.50

Tested by

no test coverage detected