more safety for PIObject::Connection::disconnect()

This commit is contained in:
2021-10-04 21:57:34 +03:00
parent aa76a15f40
commit c404688bbd

View File

@@ -660,7 +660,11 @@ PIObject::Connection::Connection() {
bool PIObject::Connection::disconnect() { bool PIObject::Connection::disconnect() {
if (!isValid() || !src_o) return false; if (!isValid() || !src_o) return false;
if (!src_o->isPIObject()) return false;
bool ndm = dest_o && (src_o != dest_o), ret = false, found = false; bool ndm = dest_o && (src_o != dest_o), ret = false, found = false;
if (dest_o) {
if (!dest_o->isPIObject()) ndm = false;
}
PIMutexLocker _ml(src_o->mutex_connect); PIMutexLocker _ml(src_o->mutex_connect);
if (ndm) dest_o->mutex_connect.lock(); if (ndm) dest_o->mutex_connect.lock();
for (int i = 0; i < src_o->connections.size_s(); ++i) { for (int i = 0; i < src_o->connections.size_s(); ++i) {
@@ -680,8 +684,10 @@ bool PIObject::Connection::disconnect() {
break; break;
} }
} }
if (dest_o) if (dest_o) {
if (dest_o->isPIObject())
dest_o->updateConnectors(); dest_o->updateConnectors();
}
if (ndm) dest_o->mutex_connect.unlock(); if (ndm) dest_o->mutex_connect.unlock();
return ret; return ret;
} }