Skip to content

Commit 81c2924

Browse files
committed
use red mutex to try to fix hanging
1 parent f32a086 commit 81c2924

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

src/red4ext/ModSettings.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,8 @@ void ModSettings::RejectChanges() {
401401
}
402402

403403
void ModSettings::NotifyListeners() {
404-
std::shared_lock _(listeners_lock);
404+
// std::shared_lock _(listeners_lock);
405+
this->listeners_lock.LockShared();
405406
for (auto &[id, listener] : this->listeners) {
406407
if (listener) {
407408
auto instance = listener.Lock();
@@ -419,10 +420,12 @@ void ModSettings::NotifyListeners() {
419420
// remove?
420421
}
421422
}
423+
this->listeners_lock.UnlockShared();
422424
}
423425

424426
void ModSettings::NotifyListenersRequested(CName aGroupPath, CName aVarName) {
425-
std::shared_lock _(listeners_lock);
427+
// std::shared_lock _(listeners_lock);
428+
this->listeners_lock.LockShared();
426429
for (auto &[id, listener] : this->listeners) {
427430
if (listener) {
428431
auto instance = listener.Lock();
@@ -440,10 +443,12 @@ void ModSettings::NotifyListenersRequested(CName aGroupPath, CName aVarName) {
440443
// remove?
441444
}
442445
}
446+
this->listeners_lock.UnlockShared();
443447
}
444448

445449
void ModSettings::NotifyListenersAccepted(CName aGroupPath, CName aVarName) {
446-
std::shared_lock _(listeners_lock);
450+
// std::shared_lock _(listeners_lock);
451+
this->listeners_lock.LockShared();
447452
for (auto &[id, listener] : this->listeners) {
448453
if (listener) {
449454
auto instance = listener.Lock();
@@ -461,19 +466,24 @@ void ModSettings::NotifyListenersAccepted(CName aGroupPath, CName aVarName) {
461466
// remove?
462467
}
463468
}
469+
this->listeners_lock.UnlockShared();
464470
}
465471

466472
void ModSettings::RegisterListenerToModifications(const Handle<IScriptable> &listener) {
467473
if (listener) {
468-
std::unique_lock _(modSettings.listeners_lock);
474+
// std::unique_lock _(modSettings.listeners_lock);
475+
modSettings.listeners_lock.Lock();
469476
modSettings.listeners[listener->unk28] = listener;
477+
modSettings.listeners_lock.Unlock();
470478
}
471479
}
472480

473481
void ModSettings::UnregisterListenerToModifications(const Handle<IScriptable> &listener) {
474482
if (listener) {
475-
std::unique_lock _(modSettings.listeners_lock);
483+
// std::unique_lock _(modSettings.listeners_lock);
484+
modSettings.listeners_lock.Lock();
476485
modSettings.listeners.erase(listener->unk28);
486+
modSettings.listeners_lock.Unlock();
477487
}
478488
}
479489

src/red4ext/ModSettings.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,11 @@ class ModSettings : public IScriptable {
6969
"Memory::RTTIAllocator"
7070
" is not a valid allocator type");
7171
private:
72-
std::shared_mutex variables_lock;
72+
// std::shared_mutex variables_lock;
73+
RED4ext::SharedSpinLock variables_lock;
7374
std::map<uint32_t, WeakHandle<IScriptable>> listeners;
74-
std::shared_mutex listeners_lock;
75+
// std::shared_mutex listeners_lock;
76+
RED4ext::SharedSpinLock listeners_lock;
7577
std::map<CName, Mod*> mods;
7678
};
7779

0 commit comments

Comments
 (0)