Disable NULL context tracking
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 20 Jun 2014 19:07:15 +0000 (20:07 +0100)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 20 Jun 2014 19:07:21 +0000 (20:07 +0100)
src/lib/debug.c
src/main/radiusd.c

index 3f371e6..7051a92 100644 (file)
@@ -722,11 +722,6 @@ int fr_fault_setup(char const *cmd, char const *program)
                        TALLOC_CTX *tmp;
                        bool *marker;
 
-                       /*
-                        *  This should create a single NULL context used whenever
-                        *  something is talloced without a parent.
-                        */
-                       talloc_enable_null_tracking();
                        tmp = talloc(NULL, bool);
                        talloc_null_ctx = talloc_parent(tmp);
                        talloc_free(tmp);
index bffb2e5..a4e089a 100644 (file)
@@ -301,6 +301,23 @@ int main(int argc, char *argv[])
        }
 
        /*
+        *      According to the talloc peeps, no two threads
+        *      may modify any part of a ctx tree with a common
+        *      root without synchronisation.
+        *
+        *      So we can't run with a null context and threads.
+        */
+       if (main_config.memory_report) {
+               if (spawn_flag) {
+                       fprintf(stderr, "radiusd: The server cannot produce memory reports (-M) in threaded mode\n");
+                       exit(EXIT_FAILURE);
+               }
+               talloc_enable_null_tracking();
+       } else {
+               talloc_disable_null_tracking();
+       }
+
+       /*
         *      Better here, so it doesn't matter whether we get passed
         *      -xv or -vx.
         */