fix: removeAllFilters holds lock during delete — move destructors outside lock scope

This commit is contained in:
2026-08-06 09:08:15 +03:00
parent 1b23a258b8
commit 6af730cb8a
+9 -3
View File
@@ -572,6 +572,8 @@ bool PIConnection::removeFilter(const PIString & name_) {
void PIConnection::removeAllFilters() { void PIConnection::removeAllFilters() {
PIVector<Extractor *> to_delete;
PIVector<PIDiagnostics *> diags_to_delete;
__device_pool__->lock(); __device_pool__->lock();
for (auto i = extractors.begin(); i != extractors.end(); i++) { for (auto i = extractors.begin(); i != extractors.end(); i++) {
if (!i.value()) continue; if (!i.value()) continue;
@@ -581,14 +583,18 @@ void PIConnection::removeAllFilters() {
it.value().removeAll(i.value()->extractor); it.value().removeAll(i.value()->extractor);
} }
if (diags_.value(i.value()->extractor)) { if (diags_.value(i.value()->extractor)) {
delete diags_.value(i.value()->extractor); diags_to_delete << diags_.value(i.value()->extractor);
}
diags_.remove(i.value()->extractor); diags_.remove(i.value()->extractor);
delete i.value(); }
to_delete << i.value();
} }
extractors.clear(); extractors.clear();
bounded_extractors.clear(); bounded_extractors.clear();
__device_pool__->unlock(); __device_pool__->unlock();
for (auto e: to_delete)
delete e;
for (auto d: diags_to_delete)
delete d;
} }