piDisconnectAll private
This commit is contained in:
@@ -91,9 +91,11 @@ PIObject::~PIObject() {
|
|||||||
mutexObjects().lock();
|
mutexObjects().lock();
|
||||||
objects().removeAll(this);
|
objects().removeAll(this);
|
||||||
mutexObjects().unlock();
|
mutexObjects().unlock();
|
||||||
piDisconnect(this);
|
deleted(this);
|
||||||
|
piDisconnectAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PIMap<PIString, PIVariant> PIObject::properties() const {
|
PIMap<PIString, PIVariant> PIObject::properties() const {
|
||||||
PIMap<PIString, PIVariant> ret;
|
PIMap<PIString, PIVariant> ret;
|
||||||
piForeachC (PropertyHash p, properties_)
|
piForeachC (PropertyHash p, properties_)
|
||||||
@@ -404,37 +406,38 @@ void PIObject::piDisconnect(PIObject * src, const PIString & sig) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PIObject::piDisconnect(PIObject * src) {
|
void PIObject::piDisconnectAll() {
|
||||||
src->deleted(src);
|
PIMutexLocker _ml(mutex_connect);
|
||||||
PIMutexLocker _ml(src->mutex_connect);
|
PIVector<PIObject * > cv = connectors.toVector();
|
||||||
PIVector<PIObject * > cv = src->connectors.toVector();
|
// piCout << "disconnect connectors =" << connectors.size();
|
||||||
piForeach (PIObject * o, cv) {
|
piForeach (PIObject * o, cv) {
|
||||||
//piCout << "disconnect"<< src->className()<< o->className();
|
// piCout << "disconnect"<< src << o;
|
||||||
if (!o || (o == src)) continue;
|
if (!o || (o == this)) continue;
|
||||||
if (!o->isPIObject()) continue;
|
if (!o->isPIObject()) continue;
|
||||||
#if !defined(ANDROID) && !defined(MAC_OS) && !defined(FREERTOS)
|
#if !defined(ANDROID) && !defined(MAC_OS) && !defined(FREERTOS)
|
||||||
PIMutexLocker _mld(o->mutex_connect, src != o);
|
PIMutexLocker _mld(o->mutex_connect, this != o);
|
||||||
#endif
|
#endif
|
||||||
PIVector<__Connection> & oc(o->connections);
|
PIVector<__Connection> & oc(o->connections);
|
||||||
for (int i = 0; i < oc.size_s(); ++i) {
|
for (int i = 0; i < oc.size_s(); ++i) {
|
||||||
if (oc[i].functor) continue;
|
if (oc[i].functor) continue;
|
||||||
//piCout << " check" << (void*)(oc[i].dest_o) << "==" << (void*)(src);
|
//piCout << " check" << (void*)(oc[i].dest_o) << "==" << (void*)(src);
|
||||||
if (oc[i].dest_o == src) {
|
if (oc[i].dest_o == this) {
|
||||||
oc[i].destroy();
|
oc[i].destroy();
|
||||||
oc.remove(i);
|
oc.remove(i);
|
||||||
--i;
|
--i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
piForeachC (PIObject::__Connection & c, src->connections) {
|
// piCout << "disconnect connections =" << connections.size();
|
||||||
|
piForeachC (PIObject::__Connection & c, connections) {
|
||||||
if (c.functor) continue;
|
if (c.functor) continue;
|
||||||
if (!c.dest_o) continue;
|
if (!c.dest_o) continue;
|
||||||
if (!c.dest_o->isPIObject()) continue;
|
if (!c.dest_o->isPIObject()) continue;
|
||||||
c.dest_o->connectors.remove(src);
|
c.dest_o->connectors.remove(this);
|
||||||
}
|
}
|
||||||
for (int i = 0; i < src->connections.size_s(); ++i)
|
for (int i = 0; i < connections.size_s(); ++i)
|
||||||
src->connections[i].destroy();
|
connections[i].destroy();
|
||||||
src->connections.clear();
|
connections.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -160,10 +160,7 @@ public:
|
|||||||
|
|
||||||
//! Disconnect object "src" from all connections with event name "sig"
|
//! Disconnect object "src" from all connections with event name "sig"
|
||||||
static void piDisconnect(PIObject * src, const PIString & sig);
|
static void piDisconnect(PIObject * src, const PIString & sig);
|
||||||
|
|
||||||
//! Disconnect object "src" from all connections, i.e. all connections where object "src" is emitter
|
|
||||||
static void piDisconnect(PIObject * src);
|
|
||||||
|
|
||||||
// / Raise events
|
// / Raise events
|
||||||
static void raiseEvent(PIObject * sender, const uint eventID) {
|
static void raiseEvent(PIObject * sender, const uint eventID) {
|
||||||
for (int j = 0; j < sender->connections.size_s(); ++j) {
|
for (int j = 0; j < sender->connections.size_s(); ++j) {
|
||||||
@@ -488,6 +485,8 @@ private:
|
|||||||
PIVector<__MetaFunc> findEH(const PIString & name) const;
|
PIVector<__MetaFunc> findEH(const PIString & name) const;
|
||||||
__MetaFunc methodEH(const void * addr) const;
|
__MetaFunc methodEH(const void * addr) const;
|
||||||
void updateConnectors();
|
void updateConnectors();
|
||||||
|
void piDisconnectAll();
|
||||||
|
|
||||||
void postQueuedEvent(const __QueuedEvent & e);
|
void postQueuedEvent(const __QueuedEvent & e);
|
||||||
void eventBegin() {in_event_cnt++;}
|
void eventBegin() {in_event_cnt++;}
|
||||||
void eventEnd () {in_event_cnt--;}
|
void eventEnd () {in_event_cnt--;}
|
||||||
|
|||||||
@@ -5,8 +5,13 @@
|
|||||||
class Object : public PIObject
|
class Object : public PIObject
|
||||||
{
|
{
|
||||||
PIOBJECT(Object)
|
PIOBJECT(Object)
|
||||||
public:
|
public:
|
||||||
Object() {x=0;}
|
Object() {
|
||||||
|
x=0;
|
||||||
|
// CONNECTL(this, deleted, [](PIObject * o){
|
||||||
|
// piCout << "deteted" << o;
|
||||||
|
// });
|
||||||
|
}
|
||||||
void test() {event_test();}
|
void test() {event_test();}
|
||||||
void test_val() {event_val(x);}
|
void test_val() {event_val(x);}
|
||||||
int getX() const {return x;}
|
int getX() const {return x;}
|
||||||
@@ -41,12 +46,15 @@ TEST(PiobjectConnections, CONNECT0) {
|
|||||||
b.test();
|
b.test();
|
||||||
ASSERT_EQ(a.getX(), 0);
|
ASSERT_EQ(a.getX(), 0);
|
||||||
ASSERT_EQ(b.getX(), 1);
|
ASSERT_EQ(b.getX(), 1);
|
||||||
|
// piCout << "================";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST(PiobjectConnections, CONNECT0_DISCONNECT) {
|
TEST(PiobjectConnections, CONNECT0_DISCONNECT) {
|
||||||
Object a;
|
Object a;
|
||||||
Object b;
|
Object b;
|
||||||
|
a.setName("A");
|
||||||
|
b.setName("B");
|
||||||
ASSERT_EQ(a.getX(), 0);
|
ASSERT_EQ(a.getX(), 0);
|
||||||
ASSERT_EQ(b.getX(), 0);
|
ASSERT_EQ(b.getX(), 0);
|
||||||
a.test();
|
a.test();
|
||||||
@@ -64,7 +72,7 @@ TEST(PiobjectConnections, CONNECT0_DISCONNECT) {
|
|||||||
b.test();
|
b.test();
|
||||||
ASSERT_EQ(a.getX(), 0);
|
ASSERT_EQ(a.getX(), 0);
|
||||||
ASSERT_EQ(b.getX(), 1);
|
ASSERT_EQ(b.getX(), 1);
|
||||||
a.piDisconnect(&b);
|
PIObject::piDisconnect(&a, "event_test");
|
||||||
ASSERT_EQ(a.getX(), 0);
|
ASSERT_EQ(a.getX(), 0);
|
||||||
ASSERT_EQ(b.getX(), 1);
|
ASSERT_EQ(b.getX(), 1);
|
||||||
a.test();
|
a.test();
|
||||||
@@ -73,6 +81,7 @@ TEST(PiobjectConnections, CONNECT0_DISCONNECT) {
|
|||||||
b.test();
|
b.test();
|
||||||
ASSERT_EQ(a.getX(), 0);
|
ASSERT_EQ(a.getX(), 0);
|
||||||
ASSERT_EQ(b.getX(), 1);
|
ASSERT_EQ(b.getX(), 1);
|
||||||
|
// piCout << "================";
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(PiobjectConnections, CONNECTU) {
|
TEST(PiobjectConnections, CONNECTU) {
|
||||||
@@ -95,6 +104,7 @@ TEST(PiobjectConnections, CONNECTU) {
|
|||||||
b.test();
|
b.test();
|
||||||
ASSERT_EQ(a.getX(), 0);
|
ASSERT_EQ(a.getX(), 0);
|
||||||
ASSERT_EQ(b.getX(), 1);
|
ASSERT_EQ(b.getX(), 1);
|
||||||
|
// piCout << "================";
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(PiobjectConnections, CONNECTU_DISCONNECT) {
|
TEST(PiobjectConnections, CONNECTU_DISCONNECT) {
|
||||||
@@ -117,7 +127,7 @@ TEST(PiobjectConnections, CONNECTU_DISCONNECT) {
|
|||||||
b.test();
|
b.test();
|
||||||
ASSERT_EQ(a.getX(), 0);
|
ASSERT_EQ(a.getX(), 0);
|
||||||
ASSERT_EQ(b.getX(), 1);
|
ASSERT_EQ(b.getX(), 1);
|
||||||
PIObject::piDisconnect(&a);
|
PIObject::piDisconnect(&a, "event_test");
|
||||||
ASSERT_EQ(a.getX(), 0);
|
ASSERT_EQ(a.getX(), 0);
|
||||||
ASSERT_EQ(b.getX(), 1);
|
ASSERT_EQ(b.getX(), 1);
|
||||||
a.test();
|
a.test();
|
||||||
@@ -144,6 +154,7 @@ TEST(PiobjectConnections, CONNECTU_DISCONNECT) {
|
|||||||
a.test_val();
|
a.test_val();
|
||||||
ASSERT_EQ(a.getX(), -1);
|
ASSERT_EQ(a.getX(), -1);
|
||||||
ASSERT_EQ(b.getX(), 99);
|
ASSERT_EQ(b.getX(), 99);
|
||||||
|
// piCout << "================";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -169,6 +180,7 @@ TEST(PiobjectConnections, CONNECTL) {
|
|||||||
b.test();
|
b.test();
|
||||||
ASSERT_EQ(a.getX(), 0);
|
ASSERT_EQ(a.getX(), 0);
|
||||||
ASSERT_EQ(b.getX(), 7);
|
ASSERT_EQ(b.getX(), 7);
|
||||||
|
// piCout << "================";
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(PiobjectConnections, CONNECTL_DISCONNECT) {
|
TEST(PiobjectConnections, CONNECTL_DISCONNECT) {
|
||||||
@@ -196,12 +208,13 @@ TEST(PiobjectConnections, CONNECTL_DISCONNECT) {
|
|||||||
b.handler_test();
|
b.handler_test();
|
||||||
ASSERT_EQ(a.getX(), 0);
|
ASSERT_EQ(a.getX(), 0);
|
||||||
ASSERT_EQ(b.getX(), 2);
|
ASSERT_EQ(b.getX(), 2);
|
||||||
PIObject::piDisconnect(&a);
|
PIObject::piDisconnect(&a, "event_test");
|
||||||
ASSERT_EQ(a.getX(), 0);
|
ASSERT_EQ(a.getX(), 0);
|
||||||
ASSERT_EQ(b.getX(), 2);
|
ASSERT_EQ(b.getX(), 2);
|
||||||
a.test();
|
a.test();
|
||||||
ASSERT_EQ(a.getX(), 0);
|
ASSERT_EQ(a.getX(), 0);
|
||||||
ASSERT_EQ(b.getX(), 2);
|
ASSERT_EQ(b.getX(), 2);
|
||||||
|
// piCout << "================";
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(PiobjectConnections, CONNECTL_twice) {
|
TEST(PiobjectConnections, CONNECTL_twice) {
|
||||||
@@ -222,7 +235,7 @@ TEST(PiobjectConnections, CONNECTL_twice) {
|
|||||||
b.handler_val(0);
|
b.handler_val(0);
|
||||||
ASSERT_EQ(a.getX(), 0);
|
ASSERT_EQ(a.getX(), 0);
|
||||||
ASSERT_EQ(b.getX(), 0);
|
ASSERT_EQ(b.getX(), 0);
|
||||||
PIObject::piDisconnect(&a);
|
PIObject::piDisconnect(&a, "event_test");
|
||||||
a.test();
|
a.test();
|
||||||
ASSERT_EQ(a.getX(), 0);
|
ASSERT_EQ(a.getX(), 0);
|
||||||
ASSERT_EQ(b.getX(), 0);
|
ASSERT_EQ(b.getX(), 0);
|
||||||
@@ -232,4 +245,73 @@ TEST(PiobjectConnections, CONNECTL_twice) {
|
|||||||
a.test();
|
a.test();
|
||||||
ASSERT_EQ(a.getX(), 0);
|
ASSERT_EQ(a.getX(), 0);
|
||||||
ASSERT_EQ(b.getX(), 1);
|
ASSERT_EQ(b.getX(), 1);
|
||||||
|
// piCout << "================";
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(PiobjectConnections, CONNECT_AFTER_DISCONNECT) {
|
||||||
|
Object a;
|
||||||
|
Object b;
|
||||||
|
CONNECTL(&a, event_test, [&b](){
|
||||||
|
b.handler_test();
|
||||||
|
});
|
||||||
|
a.test();
|
||||||
|
ASSERT_EQ(b.getX(), 1);
|
||||||
|
PIObject::piDisconnect(&a, "event_test");
|
||||||
|
a.test();
|
||||||
|
ASSERT_EQ(b.getX(), 1);
|
||||||
|
DISCONNECT1(void, int, &a, event_val, &b, handler_val);
|
||||||
|
CONNECT1(void, int, &a, event_val, &b, handler_val);
|
||||||
|
a.handler_val(8);
|
||||||
|
a.test_val();
|
||||||
|
ASSERT_EQ(a.getX(), 8);
|
||||||
|
ASSERT_EQ(b.getX(), 8);
|
||||||
|
// piCout << "================";
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(PiobjectConnections, CONNECTL_WRONG_DISCONNECT) {
|
||||||
|
Object a;
|
||||||
|
Object b;
|
||||||
|
CONNECTL(&a, event_test, [&b](){
|
||||||
|
b.handler_test();
|
||||||
|
});
|
||||||
|
a.test();
|
||||||
|
ASSERT_EQ(b.getX(), 1);
|
||||||
|
PIObject::piDisconnect(&b, "event_test");
|
||||||
|
a.test();
|
||||||
|
ASSERT_EQ(b.getX(), 2);
|
||||||
|
PIObject::piDisconnect(&a, "event_test");
|
||||||
|
a.test();
|
||||||
|
ASSERT_EQ(b.getX(), 2);
|
||||||
|
// piCout << "================";
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(PiobjectConnections, CONNECT_WRONG_DISCONNECT) {
|
||||||
|
Object a;
|
||||||
|
Object b;
|
||||||
|
|
||||||
|
CONNECT0(void, &a, event_test, &b, handler_test);
|
||||||
|
a.test();
|
||||||
|
ASSERT_EQ(b.getX(), 1);
|
||||||
|
PIObject::piDisconnect(&b, "event_test");
|
||||||
|
a.test();
|
||||||
|
ASSERT_EQ(b.getX(), 2);
|
||||||
|
PIObject::piDisconnect(&a, "event_test");
|
||||||
|
a.test();
|
||||||
|
ASSERT_EQ(b.getX(), 2);
|
||||||
|
// piCout << "================";
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(PiobjectConnections, CONNECTU_WRONG_DISCONNECT) {
|
||||||
|
Object a;
|
||||||
|
Object b;
|
||||||
|
CONNECTU(&a, event_test, &b, handler_test);
|
||||||
|
a.test();
|
||||||
|
ASSERT_EQ(b.getX(), 1);
|
||||||
|
PIObject::piDisconnect(&b, "event_test");
|
||||||
|
a.test();
|
||||||
|
ASSERT_EQ(b.getX(), 2);
|
||||||
|
PIObject::piDisconnect(&a, "event_test");
|
||||||
|
a.test();
|
||||||
|
ASSERT_EQ(b.getX(), 2);
|
||||||
|
// piCout << "================";
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user