talloc: fixed talloc_disable_null_tracking()
authorAndrew Tridgell <tridge@samba.org>
Sun, 20 Sep 2009 20:14:40 +0000 (13:14 -0700)
committerAndrew Tridgell <tridge@samba.org>
Sun, 20 Sep 2009 20:14:40 +0000 (13:14 -0700)
When we disable null tracking, we need to move any existing objects
that are under the null_context to be parented by the true NULL
context.

We also need a new talloc_enable_null_tracking_no_autofree() function,
as the talloc testsuite cannot cope with the moving of the autofree
context under the null_context as it wants to check exact counts of
objects under the null_context, and smbtorture has a large number of
objects in the autofree_context from .init functions

lib/talloc/talloc.c
lib/talloc/talloc.h
lib/talloc/testsuite.c

index f103a9b94111f4e0e3a3c8f1c2b3efae4c07b7eb..7beda4b0f587b69c0f549eb76d2935f1d4413d55 100644 (file)
@@ -1476,11 +1476,38 @@ void talloc_enable_null_tracking(void)
        }
 }
 
+/*
+  enable tracking of the NULL context, not moving the autofree context
+  into the NULL context. This is needed for the talloc testsuite
+*/
+void talloc_enable_null_tracking_no_autofree(void)
+{
+       if (null_context == NULL) {
+               null_context = _talloc_named_const(NULL, 0, "null_context");
+       }
+}
+
 /*
   disable tracking of the NULL context
 */
 void talloc_disable_null_tracking(void)
 {
+       if (null_context != NULL) {
+               /* we have to move any children onto the real NULL
+                  context */
+               struct talloc_chunk *tc, *tc2;
+               tc = talloc_chunk_from_ptr(null_context);
+               for (tc2 = tc->child; tc2; tc2=tc2->next) {
+                       if (tc2->parent == tc) tc2->parent = NULL;
+                       if (tc2->prev == tc) tc2->prev = NULL;
+               }
+               for (tc2 = tc->next; tc2; tc2=tc2->next) {
+                       if (tc2->parent == tc) tc2->parent = NULL;
+                       if (tc2->prev == tc) tc2->prev = NULL;
+               }
+               tc->child = NULL;
+               tc->next = NULL;
+       }
        talloc_free(null_context);
        null_context = NULL;
 }
index 8241eeb306d2663b4611d054f4200b423d914aa2..f549a17fba294ccee2b713fba5a2704fa54d191c 100644 (file)
@@ -163,6 +163,7 @@ void talloc_report_depth_file(const void *ptr, int depth, int max_depth, FILE *f
 void talloc_report_full(const void *ptr, FILE *f);
 void talloc_report(const void *ptr, FILE *f);
 void talloc_enable_null_tracking(void);
+void talloc_enable_null_tracking_no_autofree(void);
 void talloc_disable_null_tracking(void);
 void talloc_enable_leak_report(void);
 void talloc_enable_leak_report_full(void);
index 8845d960c15423ac409ca083babeb3790eb70eb4..08aa20863a1e6c67fc2e2a0b413e523ca2cd8cba 100644 (file)
@@ -518,6 +518,7 @@ static bool test_misc(void)
 
        CHECK_SIZE("misc", NULL, 0);
 
+       talloc_enable_null_tracking_no_autofree();
        talloc_enable_leak_report();
        talloc_enable_leak_report_full();
 
@@ -1136,7 +1137,7 @@ static void test_reset(void)
        talloc_set_log_fn(test_log_stdout);
        test_abort_stop();
        talloc_disable_null_tracking();
-       talloc_enable_null_tracking();
+       talloc_enable_null_tracking_no_autofree();
 }
 
 struct torture_context;