forked from suyu/suyu
52f58e64ef
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.)
60 lines
1.7 KiB
C++
60 lines
1.7 KiB
C++
// Copyright 2014 Citra Emulator Project
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#pragma once
|
|
|
|
#include <string>
|
|
|
|
#include "common/common_types.h"
|
|
|
|
#include "core/hle/kernel/kernel.h"
|
|
|
|
namespace Kernel {
|
|
|
|
class Thread;
|
|
|
|
class Mutex final : public WaitObject {
|
|
public:
|
|
/**
|
|
* Creates a mutex.
|
|
* @param initial_locked Specifies if the mutex should be locked initially
|
|
* @param name Optional name of mutex
|
|
* @return Pointer to new Mutex object
|
|
*/
|
|
static ResultVal<SharedPtr<Mutex>> Create(bool initial_locked, 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; }
|
|
|
|
bool initial_locked; ///< Initial lock state when mutex was created
|
|
bool locked; ///< Current locked state
|
|
std::string name; ///< Name of mutex (optional)
|
|
SharedPtr<Thread> holding_thread; ///< Thread that has acquired the mutex
|
|
|
|
bool ShouldWait() override;
|
|
void Acquire() override;
|
|
|
|
/**
|
|
* Acquires the specified mutex for the specified thread
|
|
* @param mutex Mutex that is to be acquired
|
|
* @param thread Thread that will acquire the mutex
|
|
*/
|
|
void Acquire(SharedPtr<Thread> thread);
|
|
void Release();
|
|
|
|
private:
|
|
Mutex();
|
|
~Mutex() override;
|
|
};
|
|
|
|
/**
|
|
* Releases all the mutexes held by the specified thread
|
|
* @param thread Thread that is holding the mutexes
|
|
*/
|
|
void ReleaseThreadMutexes(Thread* thread);
|
|
|
|
} // namespace
|