forked from suyu/suyu
Merge pull request #937 from yuriks/codeset-leak
Ensure all kernel objects are released during shutdown
This commit is contained in:
commit
32be6a4553
12 changed files with 45 additions and 8 deletions
|
@ -37,6 +37,10 @@ void Thread::Acquire() {
|
|||
ASSERT_MSG(!ShouldWait(), "object unavailable!");
|
||||
}
|
||||
|
||||
// TODO(yuriks): This can be removed if Thread objects are explicitly pooled in the future, allowing
|
||||
// us to simply use a pool index or similar.
|
||||
static Kernel::HandleTable wakeup_callback_handle_table;
|
||||
|
||||
// Lists all thread ids that aren't deleted/etc.
|
||||
static std::vector<SharedPtr<Thread>> thread_list;
|
||||
|
||||
|
@ -93,6 +97,8 @@ void Thread::Stop() {
|
|||
|
||||
// Cancel any outstanding wakeup events for this thread
|
||||
CoreTiming::UnscheduleEvent(ThreadWakeupEventType, callback_handle);
|
||||
wakeup_callback_handle_table.Close(callback_handle);
|
||||
callback_handle = 0;
|
||||
|
||||
// Clean up thread from ready queue
|
||||
// This is only needed when the thread is termintated forcefully (SVC TerminateProcess)
|
||||
|
@ -108,6 +114,7 @@ void Thread::Stop() {
|
|||
for (auto& wait_object : wait_objects) {
|
||||
wait_object->RemoveWaitingThread(this);
|
||||
}
|
||||
wait_objects.clear();
|
||||
|
||||
Kernel::g_current_process->used_tls_slots[tls_index] = false;
|
||||
|
||||
|
@ -268,10 +275,6 @@ void WaitCurrentThread_ArbitrateAddress(VAddr wait_address) {
|
|||
thread->status = THREADSTATUS_WAIT_ARB;
|
||||
}
|
||||
|
||||
// TODO(yuriks): This can be removed if Thread objects are explicitly pooled in the future, allowing
|
||||
// us to simply use a pool index or similar.
|
||||
static Kernel::HandleTable wakeup_callback_handle_table;
|
||||
|
||||
/**
|
||||
* Callback that will wake up the thread it was scheduled for
|
||||
* @param thread_handle The handle of the thread that's been awoken
|
||||
|
@ -503,12 +506,16 @@ void ThreadingInit() {
|
|||
|
||||
current_thread = nullptr;
|
||||
next_thread_id = 1;
|
||||
}
|
||||
|
||||
void ThreadingShutdown() {
|
||||
current_thread = nullptr;
|
||||
|
||||
for (auto& t : thread_list) {
|
||||
t->Stop();
|
||||
}
|
||||
thread_list.clear();
|
||||
ready_queue.clear();
|
||||
}
|
||||
|
||||
void ThreadingShutdown() {
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
|
|
@ -406,6 +406,9 @@ void Shutdown() {
|
|||
lock = nullptr;
|
||||
notification_event = nullptr;
|
||||
parameter_event = nullptr;
|
||||
|
||||
next_parameter.object = nullptr;
|
||||
|
||||
HLE::Applets::Shutdown();
|
||||
}
|
||||
|
||||
|
|
|
@ -310,4 +310,9 @@ Interface::Interface() {
|
|||
Register(FunctionTable);
|
||||
}
|
||||
|
||||
Interface::~Interface() {
|
||||
semaphore_event = nullptr;
|
||||
interrupt_event = nullptr;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
|
|
@ -16,6 +16,7 @@ namespace DSP_DSP {
|
|||
class Interface : public Service::Interface {
|
||||
public:
|
||||
Interface();
|
||||
~Interface() override;
|
||||
|
||||
std::string GetPortName() const override {
|
||||
return "dsp::DSP";
|
||||
|
|
|
@ -584,7 +584,7 @@ const Interface::FunctionInfo FunctionTable[] = {
|
|||
Interface::Interface() {
|
||||
Register(FunctionTable);
|
||||
|
||||
g_interrupt_event = 0;
|
||||
g_interrupt_event = nullptr;
|
||||
|
||||
using Kernel::MemoryPermission;
|
||||
g_shared_memory = Kernel::SharedMemory::Create(0x1000, MemoryPermission::ReadWrite,
|
||||
|
@ -593,4 +593,9 @@ Interface::Interface() {
|
|||
g_thread_id = 0;
|
||||
}
|
||||
|
||||
Interface::~Interface() {
|
||||
g_interrupt_event = nullptr;
|
||||
g_shared_memory = nullptr;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
|
|
@ -161,6 +161,7 @@ static_assert(sizeof(CommandBuffer) == 0x200, "CommandBuffer struct has incorrec
|
|||
class Interface : public Service::Interface {
|
||||
public:
|
||||
Interface();
|
||||
~Interface() override;
|
||||
|
||||
std::string GetPortName() const override {
|
||||
return "gsp::Gpu";
|
||||
|
|
|
@ -125,4 +125,8 @@ Interface::Interface() {
|
|||
Register(FunctionTable);
|
||||
}
|
||||
|
||||
Interface::~Interface() {
|
||||
handle_event = nullptr;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
|
|
@ -16,6 +16,7 @@ namespace NWM_UDS {
|
|||
class Interface : public Service::Interface {
|
||||
public:
|
||||
Interface();
|
||||
~Interface() override;
|
||||
|
||||
std::string GetPortName() const override {
|
||||
return "nwm::UDS";
|
||||
|
|
|
@ -68,4 +68,8 @@ Interface::Interface() {
|
|||
Register(FunctionTable);
|
||||
}
|
||||
|
||||
Interface::~Interface() {
|
||||
event_handle = nullptr;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
|
|
@ -13,6 +13,7 @@ namespace SRV {
|
|||
class Interface : public Service::Interface {
|
||||
public:
|
||||
Interface();
|
||||
~Interface() override;
|
||||
|
||||
std::string GetPortName() const override {
|
||||
return "srv:";
|
||||
|
|
|
@ -410,4 +410,8 @@ Interface::Interface() {
|
|||
Register(FunctionTable);
|
||||
}
|
||||
|
||||
Interface::~Interface() {
|
||||
completion_event = nullptr;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
|
|
@ -112,6 +112,7 @@ struct ConversionConfiguration {
|
|||
class Interface : public Service::Interface {
|
||||
public:
|
||||
Interface();
|
||||
~Interface() override;
|
||||
|
||||
std::string GetPortName() const override {
|
||||
return "y2r:u";
|
||||
|
|
Loading…
Reference in a new issue