mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-31 07:59:02 -05:00 
			
		
		
		
	Kernel: Remove old and unused Mutex code.
This commit is contained in:
		| @@ -40,126 +40,6 @@ static std::pair<SharedPtr<Thread>, u32> GetHighestPriorityMutexWaitingThread(VA | ||||
|     return {highest_priority_thread, num_waiters}; | ||||
| } | ||||
|  | ||||
| void ReleaseThreadMutexes(Thread* thread) { | ||||
|     for (auto& mtx : thread->held_mutexes) { | ||||
|         mtx->SetHasWaiters(false); | ||||
|         mtx->SetHoldingThread(nullptr); | ||||
|         mtx->WakeupAllWaitingThreads(); | ||||
|     } | ||||
|     thread->held_mutexes.clear(); | ||||
| } | ||||
|  | ||||
| Mutex::Mutex() {} | ||||
| Mutex::~Mutex() {} | ||||
|  | ||||
| SharedPtr<Mutex> Mutex::Create(SharedPtr<Kernel::Thread> holding_thread, VAddr guest_addr, | ||||
|                                std::string name) { | ||||
|     SharedPtr<Mutex> mutex(new Mutex); | ||||
|  | ||||
|     mutex->guest_addr = guest_addr; | ||||
|     mutex->name = std::move(name); | ||||
|  | ||||
|     // If mutex was initialized with a holding thread, acquire it by the holding thread | ||||
|     if (holding_thread) { | ||||
|         mutex->Acquire(holding_thread.get()); | ||||
|     } | ||||
|  | ||||
|     // Mutexes are referenced by guest address, so track this in the kernel | ||||
|     g_object_address_table.Insert(guest_addr, mutex); | ||||
|  | ||||
|     return mutex; | ||||
| } | ||||
|  | ||||
| bool Mutex::ShouldWait(Thread* thread) const { | ||||
|     auto holding_thread = GetHoldingThread(); | ||||
|     return holding_thread != nullptr && thread != holding_thread; | ||||
| } | ||||
|  | ||||
| void Mutex::Acquire(Thread* thread) { | ||||
|     ASSERT_MSG(!ShouldWait(thread), "object unavailable!"); | ||||
|  | ||||
|     priority = thread->current_priority; | ||||
|     thread->held_mutexes.insert(this); | ||||
|     SetHoldingThread(thread); | ||||
|     thread->UpdatePriority(); | ||||
|     Core::System::GetInstance().PrepareReschedule(); | ||||
| } | ||||
|  | ||||
| ResultCode Mutex::Release(Thread* thread) { | ||||
|     auto holding_thread = GetHoldingThread(); | ||||
|     ASSERT(holding_thread); | ||||
|  | ||||
|     // We can only release the mutex if it's held by the calling thread. | ||||
|     ASSERT(thread == holding_thread); | ||||
|  | ||||
|     holding_thread->held_mutexes.erase(this); | ||||
|     holding_thread->UpdatePriority(); | ||||
|     SetHoldingThread(nullptr); | ||||
|     SetHasWaiters(!GetWaitingThreads().empty()); | ||||
|     WakeupAllWaitingThreads(); | ||||
|     Core::System::GetInstance().PrepareReschedule(); | ||||
|  | ||||
|     return RESULT_SUCCESS; | ||||
| } | ||||
|  | ||||
| void Mutex::AddWaitingThread(SharedPtr<Thread> thread) { | ||||
|     WaitObject::AddWaitingThread(thread); | ||||
|     thread->pending_mutexes.insert(this); | ||||
|     SetHasWaiters(true); | ||||
|     UpdatePriority(); | ||||
| } | ||||
|  | ||||
| void Mutex::RemoveWaitingThread(Thread* thread) { | ||||
|     WaitObject::RemoveWaitingThread(thread); | ||||
|     thread->pending_mutexes.erase(this); | ||||
|     if (!GetHasWaiters()) | ||||
|         SetHasWaiters(!GetWaitingThreads().empty()); | ||||
|     UpdatePriority(); | ||||
| } | ||||
|  | ||||
| void Mutex::UpdatePriority() { | ||||
|     if (!GetHoldingThread()) | ||||
|         return; | ||||
|  | ||||
|     u32 best_priority = THREADPRIO_LOWEST; | ||||
|     for (auto& waiter : GetWaitingThreads()) { | ||||
|         if (waiter->current_priority < best_priority) | ||||
|             best_priority = waiter->current_priority; | ||||
|     } | ||||
|  | ||||
|     if (best_priority != priority) { | ||||
|         priority = best_priority; | ||||
|         GetHoldingThread()->UpdatePriority(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| Handle Mutex::GetOwnerHandle() const { | ||||
|     GuestState guest_state{Memory::Read32(guest_addr)}; | ||||
|     return guest_state.holding_thread_handle; | ||||
| } | ||||
|  | ||||
| SharedPtr<Thread> Mutex::GetHoldingThread() const { | ||||
|     GuestState guest_state{Memory::Read32(guest_addr)}; | ||||
|     return g_handle_table.Get<Thread>(guest_state.holding_thread_handle); | ||||
| } | ||||
|  | ||||
| void Mutex::SetHoldingThread(SharedPtr<Thread> thread) { | ||||
|     GuestState guest_state{Memory::Read32(guest_addr)}; | ||||
|     guest_state.holding_thread_handle.Assign(thread ? thread->guest_handle : 0); | ||||
|     Memory::Write32(guest_addr, guest_state.raw); | ||||
| } | ||||
|  | ||||
| bool Mutex::GetHasWaiters() const { | ||||
|     GuestState guest_state{Memory::Read32(guest_addr)}; | ||||
|     return guest_state.has_waiters != 0; | ||||
| } | ||||
|  | ||||
| void Mutex::SetHasWaiters(bool has_waiters) { | ||||
|     GuestState guest_state{Memory::Read32(guest_addr)}; | ||||
|     guest_state.has_waiters.Assign(has_waiters ? 1 : 0); | ||||
|     Memory::Write32(guest_addr, guest_state.raw); | ||||
| } | ||||
|  | ||||
| ResultCode Mutex::TryAcquire(VAddr address, Handle holding_thread_handle, | ||||
|                              Handle requesting_thread_handle) { | ||||
|     // The mutex address must be 4-byte aligned | ||||
|   | ||||
| @@ -15,68 +15,8 @@ namespace Kernel { | ||||
|  | ||||
| class Thread; | ||||
|  | ||||
| class Mutex final : public WaitObject { | ||||
| class Mutex final { | ||||
| public: | ||||
|     /** | ||||
|      * Creates a mutex. | ||||
|      * @param holding_thread Specifies a thread already holding the mutex. If not nullptr, this | ||||
|      * thread will acquire the mutex. | ||||
|      * @param guest_addr Address of the object tracking the mutex in guest memory. If specified, | ||||
|      * this mutex will update the guest object when its state changes. | ||||
|      * @param name Optional name of mutex | ||||
|      * @return Pointer to new Mutex object | ||||
|      */ | ||||
|     static SharedPtr<Mutex> Create(SharedPtr<Kernel::Thread> holding_thread, VAddr guest_addr = 0, | ||||
|                                    std::string name = "Unknown"); | ||||
|  | ||||
|     std::string GetTypeName() const override { | ||||
|         return "Mutex"; | ||||
|     } | ||||
|     std::string GetName() const override { | ||||
|         return name; | ||||
|     } | ||||
|  | ||||
|     static const HandleType HANDLE_TYPE = HandleType::Mutex; | ||||
|     HandleType GetHandleType() const override { | ||||
|         return HANDLE_TYPE; | ||||
|     } | ||||
|  | ||||
|     u32 priority;     ///< The priority of the mutex, used for priority inheritance. | ||||
|     std::string name; ///< Name of mutex (optional) | ||||
|     VAddr guest_addr; ///< Address of the guest mutex value | ||||
|  | ||||
|     /** | ||||
|      * Elevate the mutex priority to the best priority | ||||
|      * among the priorities of all its waiting threads. | ||||
|      */ | ||||
|     void UpdatePriority(); | ||||
|  | ||||
|     bool ShouldWait(Thread* thread) const override; | ||||
|     void Acquire(Thread* thread) override; | ||||
|  | ||||
|     void AddWaitingThread(SharedPtr<Thread> thread) override; | ||||
|     void RemoveWaitingThread(Thread* thread) override; | ||||
|  | ||||
|     /** | ||||
|      * Attempts to release the mutex from the specified thread. | ||||
|      * @param thread Thread that wants to release the mutex. | ||||
|      * @returns The result code of the operation. | ||||
|      */ | ||||
|     ResultCode Release(Thread* thread); | ||||
|  | ||||
|     /// Gets the handle to the holding process stored in the guest state. | ||||
|     Handle GetOwnerHandle() const; | ||||
|  | ||||
|     /// Gets the Thread pointed to by the owner handle | ||||
|     SharedPtr<Thread> GetHoldingThread() const; | ||||
|     /// Sets the holding process handle in the guest state. | ||||
|     void SetHoldingThread(SharedPtr<Thread> thread); | ||||
|  | ||||
|     /// Returns the has_waiters bit in the guest state. | ||||
|     bool GetHasWaiters() const; | ||||
|     /// Sets the has_waiters bit in the guest state. | ||||
|     void SetHasWaiters(bool has_waiters); | ||||
|  | ||||
|     /// Flag that indicates that a mutex still has threads waiting for it. | ||||
|     static constexpr u32 MutexHasWaitersFlag = 0x40000000; | ||||
|     /// Mask of the bits in a mutex address value that contain the mutex owner. | ||||
| @@ -90,24 +30,8 @@ public: | ||||
|     static ResultCode Release(VAddr address); | ||||
|  | ||||
| private: | ||||
|     Mutex(); | ||||
|     ~Mutex() override; | ||||
|  | ||||
|     /// Object in guest memory used to track the mutex state | ||||
|     union GuestState { | ||||
|         u32_le raw; | ||||
|         /// Handle of the thread that currently holds the mutex, 0 if available | ||||
|         BitField<0, 30, u32_le> holding_thread_handle; | ||||
|         /// 1 when there are threads waiting for this mutex, otherwise 0 | ||||
|         BitField<30, 1, u32_le> has_waiters; | ||||
|     }; | ||||
|     static_assert(sizeof(GuestState) == 4, "GuestState size is incorrect"); | ||||
|     Mutex() = default; | ||||
|     ~Mutex() = default; | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Releases all the mutexes held by the specified thread | ||||
|  * @param thread Thread that is holding the mutexes | ||||
|  */ | ||||
| void ReleaseThreadMutexes(Thread* thread); | ||||
|  | ||||
| } // namespace Kernel | ||||
|   | ||||
| @@ -77,9 +77,6 @@ void Thread::Stop() { | ||||
|     } | ||||
|     wait_objects.clear(); | ||||
|  | ||||
|     // Release all the mutexes that this thread holds | ||||
|     ReleaseThreadMutexes(this); | ||||
|  | ||||
|     // Mark the TLS slot in the thread's page as free. | ||||
|     u64 tls_page = (tls_address - Memory::TLS_AREA_VADDR) / Memory::PAGE_SIZE; | ||||
|     u64 tls_slot = | ||||
|   | ||||
| @@ -55,7 +55,6 @@ enum class ThreadWakeupReason { | ||||
|  | ||||
| namespace Kernel { | ||||
|  | ||||
| class Mutex; | ||||
| class Process; | ||||
|  | ||||
| class Thread final : public WaitObject { | ||||
| @@ -206,12 +205,6 @@ public: | ||||
|  | ||||
|     VAddr tls_address; ///< Virtual address of the Thread Local Storage of the thread | ||||
|  | ||||
|     /// Mutexes currently held by this thread, which will be released when it exits. | ||||
|     boost::container::flat_set<SharedPtr<Mutex>> held_mutexes; | ||||
|  | ||||
|     /// Mutexes that this thread is currently waiting for. | ||||
|     boost::container::flat_set<SharedPtr<Mutex>> pending_mutexes; | ||||
|  | ||||
|     SharedPtr<Process> owner_process; ///< Process that owns this thread | ||||
|  | ||||
|     /// Objects that the thread is waiting on, in the same order as they were | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Subv
					Subv