From 7bdaeafdfdaef3eb3635387ecdfdc398f82ae69e Mon Sep 17 00:00:00 2001 From: IndecisiveTurtle <47210458+raphaelthegreat@users.noreply.github.com> Date: Fri, 21 Jun 2024 17:39:37 +0300 Subject: [PATCH] kernel: Make sceKernelUsleep interruptible --- src/core/libraries/kernel/time_management.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/core/libraries/kernel/time_management.cpp b/src/core/libraries/kernel/time_management.cpp index 63f27e78..8101ab6d 100644 --- a/src/core/libraries/kernel/time_management.cpp +++ b/src/core/libraries/kernel/time_management.cpp @@ -56,10 +56,20 @@ int PS4_SYSV_ABI sceKernelUsleep(u32 microseconds) { } else { std::this_thread::sleep_for(std::chrono::microseconds(microseconds)); } -#else - usleep(microseconds); -#endif return 0; +#else + timespec start; + timespec remain; + start.tv_sec = microseconds / 1000000; + start.tv_nsec = (microseconds % 1000000) * 1000; + timespec* requested = &start; + int ret = 0; + do { + ret = nanosleep(requested, &remain); + requested = &remain; + } while (ret != 0); + return ret; +#endif } int PS4_SYSV_ABI posix_usleep(u32 microseconds) {