summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/kernel.h
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2015-01-31 23:26:16 -0200
committerGravatar Yuri Kunde Schlesner2015-02-02 15:37:08 -0200
commit52f58e64efbf43c114f701eb8f39fb463138ffb8 (patch)
treeeb40cc649b524febe841e463d6de7bce025a8105 /src/core/hle/kernel/kernel.h
parentExplicitly instantiate constructors/destructors for Kernel objects (diff)
downloadyuzu-52f58e64efbf43c114f701eb8f39fb463138ffb8.tar.gz
yuzu-52f58e64efbf43c114f701eb8f39fb463138ffb8.tar.xz
yuzu-52f58e64efbf43c114f701eb8f39fb463138ffb8.zip
Kernel: Make WaitObjects share ownership of Threads waiting on them
During normal operation, a thread waiting on an WaitObject and the object hold mutual references to each other for the duration of the wait. If a process is forcefully terminated (The CTR kernel has a SVC to do this, TerminateProcess, though no equivalent exists for threads.) its threads would also be stopped and destroyed, leaving dangling pointers in the WaitObjects. The solution is to simply have the Thread remove itself from WaitObjects when it is stopped. The vector of Threads in WaitObject has also been changed to hold SharedPtrs, just in case. (Better to have a reference cycle than a crash.)
Diffstat (limited to 'src/core/hle/kernel/kernel.h')
-rw-r--r--src/core/hle/kernel/kernel.h10
1 files changed, 5 insertions, 5 deletions
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index bf5b47a61..4d8e388b6 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -136,25 +136,26 @@ public:
136 * Add a thread to wait on this object 136 * Add a thread to wait on this object
137 * @param thread Pointer to thread to add 137 * @param thread Pointer to thread to add
138 */ 138 */
139 void AddWaitingThread(Thread* thread); 139 void AddWaitingThread(SharedPtr<Thread> thread);
140 140
141 /** 141 /**
142 * Removes a thread from waiting on this object (e.g. if it was resumed already) 142 * Removes a thread from waiting on this object (e.g. if it was resumed already)
143 * @param thread Pointer to thread to remove 143 * @param thread Pointer to thread to remove
144 */ 144 */
145 void RemoveWaitingThread(Thread* thead); 145 void RemoveWaitingThread(Thread* thread);
146 146
147 /** 147 /**
148 * Wake up the next thread waiting on this object 148 * Wake up the next thread waiting on this object
149 * @return Pointer to the thread that was resumed, nullptr if no threads are waiting 149 * @return Pointer to the thread that was resumed, nullptr if no threads are waiting
150 */ 150 */
151 Thread* WakeupNextThread(); 151 SharedPtr<Thread> WakeupNextThread();
152 152
153 /// Wake up all threads waiting on this object 153 /// Wake up all threads waiting on this object
154 void WakeupAllWaitingThreads(); 154 void WakeupAllWaitingThreads();
155 155
156private: 156private:
157 std::vector<Thread*> waiting_threads; ///< Threads waiting for this object to become available 157 /// Threads waiting for this object to become available
158 std::vector<SharedPtr<Thread>> waiting_threads;
158}; 159};
159 160
160/** 161/**
@@ -275,7 +276,6 @@ private:
275}; 276};
276 277
277extern HandleTable g_handle_table; 278extern HandleTable g_handle_table;
278extern SharedPtr<Thread> g_main_thread;
279 279
280/// The ID code of the currently running game 280/// The ID code of the currently running game
281/// TODO(Subv): This variable should not be here, 281/// TODO(Subv): This variable should not be here,