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,