mirror of
https://git.h3cjp.net/H3cJP/citra.git
synced 2024-12-27 13:46:54 +00:00
SVC: Implemented CancelSynchronization.
This commit is contained in:
parent
a418f6e77b
commit
bc91ebacc1
|
@ -22,6 +22,8 @@ enum {
|
||||||
// Confirmed Switch OS error codes
|
// Confirmed Switch OS error codes
|
||||||
InvalidHandle = 114,
|
InvalidHandle = 114,
|
||||||
Timeout = 117,
|
Timeout = 117,
|
||||||
|
SynchronizationCanceled = 118,
|
||||||
|
TooLarge = 119,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -216,6 +216,22 @@ static ResultCode WaitSynchronization(Handle* index, VAddr handles_address, u64
|
||||||
return WaitSynchronization1(objects[0], GetCurrentThread(), nano_seconds);
|
return WaitSynchronization1(objects[0], GetCurrentThread(), nano_seconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Resumes a thread waiting on WaitSynchronization
|
||||||
|
static ResultCode CancelSynchronization(Handle thread_handle) {
|
||||||
|
LOG_TRACE(Kernel_SVC, "called thread=0x%08X", thread_handle);
|
||||||
|
|
||||||
|
const SharedPtr<Thread> thread = g_handle_table.Get<Thread>(thread_handle);
|
||||||
|
if (!thread) {
|
||||||
|
return ERR_INVALID_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT(thread->status == THREADSTATUS_WAIT_SYNCH_ANY);
|
||||||
|
thread->SetWaitSynchronizationResult(
|
||||||
|
ResultCode(ErrorModule::Kernel, ErrCodes::SynchronizationCanceled));
|
||||||
|
thread->ResumeFromWait();
|
||||||
|
return RESULT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/// 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
|
||||||
static ResultCode LockMutex(Handle holding_thread_handle, VAddr mutex_addr,
|
static ResultCode LockMutex(Handle holding_thread_handle, VAddr mutex_addr,
|
||||||
Handle requesting_thread_handle) {
|
Handle requesting_thread_handle) {
|
||||||
|
@ -646,7 +662,7 @@ static const FunctionDef SVC_Table[] = {
|
||||||
{0x16, SvcWrap<CloseHandle>, "CloseHandle"},
|
{0x16, SvcWrap<CloseHandle>, "CloseHandle"},
|
||||||
{0x17, nullptr, "ResetSignal"},
|
{0x17, nullptr, "ResetSignal"},
|
||||||
{0x18, SvcWrap<WaitSynchronization>, "WaitSynchronization"},
|
{0x18, SvcWrap<WaitSynchronization>, "WaitSynchronization"},
|
||||||
{0x19, nullptr, "CancelSynchronization"},
|
{0x19, SvcWrap<CancelSynchronization>, "CancelSynchronization"},
|
||||||
{0x1A, SvcWrap<LockMutex>, "LockMutex"},
|
{0x1A, SvcWrap<LockMutex>, "LockMutex"},
|
||||||
{0x1B, SvcWrap<UnlockMutex>, "UnlockMutex"},
|
{0x1B, SvcWrap<UnlockMutex>, "UnlockMutex"},
|
||||||
{0x1C, SvcWrap<WaitProcessWideKeyAtomic>, "WaitProcessWideKeyAtomic"},
|
{0x1C, SvcWrap<WaitProcessWideKeyAtomic>, "WaitProcessWideKeyAtomic"},
|
||||||
|
|
Loading…
Reference in a new issue