Skip to content

Commit

Permalink
Improve data destruction order. (#42)
Browse files Browse the repository at this point in the history
  • Loading branch information
tmadden committed Dec 17, 2020
1 parent 62b1d81 commit 9c2ba55
Show file tree
Hide file tree
Showing 6 changed files with 247 additions and 165 deletions.
6 changes: 3 additions & 3 deletions src/alia/flow/data_graph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -219,12 +219,12 @@ clear_data_block(data_block& block)
// state of destruction.
block.clear_cache();

clear_data_nodes(block.nodes);
block.nodes = 0;

delete_named_block_ref_list(block.named_blocks);
block.named_blocks = 0;

clear_data_nodes(block.nodes);
block.nodes = 0;

block.cache_clear = true;
}

Expand Down
8 changes: 4 additions & 4 deletions unit_tests/flow/conditionals.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ TEST_CASE("conditional functions", "[flow][macros]")
check_log("");
}
check_log(
"destructing int;"
"destructing int;"
"destructing int;"
"destructing int;");
"destructing int: 2;"
"destructing int: 1;"
"destructing int: 0;"
"destructing int: -1;");
}
147 changes: 59 additions & 88 deletions unit_tests/flow/data_graph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ TEST_CASE("basic data traversal", "[flow][data_graph]")
do_traversal(graph, controller);
check_log("visiting int: 0;");
}
check_log("destructing int;");
check_log("destructing int: 0;");
}

TEST_CASE("simple named blocks", "[flow][data_graph]")
Expand All @@ -44,7 +44,7 @@ TEST_CASE("simple named blocks", "[flow][data_graph]")
check_log(
"initializing int: 2;"
"visiting int: 0;"
"destructing int;");
"destructing int: 1;");
do_traversal(graph, make_controller({1, 2}));
check_log(
"initializing int: 1;"
Expand All @@ -55,19 +55,21 @@ TEST_CASE("simple named blocks", "[flow][data_graph]")
"visiting int: 2;"
"initializing int: 3;"
"visiting int: 0;"
"destructing int;");
"destructing int: 1;");
do_traversal(graph, make_controller({2, 1, 3}));
check_log(
"visiting int: 2;"
"initializing int: 1;"
"visiting int: 3;"
"visiting int: 0;");
}
check_log(
"destructing int;"
"destructing int;"
"destructing int;"
"destructing int;");
match_log(
// The named blocks go first (in arbitrary order).
"destructing int: [1-3];"
"destructing int: [1-3];"
"destructing int: [1-3];"
// Then the fixed content goes.
"destructing int: 0;");
}

TEST_CASE("mobile named blocks", "[flow][data_graph]")
Expand Down Expand Up @@ -116,9 +118,9 @@ TEST_CASE("mobile named blocks", "[flow][data_graph]")
"visiting int: 3;");
}
check_log(
"destructing int;"
"destructing int;"
"destructing int;");
"destructing int: 3;"
"destructing int: 2;"
"destructing int: 1;");
}

TEST_CASE("multiple naming contexts", "[flow][data_graph]")
Expand Down Expand Up @@ -160,8 +162,8 @@ TEST_CASE("multiple naming contexts", "[flow][data_graph]")
"initializing int: 2;"
"initializing int: 4;"
"visiting int: 0;"
"destructing int;"
"destructing int;");
"destructing int: 2;"
"destructing int: 1;");
do_traversal(graph, make_controller({1, 2}));
check_log(
"initializing int: 1;"
Expand All @@ -176,15 +178,17 @@ TEST_CASE("multiple naming contexts", "[flow][data_graph]")
"visiting int: 4;"
"initializing int: 6;"
"visiting int: 0;"
"destructing int;"
"destructing int;");
"destructing int: 2;"
"destructing int: 1;");
}
check_log(
"destructing int;"
"destructing int;"
"destructing int;"
"destructing int;"
"destructing int;");
match_log(
// The named blocks go first (in arbitrary order).
"destructing int: [2-6];"
"destructing int: [2-6];"
"destructing int: [2-6];"
"destructing int: [2-6];"
// Then the fixed content goes.
"destructing int: 0;");
}

TEST_CASE("unexecuted named blocks", "[data_graph]")
Expand Down Expand Up @@ -220,10 +224,12 @@ TEST_CASE("unexecuted named blocks", "[data_graph]")
"visiting int: 1;"
"visiting int: 0;");
}
check_log(
"destructing int;"
"destructing int;"
"destructing int;");
match_log(
// This goes first because it's not a sibling of the named blocks.
"destructing int: 0;"
// These go in arbitrary order.
"destructing int: [1-2];"
"destructing int: [1-2];");
}

TEST_CASE("GC disabling", "[data_graph]")
Expand Down Expand Up @@ -261,16 +267,16 @@ TEST_CASE("GC disabling", "[data_graph]")
"visiting int: 2;"
"visiting int: 1;"
"visiting int: 0;");
// This traversal is an error because it tries to change the order
// This traversal is an error because it tries to change the order
// with GC disabled.
REQUIRE_THROWS_AS(
do_traversal(graph, make_controller({1, 2}), false),
named_block_out_of_order);
}
check_log(
"destructing int;"
"destructing int;"
"destructing int;");
match_log(
"destructing int: [1-2];"
"destructing int: [1-2];"
"destructing int: 0;");
}

