|
|
|
@ -49,8 +49,7 @@ enum class ThreadStatus { |
|
|
|
WaitHLEEvent, ///< Waiting for hle event to finish |
|
|
|
WaitSleep, ///< Waiting due to a SleepThread SVC |
|
|
|
WaitIPC, ///< Waiting for the reply from an IPC request |
|
|
|
WaitSynchAny, ///< Waiting due to WaitSynch1 or WaitSynchN with wait_all = false |
|
|
|
WaitSynchAll, ///< Waiting due to WaitSynchronizationN with wait_all = true |
|
|
|
WaitSynch, ///< Waiting due to WaitSynchronization |
|
|
|
WaitMutex, ///< Waiting due to an ArbitrateLock svc |
|
|
|
WaitCondVar, ///< Waiting due to an WaitProcessWideKey svc |
|
|
|
WaitArb, ///< Waiting due to a SignalToAddress/WaitForAddress svc |
|
|
|
@ -169,11 +168,17 @@ public: |
|
|
|
return tls_memory; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Resumes a thread from waiting |
|
|
|
*/ |
|
|
|
/// Resumes a thread from waiting |
|
|
|
void ResumeFromWait(); |
|
|
|
|
|
|
|
/// Cancels a waiting operation that this thread may or may not be within. |
|
|
|
/// |
|
|
|
/// When the thread is within a waiting state, this will set the thread's |
|
|
|
/// waiting result to signal a canceled wait. The function will then resume |
|
|
|
/// this thread. |
|
|
|
/// |
|
|
|
void CancelWait(); |
|
|
|
|
|
|
|
/** |
|
|
|
* Schedules an event to wake up the specified thread after the specified delay |
|
|
|
* @param nanoseconds The time this thread will be allowed to sleep for |
|
|
|
@ -184,24 +189,27 @@ public: |
|
|
|
void CancelWakeupTimer(); |
|
|
|
|
|
|
|
/** |
|
|
|
* Sets the result after the thread awakens (from either WaitSynchronization SVC) |
|
|
|
* Sets the result after the thread awakens (from svcWaitSynchronization) |
|
|
|
* @param result Value to set to the returned result |
|
|
|
*/ |
|
|
|
void SetWaitSynchronizationResult(ResultCode result); |
|
|
|
|
|
|
|
/** |
|
|
|
* Sets the output parameter value after the thread awakens (from WaitSynchronizationN SVC only) |
|
|
|
* Sets the output parameter value after the thread awakens (from svcWaitSynchronization) |
|
|
|
* @param output Value to set to the output parameter |
|
|
|
*/ |
|
|
|
void SetWaitSynchronizationOutput(s32 output); |
|
|
|
|
|
|
|
/** |
|
|
|
* Retrieves the index that this particular object occupies in the list of objects |
|
|
|
* that the thread passed to WaitSynchronizationN, starting the search from the last element. |
|
|
|
* It is used to set the output value of WaitSynchronizationN when the thread is awakened. |
|
|
|
* that the thread passed to WaitSynchronization, starting the search from the last element. |
|
|
|
* |
|
|
|
* It is used to set the output index of WaitSynchronization when the thread is awakened. |
|
|
|
* |
|
|
|
* When a thread wakes up due to an object signal, the kernel will use the index of the last |
|
|
|
* matching object in the wait objects list in case of having multiple instances of the same |
|
|
|
* object in the list. |
|
|
|
* |
|
|
|
* @param object Object to query the index of. |
|
|
|
*/ |
|
|
|
s32 GetWaitObjectIndex(const WaitObject* object) const; |
|
|
|
@ -238,13 +246,9 @@ public: |
|
|
|
*/ |
|
|
|
VAddr GetCommandBufferAddress() const; |
|
|
|
|
|
|
|
/** |
|
|
|
* Returns whether this thread is waiting for all the objects in |
|
|
|
* its wait list to become ready, as a result of a WaitSynchronizationN call |
|
|
|
* with wait_all = true. |
|
|
|
*/ |
|
|
|
bool IsSleepingOnWaitAll() const { |
|
|
|
return status == ThreadStatus::WaitSynchAll; |
|
|
|
/// Returns whether this thread is waiting on objects from a WaitSynchronization call. |
|
|
|
bool IsSleepingOnWait() const { |
|
|
|
return status == ThreadStatus::WaitSynch; |
|
|
|
} |
|
|
|
|
|
|
|
ThreadContext& GetContext() { |
|
|
|
@ -418,7 +422,7 @@ private: |
|
|
|
Process* owner_process; |
|
|
|
|
|
|
|
/// Objects that the thread is waiting on, in the same order as they were |
|
|
|
/// passed to WaitSynchronization1/N. |
|
|
|
/// passed to WaitSynchronization. |
|
|
|
ThreadWaitObjects wait_objects; |
|
|
|
|
|
|
|
/// List of threads that are waiting for a mutex that is held by this thread. |
|
|
|
@ -441,7 +445,7 @@ private: |
|
|
|
Handle callback_handle = 0; |
|
|
|
|
|
|
|
/// Callback that will be invoked when the thread is resumed from a waiting state. If the thread |
|
|
|
/// was waiting via WaitSynchronizationN then the object will be the last object that became |
|
|
|
/// was waiting via WaitSynchronization then the object will be the last object that became |
|
|
|
/// available. In case of a timeout, the object will be nullptr. |
|
|
|
WakeupCallback wakeup_callback; |
|
|
|
|
|
|
|
|