svc: Implement WaitSynchronization for a single handle.

This commit is contained in:
bunnei 2018-01-06 14:34:32 -05:00
parent 57f42e5887
commit 0e978bdd50
1 changed files with 24 additions and 4 deletions

View File

@ -164,10 +164,30 @@ static ResultCode WaitSynchronization1(
/// Wait for the given handles to synchronize, timeout after the specified nanoseconds /// Wait for the given handles to synchronize, timeout after the specified nanoseconds
static ResultCode WaitSynchronization(VAddr handles_address, u64 handle_count, s64 nano_seconds) { static ResultCode WaitSynchronization(VAddr handles_address, u64 handle_count, s64 nano_seconds) {
LOG_WARNING(Kernel_SVC, LOG_TRACE(Kernel_SVC, "called handles_address=0x%llx, handle_count=%d, nano_seconds=%d",
"(STUBBED) called handles_address=0x%llx, handle_count=%d, nano_seconds=%d", handles_address, handle_count, nano_seconds);
handles_address, handle_count, nano_seconds);
return RESULT_SUCCESS; if (!Memory::IsValidVirtualAddress(handles_address))
return ERR_INVALID_POINTER;
// Check if 'handle_count' is invalid
if (handle_count < 0)
return ERR_OUT_OF_RANGE;
using ObjectPtr = SharedPtr<WaitObject>;
std::vector<ObjectPtr> objects(handle_count);
for (int i = 0; i < handle_count; ++i) {
Handle handle = Memory::Read32(handles_address + i * sizeof(Handle));
auto object = g_handle_table.Get<WaitObject>(handle);
if (object == nullptr)
return ERR_INVALID_HANDLE;
objects[i] = object;
}
// Just implement for a single handle for now
ASSERT(handle_count == 1);
return WaitSynchronization1(objects[0], GetCurrentThread(), nano_seconds);
} }
/// Attempts to locks a mutex, creating it if it does not already exist /// Attempts to locks a mutex, creating it if it does not already exist