mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-03 16:39:01 -06:00 
			
		
		
		
	svc: Implement WaitSynchronization for a single handle.
This commit is contained in:
		@@ -164,10 +164,30 @@ static ResultCode WaitSynchronization1(
 | 
			
		||||
 | 
			
		||||
/// Wait for the given handles to synchronize, timeout after the specified nanoseconds
 | 
			
		||||
static ResultCode WaitSynchronization(VAddr handles_address, u64 handle_count, s64 nano_seconds) {
 | 
			
		||||
    LOG_WARNING(Kernel_SVC,
 | 
			
		||||
                "(STUBBED) called handles_address=0x%llx, handle_count=%d, nano_seconds=%d",
 | 
			
		||||
                handles_address, handle_count, nano_seconds);
 | 
			
		||||
    return RESULT_SUCCESS;
 | 
			
		||||
    LOG_TRACE(Kernel_SVC, "called handles_address=0x%llx, handle_count=%d, nano_seconds=%d",
 | 
			
		||||
              handles_address, handle_count, nano_seconds);
 | 
			
		||||
 | 
			
		||||
    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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user