core: hle: kernel: KEvent: Pass in owner KProcess on event creation.
- This is necessary to ensure resource limits are freed from the right process.
This commit is contained in:
		@@ -14,7 +14,7 @@ KEvent::KEvent(KernelCore& kernel_)
 | 
			
		||||
 | 
			
		||||
KEvent::~KEvent() = default;
 | 
			
		||||
 | 
			
		||||
void KEvent::Initialize(std::string&& name_) {
 | 
			
		||||
void KEvent::Initialize(std::string&& name_, KProcess* owner_) {
 | 
			
		||||
    // Increment reference count.
 | 
			
		||||
    // Because reference count is one on creation, this will result
 | 
			
		||||
    // in a reference count of two. Thus, when both readable and
 | 
			
		||||
@@ -30,10 +30,8 @@ void KEvent::Initialize(std::string&& name_) {
 | 
			
		||||
    writable_event.Initialize(this, name_ + ":Writable");
 | 
			
		||||
 | 
			
		||||
    // Set our owner process.
 | 
			
		||||
    owner = kernel.CurrentProcess();
 | 
			
		||||
    if (owner) {
 | 
			
		||||
        owner->Open();
 | 
			
		||||
    }
 | 
			
		||||
    owner = owner_;
 | 
			
		||||
    owner->Open();
 | 
			
		||||
 | 
			
		||||
    // Mark initialized.
 | 
			
		||||
    name = std::move(name_);
 | 
			
		||||
@@ -47,10 +45,8 @@ void KEvent::Finalize() {
 | 
			
		||||
void KEvent::PostDestroy(uintptr_t arg) {
 | 
			
		||||
    // Release the event count resource the owner process holds.
 | 
			
		||||
    KProcess* owner = reinterpret_cast<KProcess*>(arg);
 | 
			
		||||
    if (owner) {
 | 
			
		||||
        owner->GetResourceLimit()->Release(LimitableResource::Events, 1);
 | 
			
		||||
        owner->Close();
 | 
			
		||||
    }
 | 
			
		||||
    owner->GetResourceLimit()->Release(LimitableResource::Events, 1);
 | 
			
		||||
    owner->Close();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace Kernel
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ public:
 | 
			
		||||
    explicit KEvent(KernelCore& kernel_);
 | 
			
		||||
    ~KEvent() override;
 | 
			
		||||
 | 
			
		||||
    void Initialize(std::string&& name);
 | 
			
		||||
    void Initialize(std::string&& name, KProcess* owner_);
 | 
			
		||||
 | 
			
		||||
    void Finalize() override;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2332,7 +2332,7 @@ static ResultCode CreateEvent(Core::System& system, Handle* out_write, Handle* o
 | 
			
		||||
    R_UNLESS(event != nullptr, ResultOutOfResource);
 | 
			
		||||
 | 
			
		||||
    // Initialize the event.
 | 
			
		||||
    event->Initialize("CreateEvent");
 | 
			
		||||
    event->Initialize("CreateEvent", kernel.CurrentProcess());
 | 
			
		||||
 | 
			
		||||
    // Commit the thread reservation.
 | 
			
		||||
    event_reservation.Commit();
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ Kernel::KEvent* ServiceContext::CreateEvent(std::string&& name) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Initialize the event.
 | 
			
		||||
    event->Initialize(std::move(name));
 | 
			
		||||
    event->Initialize(std::move(name), process);
 | 
			
		||||
 | 
			
		||||
    // Commit the thread reservation.
 | 
			
		||||
    event_reservation.Commit();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user