summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/thread.h
diff options
context:
space:
mode:
authorGravatar Subv2017-09-28 11:53:32 -0500
committerGravatar Subv2017-09-28 11:53:32 -0500
commit8432749db7afecc9beea20f993cc036418caaa15 (patch)
tree10dd3fcd755bd7bdc27eef120885c7e700ab4288 /src/core/hle/kernel/thread.h
parentMerge pull request #2907 from Subv/warnings3 (diff)
downloadyuzu-8432749db7afecc9beea20f993cc036418caaa15.tar.gz
yuzu-8432749db7afecc9beea20f993cc036418caaa15.tar.xz
yuzu-8432749db7afecc9beea20f993cc036418caaa15.zip
Kernel/Threads: When putting a thread to wait, specify a function to execute when it is awoken.
This change makes for a clearer (less confusing) path of execution in the scheduler, now the code to execute when a thread awakes is closer to the code that puts the thread to sleep (WaitSynch1, WaitSynchN). It also allows us to implement the special wake up behavior of ReplyAndReceive without hacking up WaitObject::WakeupAllWaitingThreads. If savestates are desired in the future, we can change this implementation to one similar to the CoreTiming event system, where we first register the callback functions at startup and assign their identifiers to the Thread callback variable instead of directly assigning a lambda to the wake up callback variable.
Diffstat (limited to 'src/core/hle/kernel/thread.h')
-rw-r--r--src/core/hle/kernel/thread.h15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/core/hle/kernel/thread.h b/src/core/hle/kernel/thread.h
index 6a3566f15..328f1a86a 100644
--- a/src/core/hle/kernel/thread.h
+++ b/src/core/hle/kernel/thread.h
@@ -41,6 +41,11 @@ enum ThreadStatus {
41 THREADSTATUS_DEAD ///< Run to completion, or forcefully terminated 41 THREADSTATUS_DEAD ///< Run to completion, or forcefully terminated
42}; 42};
43 43
44enum class ThreadWakeupReason {
45 Signal, // The thread was woken up by WakeupAllWaitingThreads due to an object signal.
46 Timeout // The thread was woken up due to a wait timeout.
47};
48
44namespace Kernel { 49namespace Kernel {
45 50
46class Mutex; 51class Mutex;
@@ -197,14 +202,18 @@ public:
197 202
198 VAddr wait_address; ///< If waiting on an AddressArbiter, this is the arbitration address 203 VAddr wait_address; ///< If waiting on an AddressArbiter, this is the arbitration address
199 204
200 /// True if the WaitSynchronizationN output parameter should be set on thread wakeup.
201 bool wait_set_output;
202
203 std::string name; 205 std::string name;
204 206
205 /// Handle used as userdata to reference this object when inserting into the CoreTiming queue. 207 /// Handle used as userdata to reference this object when inserting into the CoreTiming queue.
206 Handle callback_handle; 208 Handle callback_handle;
207 209
210 using WakeupCallback = void(ThreadWakeupReason reason, SharedPtr<Thread> thread,
211 SharedPtr<WaitObject> object);
212 // Callback that will be invoked when the thread is resumed from a waiting state. If the thread
213 // was waiting via WaitSynchronizationN then the object will be the last object that became
214 // available. In case of a timeout, the object will be nullptr.
215 std::function<WakeupCallback> wakeup_callback;
216
208private: 217private:
209 Thread(); 218 Thread();
210 ~Thread() override; 219 ~Thread() override;