r4479: added the function talloc_autofree_context() which returns a talloc context...
authorAndrew Tridgell <tridge@samba.org>
Sun, 2 Jan 2005 12:55:33 +0000 (12:55 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:08:10 +0000 (13:08 -0500)
will automatically be freed on program exit. This is useful for reducing
clutter in leak reports

source/lib/dcom/common/tables.c
source/lib/registry/common/reg_interface.c
source/lib/talloc/talloc.c
source/lib/talloc/talloc.h
source/lib/talloc/talloc_guide.txt
source/librpc/rpc/dcerpc.c

index 6b0d99cae3a2e7f930077bbfe559cf26c9914a81..faf67710e08c365f42c95fd8594ebd8a8a98df74 100644 (file)
@@ -76,10 +76,13 @@ const void *dcom_proxy_vtable_by_iid(const struct GUID *iid)
 NTSTATUS dcom_register_interface(const void *_iface)
 {
        const struct dcom_interface *iface = _iface;
-       struct interface_list *l = talloc_zero_p(interfaces, struct interface_list);
+       struct interface_list *l;
+
+       l = talloc_zero_p(interfaces?interfaces:talloc_autofree_context(), 
+                         struct interface_list);
 
        l->interface = *iface;
-       
+
        DLIST_ADD(interfaces, l);
        
        return NT_STATUS_OK;
@@ -88,7 +91,8 @@ NTSTATUS dcom_register_interface(const void *_iface)
 NTSTATUS dcom_register_class(const void *_class)
 {
        const struct dcom_class *class = _class;
-       struct class_list *l = talloc_zero_p(classes, struct class_list);
+       struct class_list *l = talloc_zero_p(classes?classes:talloc_autofree_context(), 
+                                            struct class_list);
 
        l->class = *class;
        
index 9b03a69f3f8709b33575d356267ac8281472b9a1..442b34bc13163a70e2ce84b84e13e424a08d5a9f 100644 (file)
@@ -44,7 +44,7 @@ NTSTATUS registry_register(const void *_hive_ops)
                return NT_STATUS_OBJECT_NAME_COLLISION;
        }
 
-       entry = talloc_p(NULL, struct reg_init_function_entry);
+       entry = talloc_p(talloc_autofree_context(), struct reg_init_function_entry);
        entry->hive_functions = hive_ops;
 
        DLIST_ADD(backends, entry);
index 4666e28288ca914c672f93c2acfe7356d4eade51..9e8868191fa1510f083e484da1f5bdc36824931a 100644 (file)
@@ -67,6 +67,7 @@
    NULL
 */
 static const void *null_context;
+static void *cleanup_context;
 
 
 struct talloc_reference_handle {
@@ -1004,3 +1005,23 @@ void *talloc_realloc_fn(const void *context, void *ptr, size_t size)
 {
        return _talloc_realloc(context, ptr, size, NULL);
 }
+
+
+static void talloc_autofree(void)
+{
+       talloc_free(cleanup_context);
+       cleanup_context = NULL;
+}
+
+/*
+  return a context which will be auto-freed on exit
+  this is useful for reducing the noise in leak reports
+*/
+void *talloc_autofree_context(void)
+{
+       if (cleanup_context == NULL) {
+               cleanup_context = talloc_named_const(NULL, 0, "autofree_context");
+               atexit(talloc_autofree);
+       }
+       return cleanup_context;
+}
index 6ebba447aad97ad04c1d5690dcdcb6a6247d18fd..9e828f2f0d629ec2880f950c4714e39aeb98efaf 100644 (file)
@@ -91,6 +91,7 @@ void *talloc_array(const void *ctx, size_t el_size, unsigned count, const char *
 void *talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name);
 void *talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name);
 void *talloc_realloc_fn(const void *context, void *ptr, size_t size);
+void *talloc_autofree_context(void);
 
 #endif
 
index b3b148d4768b6d8adf619fee76ecaa313d8682e7..ce3c8bde68fe7539fe43c83dc2cb68cdf16ef377 100644 (file)
@@ -490,3 +490,9 @@ implementation encapsulates the functionality of malloc(), free() and
 realloc() in one call, which is why it is useful to be able to pass
 around a single function pointer.
 
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+void *talloc_autofree_context(void);
+
+This is a handy utility function that returns a talloc context
+which will be automatically freed on program exit. This can be used
+to reduce the noise in memory leak reports.
index f6c0ebc41328dff7801c5581c6f0ea8a84967b82..e329297ab676cec153efed485116daf41d367cb0 100644 (file)
 
 struct dcerpc_interface_list *dcerpc_pipes = NULL;
 
-NTSTATUS librpc_register_interface (const struct dcerpc_interface_table *interface)
+NTSTATUS librpc_register_interface(const struct dcerpc_interface_table *interface)
 {
-       struct dcerpc_interface_list *l = talloc_p(NULL, struct dcerpc_interface_list);
+       struct dcerpc_interface_list *l = talloc_p(talloc_autofree_context(),
+                                                  struct dcerpc_interface_list);
                
        if (idl_iface_by_name (interface->name) != NULL) {
                DEBUG(0, ("Attempt to register interface %s twice\n", interface->name));
                return NT_STATUS_OBJECT_NAME_COLLISION;
        }
        l->table = interface;
-       
+
        DLIST_ADD(dcerpc_pipes, l);
        
        return NT_STATUS_OK;
 }
-  
+
 /* initialise a dcerpc pipe. */
 struct dcerpc_pipe *dcerpc_pipe_init(void)
 {