From 123321e2bc0e87e9069a1a2f6ac5362cf1753839 Mon Sep 17 00:00:00 2001 From: Ivan Chikish Date: Wed, 12 Jul 2023 13:17:53 +0300 Subject: [PATCH] [orbis-kernel] Implement umtx_nwake_private --- orbis-kernel/include/orbis/umtx.hpp | 2 +- orbis-kernel/src/sys/sys_umtx.cpp | 2 +- orbis-kernel/src/umtx.cpp | 16 +++++++++++----- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/orbis-kernel/include/orbis/umtx.hpp b/orbis-kernel/include/orbis/umtx.hpp index c02422177..436238154 100644 --- a/orbis-kernel/include/orbis/umtx.hpp +++ b/orbis-kernel/include/orbis/umtx.hpp @@ -92,7 +92,7 @@ ErrorCode umtx_sem_wait(Thread *thread, ptr obj, std::int64_t val, ptr uaddr1, ptr uaddr2); ErrorCode umtx_sem_wake(Thread *thread, ptr obj, std::int64_t val, ptr uaddr1, ptr uaddr2); -ErrorCode umtx_nwake_private(Thread *thread, ptr uaddrs, +ErrorCode umtx_nwake_private(Thread *thread, ptr uaddrs, std::int64_t count); ErrorCode umtx_wake2_umutex(Thread *thread, ptr obj, std::int64_t val, ptr uaddr1, ptr uaddr2); diff --git a/orbis-kernel/src/sys/sys_umtx.cpp b/orbis-kernel/src/sys/sys_umtx.cpp index 9993c9b0f..b73a008de 100644 --- a/orbis-kernel/src/sys/sys_umtx.cpp +++ b/orbis-kernel/src/sys/sys_umtx.cpp @@ -142,7 +142,7 @@ orbis::SysResult orbis::sys__umtx_op(Thread *thread, ptr obj, sint op, case 20: return umtx_sem_wake(thread, obj, val, uaddr1, uaddr2); case 21: - return umtx_nwake_private(thread, obj, val); + return umtx_nwake_private(thread, (ptr)obj, val); case 22: return umtx_wake2_umutex(thread, obj, val, uaddr1, uaddr2); } diff --git a/orbis-kernel/src/umtx.cpp b/orbis-kernel/src/umtx.cpp index 0bfb73156..266901e8e 100644 --- a/orbis-kernel/src/umtx.cpp +++ b/orbis-kernel/src/umtx.cpp @@ -354,8 +354,7 @@ orbis::ErrorCode orbis::umtx_rw_unlock(Thread *thread, ptr obj, orbis::ErrorCode orbis::umtx_wake_private(Thread *thread, ptr uaddr, sint n_wake) { - ORBIS_LOG_TODO(__FUNCTION__, uaddr, n_wake); - return ErrorCode::NOSYS; + return umtx_wake(thread, uaddr, n_wake); } orbis::ErrorCode orbis::umtx_wait_umutex(Thread *thread, ptr m, @@ -406,10 +405,17 @@ orbis::ErrorCode orbis::umtx_sem_wake(Thread *thread, ptr obj, return ErrorCode::NOSYS; } -orbis::ErrorCode orbis::umtx_nwake_private(Thread *thread, ptr uaddrs, +orbis::ErrorCode orbis::umtx_nwake_private(Thread *thread, ptr uaddrs, std::int64_t count) { - ORBIS_LOG_TODO(__FUNCTION__, uaddrs, count); - return ErrorCode::NOSYS; + ORBIS_LOG_NOTICE(__FUNCTION__, uaddrs, count); + while (count-- > 0) { + void *uaddr; + auto error = uread(uaddr, uaddrs); + if (error != ErrorCode{}) + return error; + umtx_wake_private(thread, uaddr, 1); + } + return {}; } orbis::ErrorCode orbis::umtx_wake2_umutex(Thread *thread, ptr obj,