| 493 | } |
| 494 | |
| 495 | static 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. |
no test coverage detected