diff --git a/src/core/piobject.cpp b/src/core/piobject.cpp index c93bad88..3326ce9f 100755 --- a/src/core/piobject.cpp +++ b/src/core/piobject.cpp @@ -95,6 +95,7 @@ void PIObject::piConnect(const PIString & src, const PIString & sig, void * dest return; } PIMutexLocker _ml(o->mutex_connect); + PIMutexLocker _mld(((PIObject*)dest)->mutex_connect, ((PIObject*)dest) != o); o->connections << Connection(ev_h, 0, sig, (PIObject*)dest, dest); ((PIObject*)dest)->connectors << o; } @@ -106,7 +107,8 @@ void PIObject::piConnect(PIObject * src, const PIString & sig, const PIString & piCout << "[PIObject] Can`t find object with name \"" << dest << "\"!"; return; } - PIMutexLocker _ml(o->mutex_connect); + PIMutexLocker _ml(src->mutex_connect); + PIMutexLocker _mld(o->mutex_connect, src != o); src->connections << Connection(ev_h, 0, sig, o, o); ((PIObject*)o)->connectors << src; } @@ -124,6 +126,7 @@ void PIObject::piConnect(const PIString & src, const PIString & sig, const PIStr return; } PIMutexLocker _ml(s->mutex_connect); + PIMutexLocker _mld(d->mutex_connect, s != d); s->connections << Connection(ev_h, 0, sig, d, d); d->connectors << s; } @@ -203,6 +206,7 @@ void PIObject::piConnect(PIObject * src, const PIString & sig, PIObject * dest_o //piCout << "piConnect" << src << (void*)(dest) << sig; //piCout << "piConnect" << src->className() << "->" << ((PIObject*)dest)->className(); PIMutexLocker _ml(src->mutex_connect); + PIMutexLocker _mld(dest_o->mutex_connect, src != dest_o); src->connections << Connection(ev_h, e_h, sig, dest_o, dest, args); //piCout << "piConnect" << ((PIObject*)dest) << sig << ((PIObject*)dest)->connectors.size_s() << "..."; //piCout << "addConnector" << dest_o << src; @@ -214,7 +218,17 @@ void PIObject::piConnect(PIObject * src, const PIString & sig, PIObject * dest_o bool PIObject::piConnectU(PIObject * src, const PIString & ename, PIObject * dest_o, void * dest, const PIString & hname) { if (src == 0 || dest_o == 0 || dest == 0) return false; + if (!src->isPIObject()) { + piCout << "[piConnectU] \"" << ename << "\" -> \"" << hname << "\" error: source object is not PIObject!"; + return false; + } + if (!dest_o->isPIObject()) { + piCout << "[piConnectU] \"" << ename << "\" -> \"" << hname << "\" error: destination object is not PIObject!"; + return false; + } PIMutexLocker ml(__eh_mutex); + PIMutexLocker mls(src->mutex_connect); + PIMutexLocker mld(dest_o->mutex_connect, src != dest_o); PIVector<__EHFunc> m_src = src->findEH(ename), m_dest = dest_o->findEH(hname); if (m_src.isEmpty()) { piCout << "[piConnectU] Error: can`t find event \"" << ename << "\" in class \"" << src->className() << "\"!"; @@ -251,6 +265,7 @@ bool PIObject::piConnectU(PIObject * src, const PIString & ename, PIObject * des void PIObject::piDisconnect(PIObject * src, const PIString & sig, PIObject * dest, void * ev_h) { PIMutexLocker _ml(src->mutex_connect); + PIMutexLocker _mld(dest->mutex_connect, src != dest); for (int i = 0; i < src->connections.size_s(); ++i) { Connection & cc(src->connections[i]); if (cc.event == sig && cc.dest_o == dest && cc.slot == ev_h) { @@ -264,6 +279,7 @@ void PIObject::piDisconnect(PIObject * src, const PIString & sig, PIObject * des void PIObject::piDisconnect(PIObject * src, const PIString & sig, PIObject * dest) { PIMutexLocker _ml(src->mutex_connect); + PIMutexLocker _mld(dest->mutex_connect, src != dest); for (int i = 0; i < src->connections.size_s(); ++i) { Connection & cc(src->connections[i]); if (cc.event == sig && cc.dest_o == dest) { @@ -283,6 +299,7 @@ void PIObject::piDisconnect(PIObject * src, const PIString & sig) { PIObject * dest = cc.dest_o; src->connections.remove(i); i--; + PIMutexLocker _mld(dest->mutex_connect, src != dest); dest->updateConnectors(); } } @@ -295,6 +312,7 @@ void PIObject::piDisconnect(PIObject * src) { PIVector cv = src->connectors.toVector(); piForeach (PIObject * o, cv) { if (o == src) continue; + PIMutexLocker _mld(o->mutex_connect, src != o); PIVector & oc(o->connections); for (int i = 0; i < oc.size_s(); ++i) { //piCout << " check" << (void*)(oc[i].dest_o) << "==" << (void*)(src); diff --git a/src/thread/pimutex.h b/src/thread/pimutex.h index bd2d09f6..8827c793 100755 --- a/src/thread/pimutex.h +++ b/src/thread/pimutex.h @@ -67,11 +67,12 @@ private: class PIP_EXPORT PIMutexLocker { public: - PIMutexLocker(PIMutex * m): mutex(m) {mutex->lock();} - PIMutexLocker(PIMutex & m): mutex(&m) {mutex->lock();} - ~PIMutexLocker() {mutex->unlock();} + PIMutexLocker(PIMutex * m, bool condition = true): mutex(m), cond(condition) {if (cond) mutex->lock();} + PIMutexLocker(PIMutex & m, bool condition = true): mutex(&m), cond(condition) {if (cond) mutex->lock();} + ~PIMutexLocker() {if (cond) mutex->unlock();} private: PIMutex * mutex; + bool cond; }; #endif // PIMUTEX_H