@@ -121,6 +121,10 @@ void
engine_cleanup(void)
{
for (size_t i = 0; i < engine_n_nodes; i++) {
+ if (engine_nodes[i]->clear_tracked_data) {
+ engine_nodes[i]->clear_tracked_data(engine_nodes[i]->data);
+ }
+
if (engine_nodes[i]->cleanup) {
engine_nodes[i]->cleanup(engine_nodes[i]->data);
}
@@ -260,6 +264,10 @@ engine_init_run(void)
VLOG_DBG("Initializing new run");
for (size_t i = 0; i < engine_n_nodes; i++) {
engine_set_node_state(engine_nodes[i], EN_STALE);
+
+ if (engine_nodes[i]->clear_tracked_data) {
+ engine_nodes[i]->clear_tracked_data(engine_nodes[i]->data);
+ }
}
}
@@ -149,6 +149,10 @@ struct engine_node {
* doesn't store pointers to DB records it's still safe to use).
*/
bool (*is_valid)(struct engine_node *);
+
+ /* Method to clear up tracked data maintained by the engine node in the
+ * engine 'data'. It may be NULL. */
+ void (*clear_tracked_data)(void *tracked_data);
};
/* Initialize the data for the engine nodes. It calls each node's
@@ -282,6 +286,7 @@ void engine_ovsdb_node_add_index(struct engine_node *, const char *name,
.run = en_##NAME##_run, \
.cleanup = en_##NAME##_cleanup, \
.is_valid = en_##NAME##_is_valid, \
+ .clear_tracked_data = NULL, \
};
#define ENGINE_NODE_CUSTOM_DATA(NAME, NAME_STR) \
@@ -291,6 +296,10 @@ void engine_ovsdb_node_add_index(struct engine_node *, const char *name,
static bool (*en_##NAME##_is_valid)(struct engine_node *node) = NULL; \
ENGINE_NODE_DEF(NAME, NAME_STR)
+#define ENGINE_NODE_WITH_CLEAR_TRACK_DATA(NAME, NAME_STR) \
+ ENGINE_NODE(NAME, NAME_STR) \
+ en_##NAME.clear_tracked_data = en_##NAME##_clear_tracked_data;
+
/* Macro to define member functions of an engine node which represents
* a table of OVSDB */
#define ENGINE_FUNC_OVSDB(DB_NAME, TBL_NAME) \