Fix domain unallocation failure in WaitableManager

This commit is contained in:
Michael Scire 2018-11-08 16:00:04 -08:00
parent 3e87318090
commit bcd80ab445

View File

@ -48,7 +48,7 @@ class WaitableManager : public SessionManagerBase {
private: private:
/* Domain Manager */ /* Domain Manager */
HosMutex domain_lock; HosMutex domain_lock;
std::array<std::weak_ptr<IDomainObject>, ManagerOptions::MaxDomains> domains; std::array<uintptr_t, ManagerOptions::MaxDomains> domain_keys;
std::array<bool, ManagerOptions::MaxDomains> is_domain_allocated; std::array<bool, ManagerOptions::MaxDomains> is_domain_allocated;
std::array<DomainEntry, ManagerOptions::MaxDomainObjects> domain_objects; std::array<DomainEntry, ManagerOptions::MaxDomainObjects> domain_objects;
@ -323,7 +323,7 @@ class WaitableManager : public SessionManagerBase {
for (size_t i = 0; i < ManagerOptions::MaxDomains; i++) { for (size_t i = 0; i < ManagerOptions::MaxDomains; i++) {
if (!this->is_domain_allocated[i]) { if (!this->is_domain_allocated[i]) {
auto new_domain = std::make_shared<IDomainObject>(this); auto new_domain = std::make_shared<IDomainObject>(this);
this->domains[i] = new_domain; this->domain_keys[i] = reinterpret_cast<uintptr_t>(new_domain.get());
this->is_domain_allocated[i] = true; this->is_domain_allocated[i] = true;
return new_domain; return new_domain;
} }
@ -337,8 +337,7 @@ class WaitableManager : public SessionManagerBase {
FreeObject(domain, i+1); FreeObject(domain, i+1);
} }
for (size_t i = 0; i < ManagerOptions::MaxDomains; i++) { for (size_t i = 0; i < ManagerOptions::MaxDomains; i++) {
auto observe = this->domains[i].lock(); if (this->domain_keys[i] == reinterpret_cast<uintptr_t>(domain)) {
if (observe.get() == domain) {
this->is_domain_allocated[i] = false; this->is_domain_allocated[i] = false;
break; break;
} }