mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	kernel/thread: Change owner_process to std::weak_ptr (#5325)
* kernel/thread: Change owner_process to std::weak_ptr Previously this leaked almost all kernel objects. In short, Threads own Processes which own HandleTables which own maps of Objects which include Threads. Changing this to weak_ptr at least got the camera interfaces to destruct properly. Did not really check the other objects though, and I think there are probably more leaks. * hle/kernel: Lock certain objects while deserializing When deserializing other kernel objects, these objects (`MemoryRegion`s and `VMManager`s) can possibly get modified. To avoid inconsistent state caused by destructor side-effects, we may as well simply lock them until loading is fully completed. * Fix silly typo Somehow this didn't break?!
This commit is contained in:
		
							parent
							
								
									80c9f9abbb
								
							
						
					
					
						commit
						de3d7cf49f
					
				
					 13 changed files with 121 additions and 31 deletions
				
			
		|  | @ -243,7 +243,6 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeThread::GetChildren() const { | |||
|     std::vector<std::unique_ptr<WaitTreeItem>> list(WaitTreeWaitObject::GetChildren()); | ||||
| 
 | ||||
|     const auto& thread = static_cast<const Kernel::Thread&>(object); | ||||
|     const auto& process = thread.owner_process; | ||||
| 
 | ||||
|     QString processor; | ||||
|     switch (thread.processor_id) { | ||||
|  | @ -267,10 +266,12 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeThread::GetChildren() const { | |||
|     list.push_back(std::make_unique<WaitTreeText>(tr("object id = %1").arg(thread.GetObjectId()))); | ||||
|     list.push_back(std::make_unique<WaitTreeText>(tr("processor = %1").arg(processor))); | ||||
|     list.push_back(std::make_unique<WaitTreeText>(tr("thread id = %1").arg(thread.GetThreadId()))); | ||||
|     list.push_back( | ||||
|         std::make_unique<WaitTreeText>(tr("process = %1 (%2)") | ||||
|                                            .arg(QString::fromStdString(process->GetName())) | ||||
|                                            .arg(process->process_id))); | ||||
|     if (auto process = thread.owner_process.lock()) { | ||||
|         list.push_back( | ||||
|             std::make_unique<WaitTreeText>(tr("process = %1 (%2)") | ||||
|                                                .arg(QString::fromStdString(process->GetName())) | ||||
|                                                .arg(process->process_id))); | ||||
|     } | ||||
|     list.push_back(std::make_unique<WaitTreeText>(tr("priority = %1(current) / %2(normal)") | ||||
|                                                       .arg(thread.current_priority) | ||||
|                                                       .arg(thread.nominal_priority))); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue