diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/fsm/fsm_dealloc_test.c | 7 | ||||
-rw-r--r-- | tests/fsm/fsm_dealloc_test.err | 3501 | ||||
-rw-r--r-- | tests/testsuite.at | 6 |
4 files changed, 3290 insertions, 225 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am index 09a1c189..a8a06c53 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -303,6 +303,7 @@ EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE) \ sim/sim_test.ok tlv/tlv_test.ok abis/abis_test.ok \ gsup/gsup_test.ok gsup/gsup_test.err \ oap/oap_test.ok fsm/fsm_test.ok fsm/fsm_test.err \ + fsm/fsm_dealloc_test.err \ write_queue/wqueue_test.ok socket/socket_test.ok \ socket/socket_test.err coding/coding_test.ok \ osmo-auc-gen/osmo-auc-gen_test.sh \ diff --git a/tests/fsm/fsm_dealloc_test.c b/tests/fsm/fsm_dealloc_test.c index 5a493ad2..f8d2b1ee 100644 --- a/tests/fsm/fsm_dealloc_test.c +++ b/tests/fsm/fsm_dealloc_test.c @@ -346,26 +346,24 @@ static struct scene *scene_alloc() LOGP(DLGLOBAL, LOGL_DEBUG, "%s()\n", __func__); - /* s->o[root] = obj_alloc(s, NULL, "root"); - */ s->o[branch0] = obj_alloc(s, s->o[root], "_branch0"); s->o[twig0a] = obj_alloc(s, s->o[branch0], "__twig0a"); - /* s->o[twig0b] = obj_alloc(s, s->o[branch0], "__twig0b"); s->o[branch1] = obj_alloc(s, s->o[root], "_branch1"); s->o[twig1a] = obj_alloc(s, s->o[branch1], "__twig1a"); s->o[twig1b] = obj_alloc(s, s->o[branch1], "__twig1b"); - */ s->o[other] = obj_alloc(s, NULL, "other"); obj_set_other(s->o[branch0], s->o[other]); obj_set_other(s->o[twig0a], s->o[other]); + obj_set_other(s->o[branch1], s->o[other]); + obj_set_other(s->o[twig1a], s->o[root]); return s; } @@ -455,6 +453,7 @@ int main(void) log_set_category_filter(osmo_stderr_target, DLGLOBAL, 1, LOGL_DEBUG); + osmo_fsm_term_safely(true); osmo_fsm_register(&test_fsm); ctx_blocks = talloc_total_blocks(ctx); diff --git a/tests/fsm/fsm_dealloc_test.err b/tests/fsm/fsm_dealloc_test.err index 7f413409..aa7db51e 100644 --- a/tests/fsm/fsm_dealloc_test.err +++ b/tests/fsm/fsm_dealloc_test.err @@ -1,87 +1,888 @@ DLGLOBAL DEBUG scene_alloc() +DLGLOBAL DEBUG test(root){alive}: Allocated +DLGLOBAL DEBUG test(root){alive}: Allocated +DLGLOBAL DEBUG test(root){alive}: is child of test(root) DLGLOBAL DEBUG test(_branch0){alive}: Allocated +DLGLOBAL DEBUG test(_branch0){alive}: is child of test(_branch0) DLGLOBAL DEBUG test(_branch0){alive}: Allocated DLGLOBAL DEBUG test(_branch0){alive}: is child of test(_branch0) +DLGLOBAL DEBUG test(root){alive}: Allocated +DLGLOBAL DEBUG test(root){alive}: is child of test(root) +DLGLOBAL DEBUG test(_branch1){alive}: Allocated +DLGLOBAL DEBUG test(_branch1){alive}: is child of test(_branch1) +DLGLOBAL DEBUG test(_branch1){alive}: Allocated +DLGLOBAL DEBUG test(_branch1){alive}: is child of test(_branch1) DLGLOBAL DEBUG test(other){alive}: Allocated DLGLOBAL DEBUG test(_branch0){alive}: _branch0.other[0] = other DLGLOBAL DEBUG test(other){alive}: other.other[0] = _branch0 DLGLOBAL DEBUG test(__twig0a){alive}: __twig0a.other[0] = other DLGLOBAL DEBUG test(other){alive}: other.other[1] = __twig0a -DLGLOBAL DEBUG --- Test disabled: object 0 was not created. Cleaning up. -DLGLOBAL DEBUG test(_branch0){alive}: Terminating (cause = OSMO_FSM_TERM_ERROR) -DLGLOBAL DEBUG test(_branch0){alive}: pre_term() -DLGLOBAL DEBUG test(__twig0a){alive}: Terminating (cause = OSMO_FSM_TERM_PARENT) +DLGLOBAL DEBUG test(_branch1){alive}: _branch1.other[0] = other +DLGLOBAL DEBUG test(other){alive}: other.other[1] = _branch1 +DLGLOBAL DEBUG test(__twig1a){alive}: __twig1a.other[0] = root +DLGLOBAL DEBUG test(root){alive}: root.other[0] = __twig1a +DLGLOBAL DEBUG ------ before term cascade, got: +DLGLOBAL DEBUG root +DLGLOBAL DEBUG _branch0 +DLGLOBAL DEBUG __twig0a +DLGLOBAL DEBUG __twig0b +DLGLOBAL DEBUG _branch1 +DLGLOBAL DEBUG __twig1a +DLGLOBAL DEBUG __twig1b +DLGLOBAL DEBUG other +DLGLOBAL DEBUG --- +DLGLOBAL DEBUG --- term at root +DLGLOBAL DEBUG test(root){alive}: Terminating (cause = OSMO_FSM_TERM_REGULAR) +DLGLOBAL DEBUG test(root){alive}: pre_term() +DLGLOBAL DEBUG test(_branch1){alive}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root)) +DLGLOBAL DEBUG test(_branch1){alive}: pre_term() +DLGLOBAL DEBUG test(__twig1b){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root)) +DLGLOBAL DEBUG test(__twig1b){alive}: pre_term() +DLGLOBAL DEBUG test(__twig1b){alive}: Removing from parent test(_branch1) +DLGLOBAL DEBUG 1 (__twig1b.cleanup()) +DLGLOBAL DEBUG test(__twig1b){alive}: cleanup() +DLGLOBAL DEBUG test(__twig1b){alive}: scene forgets __twig1b +DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE +DLGLOBAL DEBUG 2 (__twig1b.cleanup(),_branch1.alive()) +DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE) +DLGLOBAL DEBUG 3 (__twig1b.cleanup(),_branch1.alive(),_branch1.child_gone()) +DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[1] = __twig1b +DLGLOBAL DEBUG test(_branch1){alive}: still exists: child[0] +DLGLOBAL DEBUG 2 (__twig1b.cleanup(),_branch1.alive()) +DLGLOBAL DEBUG 1 (__twig1b.cleanup()) +DLGLOBAL DEBUG test(__twig1b){alive}: cleanup() done +DLGLOBAL DEBUG 0 (-) +DLGLOBAL DEBUG test(__twig1b){alive}: Deferring: will deallocate with test(root) +DLGLOBAL DEBUG test(__twig1a){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root)) +DLGLOBAL DEBUG test(__twig1a){alive}: pre_term() +DLGLOBAL DEBUG test(__twig1a){alive}: Removing from parent test(_branch1) +DLGLOBAL DEBUG 1 (__twig1a.cleanup()) +DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() +DLGLOBAL DEBUG test(__twig1a){alive}: scene forgets __twig1a +DLGLOBAL DEBUG test(__twig1a){alive}: removing reference __twig1a.other[0] -> root +DLGLOBAL DEBUG test(root){alive}: Received Event EV_OTHER_GONE +DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive()) +DLGLOBAL DEBUG test(root){alive}: alive(EV_OTHER_GONE) +DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.other_gone()) +DLGLOBAL DEBUG test(root){alive}: EV_OTHER_GONE: Dropped reference root.other[0] = __twig1a +DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive()) +DLGLOBAL DEBUG test(root){alive}: state_chg to destroying +DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.destroying_onenter()) +DLGLOBAL DEBUG test(root){destroying}: destroying_onenter() from alive +DLGLOBAL DEBUG test(root){destroying}: Ignoring trigger to terminate: already terminating +DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive()) +DLGLOBAL DEBUG 1 (__twig1a.cleanup()) +DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE +DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive()) +DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE) +DLGLOBAL DEBUG 3 (__twig1a.cleanup(),_branch1.alive(),_branch1.child_gone()) +DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a +DLGLOBAL DEBUG test(_branch1){alive}: No more children +DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive()) +DLGLOBAL DEBUG test(_branch1){alive}: state_chg to destroying +DLGLOBAL DEBUG 3 (__twig1a.cleanup(),_branch1.alive(),_branch1.destroying_onenter()) +DLGLOBAL DEBUG test(_branch1){destroying}: destroying_onenter() from alive +DLGLOBAL DEBUG test(_branch1){destroying}: Ignoring trigger to terminate: already terminating +DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive()) +DLGLOBAL DEBUG 1 (__twig1a.cleanup()) +DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() done +DLGLOBAL DEBUG 0 (-) +DLGLOBAL DEBUG test(__twig1a){alive}: Deferring: will deallocate with test(root) +DLGLOBAL DEBUG test(_branch1){destroying}: Removing from parent test(root) +DLGLOBAL DEBUG 1 (_branch1.cleanup()) +DLGLOBAL DEBUG test(_branch1){destroying}: cleanup() +DLGLOBAL DEBUG test(_branch1){destroying}: scene forgets _branch1 +DLGLOBAL DEBUG test(_branch1){destroying}: removing reference _branch1.other[0] -> other +DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE +DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive()) +DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE) +DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.other_gone()) +DLGLOBAL DEBUG test(other){alive}: EV_OTHER_GONE: Dropped reference other.other[1] = _branch1 +DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive()) +DLGLOBAL DEBUG test(other){alive}: state_chg to destroying +DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.destroying_onenter()) +DLGLOBAL DEBUG test(other){destroying}: destroying_onenter() from alive +DLGLOBAL DEBUG test(other){destroying}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root)) +DLGLOBAL DEBUG test(other){destroying}: pre_term() +DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup()) +DLGLOBAL DEBUG test(other){destroying}: cleanup() +DLGLOBAL DEBUG test(other){destroying}: scene forgets other +DLGLOBAL DEBUG test(other){destroying}: removing reference other.other[0] -> _branch0 +DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_OTHER_GONE +DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive()) +DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_OTHER_GONE) +DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.other_gone()) +DLGLOBAL DEBUG test(_branch0){alive}: EV_OTHER_GONE: Dropped reference _branch0.other[0] = other +DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive()) +DLGLOBAL DEBUG test(_branch0){alive}: state_chg to destroying +DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter()) +DLGLOBAL DEBUG test(_branch0){destroying}: destroying_onenter() from alive +DLGLOBAL DEBUG test(_branch0){destroying}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root)) +DLGLOBAL DEBUG test(_branch0){destroying}: pre_term() +DLGLOBAL DEBUG test(__twig0b){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root)) +DLGLOBAL DEBUG test(__twig0b){alive}: pre_term() +DLGLOBAL DEBUG test(__twig0b){alive}: Removing from parent test(_branch0) +DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_ +DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() +DLGLOBAL DEBUG test(__twig0b){alive}: scene forgets __twig0b +DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE +DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_ +DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE) +DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_ +DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b +DLGLOBAL DEBUG test(_branch0){destroying}: still exists: child[0] +DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_ +DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_ +DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() done +DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter()) +DLGLOBAL DEBUG test(__twig0b){alive}: Deferring: will deallocate with test(root) +DLGLOBAL DEBUG test(__twig0a){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root)) DLGLOBAL DEBUG test(__twig0a){alive}: pre_term() DLGLOBAL DEBUG test(__twig0a){alive}: Removing from parent test(_branch0) -DLGLOBAL DEBUG 1 (__twig0a.cleanup()) +DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_ DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() DLGLOBAL DEBUG test(__twig0a){alive}: scene forgets __twig0a DLGLOBAL DEBUG test(__twig0a){alive}: removing reference __twig0a.other[0] -> other +DLGLOBAL DEBUG test(other){destroying}: Received Event EV_OTHER_GONE +DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_ +DLGLOBAL DEBUG test(other){destroying}: destroying(EV_OTHER_GONE) +DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_ +DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_ +DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_ +DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE +DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_ +DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE) +DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_ +DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a +DLGLOBAL DEBUG test(_branch0){destroying}: No more children +DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_ +DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_ +DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() done +DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter()) +DLGLOBAL DEBUG test(__twig0a){alive}: Deferring: will deallocate with test(root) +DLGLOBAL DEBUG test(_branch0){destroying}: Removing from parent test(root) +DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_ +DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() +DLGLOBAL DEBUG test(_branch0){destroying}: scene forgets _branch0 +DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE +DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_ +DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE) +DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_ +DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0 +DLGLOBAL DEBUG test(root){destroying}: still exists: child[1] +DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_ +DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_ +DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() done +DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter()) +DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE +DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),r +DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE) +DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore. +DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter()) +DLGLOBAL DEBUG test(_branch0){destroying}: Deferring: will deallocate with test(root) +DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive()) +DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup()) +DLGLOBAL DEBUG test(other){destroying}: cleanup() done +DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.destroying_onenter()) +DLGLOBAL DEBUG test(other){destroying}: Deferring: will deallocate with test(root) +DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive()) +DLGLOBAL DEBUG 1 (_branch1.cleanup()) +DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE +DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.destroying()) +DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE) +DLGLOBAL DEBUG 3 (_branch1.cleanup(),root.destroying(),root.child_gone()) +DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1 +DLGLOBAL DEBUG test(root){destroying}: No more children +DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.destroying()) +DLGLOBAL DEBUG 1 (_branch1.cleanup()) +DLGLOBAL DEBUG test(_branch1){destroying}: cleanup() done +DLGLOBAL DEBUG 0 (-) +DLGLOBAL DEBUG test(_branch1){destroying}: Deferring: will deallocate with test(root) +DLGLOBAL DEBUG 1 (root.cleanup()) +DLGLOBAL DEBUG test(root){destroying}: cleanup() +DLGLOBAL DEBUG test(root){destroying}: scene forgets root +DLGLOBAL DEBUG test(root){destroying}: cleanup() done +DLGLOBAL DEBUG 0 (-) +DLGLOBAL DEBUG test(root){destroying}: Deallocated, including all deferred deallocations +DLGLOBAL DEBUG --- after term cascade: +DLGLOBAL DEBUG --- all deallocated. +DLGLOBAL DEBUG scene_alloc() +DLGLOBAL DEBUG test(root){alive}: Allocated +DLGLOBAL DEBUG test(root){alive}: Allocated +DLGLOBAL DEBUG test(root){alive}: is child of test(root) +DLGLOBAL DEBUG test(_branch0){alive}: Allocated +DLGLOBAL DEBUG test(_branch0){alive}: is child of test(_branch0) +DLGLOBAL DEBUG test(_branch0){alive}: Allocated +DLGLOBAL DEBUG test(_branch0){alive}: is child of test(_branch0) +DLGLOBAL DEBUG test(root){alive}: Allocated +DLGLOBAL DEBUG test(root){alive}: is child of test(root) +DLGLOBAL DEBUG test(_branch1){alive}: Allocated +DLGLOBAL DEBUG test(_branch1){alive}: is child of test(_branch1) +DLGLOBAL DEBUG test(_branch1){alive}: Allocated +DLGLOBAL DEBUG test(_branch1){alive}: is child of test(_branch1) +DLGLOBAL DEBUG test(other){alive}: Allocated +DLGLOBAL DEBUG test(_branch0){alive}: _branch0.other[0] = other +DLGLOBAL DEBUG test(other){alive}: other.other[0] = _branch0 +DLGLOBAL DEBUG test(__twig0a){alive}: __twig0a.other[0] = other +DLGLOBAL DEBUG test(other){alive}: other.other[1] = __twig0a +DLGLOBAL DEBUG test(_branch1){alive}: _branch1.other[0] = other +DLGLOBAL DEBUG test(other){alive}: other.other[1] = _branch1 +DLGLOBAL DEBUG test(__twig1a){alive}: __twig1a.other[0] = root +DLGLOBAL DEBUG test(root){alive}: root.other[0] = __twig1a +DLGLOBAL DEBUG ------ before destroy-event cascade, got: +DLGLOBAL DEBUG root +DLGLOBAL DEBUG _branch0 +DLGLOBAL DEBUG __twig0a +DLGLOBAL DEBUG __twig0b +DLGLOBAL DEBUG _branch1 +DLGLOBAL DEBUG __twig1a +DLGLOBAL DEBUG __twig1b +DLGLOBAL DEBUG other +DLGLOBAL DEBUG --- +DLGLOBAL DEBUG --- destroy-event at root +DLGLOBAL DEBUG test(root){alive}: Received Event EV_DESTROY +DLGLOBAL DEBUG 1 (root.alive()) +DLGLOBAL DEBUG test(root){alive}: alive(EV_DESTROY) +DLGLOBAL DEBUG test(root){alive}: state_chg to destroying +DLGLOBAL DEBUG 2 (root.alive(),root.destroying_onenter()) +DLGLOBAL DEBUG test(root){destroying}: destroying_onenter() from alive +DLGLOBAL DEBUG test(root){destroying}: Terminating (cause = OSMO_FSM_TERM_REGULAR) +DLGLOBAL DEBUG test(root){destroying}: pre_term() +DLGLOBAL DEBUG test(_branch1){alive}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root)) +DLGLOBAL DEBUG test(_branch1){alive}: pre_term() +DLGLOBAL DEBUG test(__twig1b){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root)) +DLGLOBAL DEBUG test(__twig1b){alive}: pre_term() +DLGLOBAL DEBUG test(__twig1b){alive}: Removing from parent test(_branch1) +DLGLOBAL DEBUG 3 (root.alive(),root.destroying_onenter(),__twig1b.cleanup()) +DLGLOBAL DEBUG test(__twig1b){alive}: cleanup() +DLGLOBAL DEBUG test(__twig1b){alive}: scene forgets __twig1b +DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE +DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),__twig1b.cleanup(),_branch1.alive()) +DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE) +DLGLOBAL DEBUG 5 (root.alive(),root.destroying_onenter(),__twig1b.cleanup(),_branch1.alive(),_branch1.child_gone()) +DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[1] = __twig1b +DLGLOBAL DEBUG test(_branch1){alive}: still exists: child[0] +DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),__twig1b.cleanup(),_branch1.alive()) +DLGLOBAL DEBUG 3 (root.alive(),root.destroying_onenter(),__twig1b.cleanup()) +DLGLOBAL DEBUG test(__twig1b){alive}: cleanup() done +DLGLOBAL DEBUG 2 (root.alive(),root.destroying_onenter()) +DLGLOBAL DEBUG test(__twig1b){alive}: Deferring: will deallocate with test(root) +DLGLOBAL DEBUG test(__twig1a){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root)) +DLGLOBAL DEBUG test(__twig1a){alive}: pre_term() +DLGLOBAL DEBUG test(__twig1a){alive}: Removing from parent test(_branch1) +DLGLOBAL DEBUG 3 (root.alive(),root.destroying_onenter(),__twig1a.cleanup()) +DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() +DLGLOBAL DEBUG test(__twig1a){alive}: scene forgets __twig1a +DLGLOBAL DEBUG test(__twig1a){alive}: removing reference __twig1a.other[0] -> root +DLGLOBAL DEBUG test(root){destroying}: Received Event EV_OTHER_GONE +DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),__twig1a.cleanup(),root.destroying()) +DLGLOBAL DEBUG test(root){destroying}: destroying(EV_OTHER_GONE) +DLGLOBAL DEBUG 5 (root.alive(),root.destroying_onenter(),__twig1a.cleanup(),root.destroying(),root.other_gone()) +DLGLOBAL DEBUG test(root){destroying}: EV_OTHER_GONE: Dropped reference root.other[0] = __twig1a +DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),__twig1a.cleanup(),root.destroying()) +DLGLOBAL DEBUG 3 (root.alive(),root.destroying_onenter(),__twig1a.cleanup()) +DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE +DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),__twig1a.cleanup(),_branch1.alive()) +DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE) +DLGLOBAL DEBUG 5 (root.alive(),root.destroying_onenter(),__twig1a.cleanup(),_branch1.alive(),_branch1.child_gone()) +DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a +DLGLOBAL DEBUG test(_branch1){alive}: No more children +DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),__twig1a.cleanup(),_branch1.alive()) +DLGLOBAL DEBUG test(_branch1){alive}: state_chg to destroying +DLGLOBAL DEBUG 5 (root.alive(),root.destroying_onenter(),__twig1a.cleanup(),_branch1.alive(),_branch1.destroying_onenter()) +DLGLOBAL DEBUG test(_branch1){destroying}: destroying_onenter() from alive +DLGLOBAL DEBUG test(_branch1){destroying}: Ignoring trigger to terminate: already terminating +DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),__twig1a.cleanup(),_branch1.alive()) +DLGLOBAL DEBUG 3 (root.alive(),root.destroying_onenter(),__twig1a.cleanup()) +DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() done +DLGLOBAL DEBUG 2 (root.alive(),root.destroying_onenter()) +DLGLOBAL DEBUG test(__twig1a){alive}: Deferring: will deallocate with test(root) +DLGLOBAL DEBUG test(_branch1){destroying}: Removing from parent test(root) +DLGLOBAL DEBUG 3 (root.alive(),root.destroying_onenter(),_branch1.cleanup()) +DLGLOBAL DEBUG test(_branch1){destroying}: cleanup() +DLGLOBAL DEBUG test(_branch1){destroying}: scene forgets _branch1 +DLGLOBAL DEBUG test(_branch1){destroying}: removing reference _branch1.other[0] -> other DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE -DLGLOBAL DEBUG 2 (__twig0a.cleanup(),other.alive()) +DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive()) DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE) -DLGLOBAL DEBUG 3 (__twig0a.cleanup(),other.alive(),other.other_gone()) -DLGLOBAL DEBUG test(other){alive}: EV_OTHER_GONE: Dropped reference other.other[1] = __twig0a -DLGLOBAL DEBUG 2 (__twig0a.cleanup(),other.alive()) +DLGLOBAL DEBUG 5 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.other_gone()) +DLGLOBAL DEBUG test(other){alive}: EV_OTHER_GONE: Dropped reference other.other[1] = _branch1 +DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive()) DLGLOBAL DEBUG test(other){alive}: state_chg to destroying -DLGLOBAL DEBUG 3 (__twig0a.cleanup(),other.alive(),other.destroying_onenter()) +DLGLOBAL DEBUG 5 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter()) DLGLOBAL DEBUG test(other){destroying}: destroying_onenter() from alive -DLGLOBAL DEBUG test(other){destroying}: Terminating (cause = OSMO_FSM_TERM_REGULAR) +DLGLOBAL DEBUG test(other){destroying}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root)) DLGLOBAL DEBUG test(other){destroying}: pre_term() -DLGLOBAL DEBUG 4 (__twig0a.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup()) +DLGLOBAL DEBUG 6 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup()) DLGLOBAL DEBUG test(other){destroying}: cleanup() DLGLOBAL DEBUG test(other){destroying}: scene forgets other DLGLOBAL DEBUG test(other){destroying}: removing reference other.other[0] -> _branch0 DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_OTHER_GONE -DLGLOBAL DEBUG 5 (__twig0a.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive()) +DLGLOBAL DEBUG 7 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0. DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_OTHER_GONE) -DLGLOBAL DEBUG 6 (__twig0a.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.other_gone()) +DLGLOBAL DEBUG 8 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0. DLGLOBAL DEBUG test(_branch0){alive}: EV_OTHER_GONE: Dropped reference _branch0.other[0] = other -DLGLOBAL DEBUG 5 (__twig0a.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive()) +DLGLOBAL DEBUG 7 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0. DLGLOBAL DEBUG test(_branch0){alive}: state_chg to destroying -DLGLOBAL DEBUG 6 (__twig0a.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter()) +DLGLOBAL DEBUG 8 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0. DLGLOBAL DEBUG test(_branch0){destroying}: destroying_onenter() from alive -DLGLOBAL DEBUG test(_branch0){destroying}: Ignoring trigger to terminate: already terminating -DLGLOBAL DEBUG 5 (__twig0a.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive()) -DLGLOBAL DEBUG 4 (__twig0a.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup()) -DLGLOBAL DEBUG test(other){destroying}: cleanup() done -DLGLOBAL DEBUG 3 (__twig0a.cleanup(),other.alive(),other.destroying_onenter()) -DLGLOBAL DEBUG test(other){destroying}: Freeing instance -DLGLOBAL DEBUG test(other){destroying}: Deallocated -DLGLOBAL DEBUG 2 (__twig0a.cleanup(),other.alive()) -DLGLOBAL DEBUG 1 (__twig0a.cleanup()) +DLGLOBAL DEBUG test(_branch0){destroying}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root)) +DLGLOBAL DEBUG test(_branch0){destroying}: pre_term() +DLGLOBAL DEBUG test(__twig0b){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root)) +DLGLOBAL DEBUG test(__twig0b){alive}: pre_term() +DLGLOBAL DEBUG test(__twig0b){alive}: Removing from parent test(_branch0) +DLGLOBAL DEBUG 9 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0. +DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() +DLGLOBAL DEBUG test(__twig0b){alive}: scene forgets __twig0b DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE -DLGLOBAL DEBUG 2 (__twig0a.cleanup(),_branch0.destroying()) +DLGLOBAL DEBUG 10 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0 DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE) -DLGLOBAL DEBUG 3 (__twig0a.cleanup(),_branch0.destroying(),_branch0.child_gone()) +DLGLOBAL DEBUG 11 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0 +DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b +DLGLOBAL DEBUG test(_branch0){destroying}: still exists: child[0] +DLGLOBAL DEBUG 10 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0 +DLGLOBAL DEBUG 9 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0. +DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() done +DLGLOBAL DEBUG 8 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0. +DLGLOBAL DEBUG test(__twig0b){alive}: Deferring: will deallocate with test(root) +DLGLOBAL DEBUG test(__twig0a){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root)) +DLGLOBAL DEBUG test(__twig0a){alive}: pre_term() +DLGLOBAL DEBUG test(__twig0a){alive}: Removing from parent test(_branch0) +DLGLOBAL DEBUG 9 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0. +DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() +DLGLOBAL DEBUG test(__twig0a){alive}: scene forgets __twig0a +DLGLOBAL DEBUG test(__twig0a){alive}: removing reference __twig0a.other[0] -> other +DLGLOBAL DEBUG test(other){destroying}: Received Event EV_OTHER_GONE +DLGLOBAL DEBUG 10 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0 +DLGLOBAL DEBUG test(other){destroying}: destroying(EV_OTHER_GONE) +DLGLOBAL DEBUG 11 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0 +DLGLOBAL DEBUG 10 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0 +DLGLOBAL DEBUG 9 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0. +DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE +DLGLOBAL DEBUG 10 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0 +DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE) +DLGLOBAL DEBUG 11 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0 DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a DLGLOBAL DEBUG test(_branch0){destroying}: No more children -DLGLOBAL DEBUG 2 (__twig0a.cleanup(),_branch0.destroying()) +DLGLOBAL DEBUG 10 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0 +DLGLOBAL DEBUG 9 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0. +DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() done +DLGLOBAL DEBUG 8 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0. +DLGLOBAL DEBUG test(__twig0a){alive}: Deferring: will deallocate with test(root) +DLGLOBAL DEBUG test(_branch0){destroying}: Removing from parent test(root) +DLGLOBAL DEBUG 9 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0. +DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() +DLGLOBAL DEBUG test(_branch0){destroying}: scene forgets _branch0 +DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE +DLGLOBAL DEBUG 10 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0 +DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE) +DLGLOBAL DEBUG 11 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0 +DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0 +DLGLOBAL DEBUG test(root){destroying}: still exists: child[1] +DLGLOBAL DEBUG 10 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0 +DLGLOBAL DEBUG 9 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0. +DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() done +DLGLOBAL DEBUG 8 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0. +DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE +DLGLOBAL DEBUG 9 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0. +DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE) +DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore. +DLGLOBAL DEBUG 8 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0. +DLGLOBAL DEBUG test(_branch0){destroying}: Deferring: will deallocate with test(root) +DLGLOBAL DEBUG 7 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0. +DLGLOBAL DEBUG 6 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup()) +DLGLOBAL DEBUG test(other){destroying}: cleanup() done +DLGLOBAL DEBUG 5 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter()) +DLGLOBAL DEBUG test(other){destroying}: Deferring: will deallocate with test(root) +DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive()) +DLGLOBAL DEBUG 3 (root.alive(),root.destroying_onenter(),_branch1.cleanup()) +DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE +DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),root.destroying()) +DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE) +DLGLOBAL DEBUG 5 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),root.destroying(),root.child_gone()) +DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1 +DLGLOBAL DEBUG test(root){destroying}: No more children +DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),root.destroying()) +DLGLOBAL DEBUG 3 (root.alive(),root.destroying_onenter(),_branch1.cleanup()) +DLGLOBAL DEBUG test(_branch1){destroying}: cleanup() done +DLGLOBAL DEBUG 2 (root.alive(),root.destroying_onenter()) +DLGLOBAL DEBUG test(_branch1){destroying}: Deferring: will deallocate with test(root) +DLGLOBAL DEBUG 3 (root.alive(),root.destroying_onenter(),root.cleanup()) +DLGLOBAL DEBUG test(root){destroying}: cleanup() +DLGLOBAL DEBUG test(root){destroying}: scene forgets root +DLGLOBAL DEBUG test(root){destroying}: cleanup() done +DLGLOBAL DEBUG 2 (root.alive(),root.destroying_onenter()) +DLGLOBAL DEBUG test(root){destroying}: Deallocated, including all deferred deallocations +DLGLOBAL DEBUG 1 (root.alive()) +DLGLOBAL DEBUG 0 (-) +DLGLOBAL DEBUG --- after destroy-event cascade: +DLGLOBAL DEBUG --- all deallocated. +DLGLOBAL DEBUG scene_alloc() +DLGLOBAL DEBUG test(root){alive}: Allocated +DLGLOBAL DEBUG test(root){alive}: Allocated +DLGLOBAL DEBUG test(root){alive}: is child of test(root) +DLGLOBAL DEBUG test(_branch0){alive}: Allocated +DLGLOBAL DEBUG test(_branch0){alive}: is child of test(_branch0) +DLGLOBAL DEBUG test(_branch0){alive}: Allocated +DLGLOBAL DEBUG test(_branch0){alive}: is child of test(_branch0) +DLGLOBAL DEBUG test(root){alive}: Allocated +DLGLOBAL DEBUG test(root){alive}: is child of test(root) +DLGLOBAL DEBUG test(_branch1){alive}: Allocated +DLGLOBAL DEBUG test(_branch1){alive}: is child of test(_branch1) +DLGLOBAL DEBUG test(_branch1){alive}: Allocated +DLGLOBAL DEBUG test(_branch1){alive}: is child of test(_branch1) +DLGLOBAL DEBUG test(other){alive}: Allocated +DLGLOBAL DEBUG test(_branch0){alive}: _branch0.other[0] = other +DLGLOBAL DEBUG test(other){alive}: other.other[0] = _branch0 +DLGLOBAL DEBUG test(__twig0a){alive}: __twig0a.other[0] = other +DLGLOBAL DEBUG test(other){alive}: other.other[1] = __twig0a +DLGLOBAL DEBUG test(_branch1){alive}: _branch1.other[0] = other +DLGLOBAL DEBUG test(other){alive}: other.other[1] = _branch1 +DLGLOBAL DEBUG test(__twig1a){alive}: __twig1a.other[0] = root +DLGLOBAL DEBUG test(root){alive}: root.other[0] = __twig1a +DLGLOBAL DEBUG ------ before term cascade, got: +DLGLOBAL DEBUG root +DLGLOBAL DEBUG _branch0 +DLGLOBAL DEBUG __twig0a +DLGLOBAL DEBUG __twig0b +DLGLOBAL DEBUG _branch1 +DLGLOBAL DEBUG __twig1a +DLGLOBAL DEBUG __twig1b +DLGLOBAL DEBUG other +DLGLOBAL DEBUG --- +DLGLOBAL DEBUG --- term at _branch0 +DLGLOBAL DEBUG test(_branch0){alive}: Terminating (cause = OSMO_FSM_TERM_REGULAR) +DLGLOBAL DEBUG test(_branch0){alive}: pre_term() +DLGLOBAL DEBUG test(__twig0b){alive}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_PARENT, caused by: test(_branch0)) +DLGLOBAL DEBUG test(__twig0b){alive}: pre_term() +DLGLOBAL DEBUG test(__twig0b){alive}: Removing from parent test(_branch0) +DLGLOBAL DEBUG 1 (__twig0b.cleanup()) +DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() +DLGLOBAL DEBUG test(__twig0b){alive}: scene forgets __twig0b +DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE +DLGLOBAL DEBUG 2 (__twig0b.cleanup(),_branch0.alive()) +DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE) +DLGLOBAL DEBUG 3 (__twig0b.cleanup(),_branch0.alive(),_branch0.child_gone()) +DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b +DLGLOBAL DEBUG test(_branch0){alive}: still exists: child[0] +DLGLOBAL DEBUG 2 (__twig0b.cleanup(),_branch0.alive()) +DLGLOBAL DEBUG 1 (__twig0b.cleanup()) +DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() done +DLGLOBAL DEBUG 0 (-) +DLGLOBAL DEBUG test(__twig0b){alive}: Deferring: will deallocate with test(_branch0) +DLGLOBAL DEBUG test(__twig0a){alive}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_PARENT, caused by: test(_branch0)) +DLGLOBAL DEBUG test(__twig0a){alive}: pre_term() +DLGLOBAL DEBUG test(__twig0a){alive}: Removing from parent test(_branch0) +DLGLOBAL DEBUG 1 (__twig0a.cleanup()) +DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() +DLGLOBAL DEBUG test(__twig0a){alive}: scene forgets __twig0a +DLGLOBAL DEBUG test(__twig0a){alive}: removing reference __twig0a.other[0] -> other +DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE +DLGLOBAL DEBUG 2 (__twig0a.cleanup(),other.alive()) +DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE) +DLGLOBAL DEBUG 3 (__twig0a.cleanup(),other.alive(),other.other_gone()) +DLGLOBAL DEBUG 2 (__twig0a.cleanup(),other.alive()) +DLGLOBAL DEBUG 1 (__twig0a.cleanup()) +DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE +DLGLOBAL DEBUG 2 (__twig0a.cleanup(),_branch0.alive()) +DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE) +DLGLOBAL DEBUG 3 (__twig0a.cleanup(),_branch0.alive(),_branch0.child_gone()) +DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a +DLGLOBAL DEBUG test(_branch0){alive}: No more children +DLGLOBAL DEBUG 2 (__twig0a.cleanup(),_branch0.alive()) +DLGLOBAL DEBUG test(_branch0){alive}: state_chg to destroying +DLGLOBAL DEBUG 3 (__twig0a.cleanup(),_branch0.alive(),_branch0.destroying_onenter()) +DLGLOBAL DEBUG test(_branch0){destroying}: destroying_onenter() from alive +DLGLOBAL DEBUG test(_branch0){destroying}: Ignoring trigger to terminate: already terminating +DLGLOBAL DEBUG 2 (__twig0a.cleanup(),_branch0.alive()) DLGLOBAL DEBUG 1 (__twig0a.cleanup()) DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() done DLGLOBAL DEBUG 0 (-) -DLGLOBAL DEBUG test(__twig0a){alive}: Freeing instance -DLGLOBAL DEBUG test(__twig0a){alive}: Deallocated +DLGLOBAL DEBUG test(__twig0a){alive}: Deferring: will deallocate with test(_branch0) +DLGLOBAL DEBUG test(_branch0){destroying}: Removing from parent test(root) DLGLOBAL DEBUG 1 (_branch0.cleanup()) DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() DLGLOBAL DEBUG test(_branch0){destroying}: scene forgets _branch0 +DLGLOBAL DEBUG test(_branch0){destroying}: removing reference _branch0.other[0] -> other +DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE +DLGLOBAL DEBUG 2 (_branch0.cleanup(),other.alive()) +DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE) +DLGLOBAL DEBUG 3 (_branch0.cleanup(),other.alive(),other.other_gone()) +DLGLOBAL DEBUG test(other){alive}: EV_OTHER_GONE: Dropped reference other.other[0] = _branch0 +DLGLOBAL DEBUG 2 (_branch0.cleanup(),other.alive()) +DLGLOBAL DEBUG test(other){alive}: state_chg to destroying +DLGLOBAL DEBUG 3 (_branch0.cleanup(),other.alive(),other.destroying_onenter()) +DLGLOBAL DEBUG test(other){destroying}: destroying_onenter() from alive +DLGLOBAL DEBUG test(other){destroying}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch0)) +DLGLOBAL DEBUG test(other){destroying}: pre_term() +DLGLOBAL DEBUG 4 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup()) +DLGLOBAL DEBUG test(other){destroying}: cleanup() +DLGLOBAL DEBUG test(other){destroying}: scene forgets other +DLGLOBAL DEBUG test(other){destroying}: removing reference other.other[1] -> _branch1 +DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_OTHER_GONE +DLGLOBAL DEBUG 5 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive()) +DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_OTHER_GONE) +DLGLOBAL DEBUG 6 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.other_gone()) +DLGLOBAL DEBUG test(_branch1){alive}: EV_OTHER_GONE: Dropped reference _branch1.other[0] = other +DLGLOBAL DEBUG 5 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive()) +DLGLOBAL DEBUG test(_branch1){alive}: state_chg to destroying +DLGLOBAL DEBUG 6 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter()) +DLGLOBAL DEBUG test(_branch1){destroying}: destroying_onenter() from alive +DLGLOBAL DEBUG test(_branch1){destroying}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch0)) +DLGLOBAL DEBUG test(_branch1){destroying}: pre_term() +DLGLOBAL DEBUG test(__twig1b){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_PARENT, caused by: test(_branch0)) +DLGLOBAL DEBUG test(__twig1b){alive}: pre_term() +DLGLOBAL DEBUG test(__twig1b){alive}: Removing from parent test(_branch1) +DLGLOBAL DEBUG 7 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_ +DLGLOBAL DEBUG test(__twig1b){alive}: cleanup() +DLGLOBAL DEBUG test(__twig1b){alive}: scene forgets __twig1b +DLGLOBAL DEBUG test(_branch1){destroying}: Received Event EV_CHILD_GONE +DLGLOBAL DEBUG 8 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_ +DLGLOBAL DEBUG test(_branch1){destroying}: destroying(EV_CHILD_GONE) +DLGLOBAL DEBUG 9 (_branch0.cleanup(),other.ali |