| 2545 | } |
| 2546 | |
| 2547 | U32 KProcess::timerfd_settime(U32 fildes, U32 flags, U32 newValue, U32 oldValue) { |
| 2548 | KFileDescriptorPtr fd = getFileDescriptor(fildes); |
| 2549 | if (!fd) { |
| 2550 | return -K_EBADF; |
| 2551 | } |
| 2552 | if (fd->kobject->type != KTYPE_SIGNAL) { |
| 2553 | return -K_EINVAL; |
| 2554 | } |
| 2555 | if (!newValue) { |
| 2556 | return -K_EFAULT; |
| 2557 | } |
| 2558 | std::shared_ptr<KTimer> timer = std::dynamic_pointer_cast<KTimer>(fd->kobject); |
| 2559 | if (oldValue) { |
| 2560 | U64 microNextTimer = timer->getMicroNextTimer(); |
| 2561 | U64 microInterval = timer->getMicroInterval(); |
| 2562 | |
| 2563 | memory->writed(oldValue, (U32)(microInterval / 1000000)); |
| 2564 | memory->writed(oldValue + 4, (U32)((microInterval % 1000000) * 1000)); |
| 2565 | |
| 2566 | if (!microNextTimer) { |
| 2567 | memory->writed(oldValue + 8, 0); |
| 2568 | memory->writed(oldValue + 12, 0); |
| 2569 | } else { |
| 2570 | U64 currentTime = KSystem::getSystemTimeAsMicroSeconds(); |
| 2571 | S64 diff = (S64)microNextTimer - (S64)currentTime; |
| 2572 | if (diff < 0) { |
| 2573 | memory->writed(oldValue + 8, 0); |
| 2574 | memory->writed(oldValue + 12, 0); |
| 2575 | } else { |
| 2576 | memory->writed(oldValue + 8, (U32)(diff / 1000000)); |
| 2577 | memory->writed(oldValue + 12, (U32)((diff % 1000000) * 1000)); |
| 2578 | } |
| 2579 | } |
| 2580 | } |
| 2581 | U64 interval = memory->readd(newValue) * 1000000 + memory->readd(newValue+4) / 1000; |
| 2582 | U64 next = memory->readd(newValue+8) * 1000000 + memory->readd(newValue + 12) / 1000; |
| 2583 | // TFD_TIMER_ABSTIME |
| 2584 | if ((flags & 1) == 0) { |
| 2585 | next += KSystem::getSystemTimeAsMicroSeconds(); |
| 2586 | } |
| 2587 | timer->setTimes(interval, next); |
| 2588 | return 0; |
| 2589 | } |
| 2590 | |
| 2591 | U32 KProcess::timerfd_gettime(U32 fildes, U32 value) { |
| 2592 | KFileDescriptorPtr fd = getFileDescriptor(fildes); |
no test coverage detected