TEST_CASE("manual deletion", "[data_graph]")
Expand Down Expand Up @@ -306,7 +312,7 @@ TEST_CASE("manual deletion", "[data_graph]")
check_log(
"visiting int: 1;"
"visiting int: 0;"
"destructing int;");
"destructing int: 2;");
// Test that normal blocks are still GC'd.
do_traversal(graph, make_controller({3, 1}));
check_log(
Expand All @@ -320,7 +326,7 @@ TEST_CASE("manual deletion", "[data_graph]")
"visiting int: 0;");
// Test manual deletion.
delete_named_block(graph, make_id(3));
check_log("destructing int;");
check_log("destructing int: 3;");
// Test that manual deletion has no effect on blocks that are still
// active.
delete_named_block(graph, make_id(1));
Expand All @@ -331,8 +337,10 @@ TEST_CASE("manual deletion", "[data_graph]")
"visiting int: 0;");
}
check_log(
"destructing int;"
"destructing int;");
// First the named block.
"destructing int: 1;"
// Then the fixed block.
"destructing int: 0;");
}

TEST_CASE("named block caching", "[data_graph]")
Expand Down Expand Up @@ -369,31 +377,31 @@ TEST_CASE("named block caching", "[data_graph]")
do_traversal(graph, make_controller(value(true), {1}));
check_log(
"visiting cached int: 1;"
"destructing int;");
"destructing int: 2;");
do_traversal(graph, make_controller(value(true), {2, 1}));
check_log(
"initializing cached int: 2;"
"visiting cached int: 1;");
do_traversal(graph, make_controller(value(false), {2, 1}));
check_log(
"destructing int;"
"destructing int;");
"destructing int: 1;"
"destructing int: 2;");
do_traversal(graph, make_controller(value(true), {2, 1}));
check_log(
"initializing cached int: 2;"
"initializing cached int: 1;");
do_traversal(graph, make_controller(value(false), {}));
check_log(
"destructing int;"
"destructing int;");
"destructing int: 1;"
"destructing int: 2;");
do_traversal(graph, make_controller(value(true), {2, 1}));
check_log(
"initializing cached int: 2;"
"initializing cached int: 1;");
}
check_log(
"destructing int;"
"destructing int;");
"destructing int: 1;"
"destructing int: 2;");
}

TEST_CASE("naming_map lifetime", "[data_graph]")
Expand Down Expand Up @@ -433,11 +441,11 @@ TEST_CASE("naming_map lifetime", "[data_graph]")
check_log(
"visiting int: 2;"
"visiting int: 1;"
"destructing int;");
"destructing int: 3;");
do_traversal(graph, make_controller(value(true), {}));
check_log(
"destructing int;"
"destructing int;");
"destructing int: 1;"
"destructing int: 2;");
}
}

Expand Down Expand Up @@ -478,7 +486,7 @@ TEST_CASE("scoped_cache_clearing_disabler", "[data_graph]")
do_traversal(graph, make_controller(value(false)));
check_log(
"visiting cached int: 1;"
"destructing int;");
"destructing int: 2;");
do_traversal(graph, make_controller(empty<bool>()));
check_log("");
do_traversal(graph, make_controller(value(true)));
Expand All @@ -488,60 +496,23 @@ TEST_CASE("scoped_cache_clearing_disabler", "[data_graph]")
do_traversal(graph, make_controller(value(false)));
check_log(
"visiting cached int: 1;"
"destructing int;");
"destructing int: 2;");
}
check_log(
"destructing int;"
"destructing int;");
}

namespace {

struct verbose_int_object
{
verbose_int_object() : n(-1)
{
}
verbose_int_object(int n) : n(n)
{
}
~verbose_int_object()
{
the_log << "destructing int: " << n << ";";
}
int n;
};

template<class Context>
void
do_verbose_int(Context& ctx, int n)
{
verbose_int_object* obj;
if (get_data(ctx, &obj))
{
REQUIRE(obj->n == -1);
obj->n = n;
the_log << "initializing int: " << n << ";";
}
else
{
REQUIRE(obj->n == n);
the_log << "visiting int: " << n << ";";
}
"destructing int: 1;"
"destructing int: 0;");
}

} // namespace

TEST_CASE("data node destruction order", "[data_graph]")
{
clear_log();
{
data_graph graph;
auto make_controller = []() {
return [=](context ctx) {
do_verbose_int(ctx, 1);
do_verbose_int(ctx, 2);
do_verbose_int(ctx, 3);
do_int(ctx, 1);
do_int(ctx, 2);
do_int(ctx, 3);
};
};
do_traversal(graph, make_controller());
Expand Down

0 comments on commit 9c2ba55

Please sign in to comment.