summaryrefslogtreecommitdiff
path: root/comphelper
diff options
context:
space:
mode:
authorTor Lillqvist <tml@collabora.com>2021-04-28 17:27:50 +0300
committerTor Lillqvist <tml@collabora.com>2021-04-29 08:46:44 +0200
commit724fc62e9288f26428274977614948fee0bc2000 (patch)
tree3471842bb484c859eccba1773ff790fbb06ad869 /comphelper
parent2cc42f656b24b6e506fecb61f0fc58f5f8a98e6a (diff)
Make the nested AsyncEvent work more reliably
We must take into consideration that somebody might hold on to a hard reference to such an object. Thus it is not enough to drop the references to it from its parent, that is not necessarily enough to make it destruct. Instead have the parent explicitly cann a function on the children than generates their end events. Also add some documentation. Change-Id: I38180c85072c76af8964c48fa19132b8e1178ee1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114813 Tested-by: Jenkins Reviewed-by: Tor Lillqvist <tml@collabora.com>
Diffstat (limited to 'comphelper')
-rw-r--r--comphelper/qa/unit/test_traceevent.cxx136
1 files changed, 75 insertions, 61 deletions
diff --git a/comphelper/qa/unit/test_traceevent.cxx b/comphelper/qa/unit/test_traceevent.cxx
index 226171b0e097..e170e8aaeb18 100644
--- a/comphelper/qa/unit/test_traceevent.cxx
+++ b/comphelper/qa/unit/test_traceevent.cxx
@@ -31,87 +31,99 @@ namespace
{
void trace_event_test()
{
- // When we start recording is off and this will not generate any 'X' event when we leave the scope
- comphelper::ProfileZone aZone0("test0");
+ std::shared_ptr<comphelper::AsyncEvent> pAsync7Locked;
- // This will not generate any 'b' and 'e' events either
- auto pAsync1(std::make_shared<comphelper::AsyncEvent>("async1"));
-
- std::weak_ptr<comphelper::AsyncEvent> pAsync2;
{
- // No 'X' by this either
- comphelper::ProfileZone aZone1("block1");
+ // When we start recording is off and this will not generate any 'X' event when we leave the scope
+ comphelper::ProfileZone aZone0("test0");
- // Now we turn on recording
- comphelper::TraceEvent::startRecording();
+ // This will not generate any 'b' and 'e' events either
+ auto pAsync1(std::make_shared<comphelper::AsyncEvent>("async1"));
- // As this is nested in the parent that was created with recording turned off,
- // this will not generate any 'b' and 'e' events either even if recording is now on.
- pAsync2 = comphelper::AsyncEvent::createWithParent("async2in1", pAsync1);
- }
+ std::weak_ptr<comphelper::AsyncEvent> pAsync2;
+ {
+ // No 'X' by this either
+ comphelper::ProfileZone aZone1("block1");
- // This will generate an 'i' event for instant1
- comphelper::TraceEvent::addInstantEvent("instant1");
+ // Now we turn on recording
+ comphelper::TraceEvent::startRecording();
- std::shared_ptr<comphelper::AsyncEvent> pAsync25;
- {
- comphelper::ProfileZone aZone2("block2");
+ // As this is nested in the parent that was created with recording turned off,
+ // this will not generate any 'b' and 'e' events either even if recording is now on.
+ pAsync2 = comphelper::AsyncEvent::createWithParent("async2in1", pAsync1);
+ }
- // This does not generate any 'e' event as it was created when recording was off
- // And the nested async2 object will thus not generate anything either
- pAsync1.reset();
+ // This will generate an 'i' event for instant1
+ comphelper::TraceEvent::addInstantEvent("instant1");
- // This will generate 'b' event and an 'e' event when the pointer is reset or goes out of scope
- pAsync25 = std::make_shared<comphelper::AsyncEvent>("async2.5");
+ std::shared_ptr<comphelper::AsyncEvent> pAsync25;
+ {
+ comphelper::ProfileZone aZone2("block2");
- // Leaving this scope will generate an 'X' event for block2
- }
+ // This does not generate any 'e' event as it was created when recording was off
+ // And the nested async2 object will thus not generate anything either
+ pAsync1.reset();
- // Verify that the weak_ptr to pAsync2 has expired as its parent pAsync1 has been finished off
- CPPUNIT_ASSERT(pAsync2.expired());
+ // This will generate 'b' event and an 'e' event when the pointer is reset or goes out of scope
+ pAsync25 = std::make_shared<comphelper::AsyncEvent>("async2.5");
- // This will generate a 'b' event for async3
- auto pAsync3(std::make_shared<comphelper::AsyncEvent>("async3"));
+ // Leaving this scope will generate an 'X' event for block2
+ }
- std::weak_ptr<comphelper::AsyncEvent> pAsync4;
+ // Verify that the weak_ptr to pAsync2 has expired as its parent pAsync1 has been finished off
+ CPPUNIT_ASSERT(pAsync2.expired());
- {
- comphelper::ProfileZone aZone3("block3");
+ // This will generate a 'b' event for async3
+ auto pAsync3(std::make_shared<comphelper::AsyncEvent>("async3"));
- pAsync4 = comphelper::AsyncEvent::createWithParent("async4in3", pAsync3);
+ std::weak_ptr<comphelper::AsyncEvent> pAsync4;
- // Leaving this scope will generate an 'X' event for block3
- }
+ {
+ comphelper::ProfileZone aZone3("block3");
- // This will generate an 'e' event for async2.5
- pAsync25.reset();
+ pAsync4 = comphelper::AsyncEvent::createWithParent("async4in3", pAsync3);
- comphelper::ProfileZone aZone4("test2");
+ // Leaving this scope will generate an 'X' event for block3
+ }
- // This will generate an 'i' event for instant2"
- comphelper::TraceEvent::addInstantEvent("instant2");
+ // This will generate an 'e' event for async2.5
+ pAsync25.reset();
- std::weak_ptr<comphelper::AsyncEvent> pAsync5;
- {
- auto pAsync4Locked = pAsync4.lock();
- CPPUNIT_ASSERT(pAsync4Locked);
- // This will generate a 'b' event for async5in4
- pAsync5 = comphelper::AsyncEvent::createWithParent("async5in4", pAsync4Locked);
- }
+ comphelper::ProfileZone aZone4("test2");
+
+ // This will generate an 'i' event for instant2"
+ comphelper::TraceEvent::addInstantEvent("instant2");
+
+ std::weak_ptr<comphelper::AsyncEvent> pAsync5;
+ {
+ auto pAsync4Locked = pAsync4.lock();
+ CPPUNIT_ASSERT(pAsync4Locked);
+ // This will generate a 'b' event for async5in4
+ pAsync5 = comphelper::AsyncEvent::createWithParent("async5in4", pAsync4Locked);
+ }
- CPPUNIT_ASSERT(!pAsync5.expired());
+ CPPUNIT_ASSERT(!pAsync5.expired());
- // This will generate a 'b' event for async6in5
- std::weak_ptr<comphelper::AsyncEvent> pAsync6(
- comphelper::AsyncEvent::createWithParent("async6in5", pAsync5.lock()));
- CPPUNIT_ASSERT(!pAsync6.expired());
+ // This will generate a 'b' event for async6in5
+ std::weak_ptr<comphelper::AsyncEvent> pAsync6(
+ comphelper::AsyncEvent::createWithParent("async6in5", pAsync5.lock()));
+ CPPUNIT_ASSERT(!pAsync6.expired());
- // This will generate an 'e' event for async6in5 and async5in4
- pAsync5.lock()->finish();
+ // This will generate an 'e' event for async6in5 and async5in4
+ pAsync5.lock()->finish();
- CPPUNIT_ASSERT(pAsync6.expired());
+ pAsync7Locked = comphelper::AsyncEvent::createWithParent("async7in3", pAsync3).lock();
+
+ CPPUNIT_ASSERT(pAsync6.expired());
+
+ // Leaving this scope will generate 'X' events for test2 and a
+ // 'e' event for async4in3, async7in3, and async3. The
+ // pAsync7Locked pointer will now point to an AsyncEvent
+ // object that has already had its 'e' event generated.
+ }
- // Leaving this scope will generate 'X' events for test2 and a 'e' event for async4in3 and async3
+ // Nothing is generated from this
+ pAsync7Locked.reset();
}
}
@@ -124,7 +136,7 @@ void TestTraceEvent::test()
std::cerr << s << "\n";
}
- CPPUNIT_ASSERT_EQUAL(15, static_cast<int>(aEvents.size()));
+ CPPUNIT_ASSERT_EQUAL(17, static_cast<int>(aEvents.size()));
CPPUNIT_ASSERT(aEvents[0].startsWith("{\"name:\"instant1\",\"ph\":\"i\","));
CPPUNIT_ASSERT(aEvents[1].startsWith("{\"name\":\"async2.5\",\"ph\":\"b\",\"id\":1,"));
@@ -138,9 +150,11 @@ void TestTraceEvent::test()
CPPUNIT_ASSERT(aEvents[9].startsWith("{\"name\":\"async6in5\",\"ph\":\"b\",\"id\":2,"));
CPPUNIT_ASSERT(aEvents[10].startsWith("{\"name\":\"async6in5\",\"ph\":\"e\",\"id\":2,"));
CPPUNIT_ASSERT(aEvents[11].startsWith("{\"name\":\"async5in4\",\"ph\":\"e\",\"id\":2,"));
- CPPUNIT_ASSERT(aEvents[12].startsWith("{\"name\":\"test2\",\"ph\":\"X\""));
- CPPUNIT_ASSERT(aEvents[13].startsWith("{\"name\":\"async4in3\",\"ph\":\"e\",\"id\":2,"));
- CPPUNIT_ASSERT(aEvents[14].startsWith("{\"name\":\"async3\",\"ph\":\"e\",\"id\":2,"));
+ CPPUNIT_ASSERT(aEvents[12].startsWith("{\"name\":\"async7in3\",\"ph\":\"b\",\"id\":2,"));
+ CPPUNIT_ASSERT(aEvents[13].startsWith("{\"name\":\"test2\",\"ph\":\"X\""));
+ CPPUNIT_ASSERT(aEvents[14].startsWith("{\"name\":\"async4in3\",\"ph\":\"e\",\"id\":2,"));
+ CPPUNIT_ASSERT(aEvents[15].startsWith("{\"name\":\"async7in3\",\"ph\":\"e\",\"id\":2,"));
+ CPPUNIT_ASSERT(aEvents[16].startsWith("{\"name\":\"async3\",\"ph\":\"e\",\"id\":2,"));
}
CPPUNIT_TEST_SUITE_REGISTRATION(TestTraceEvent);