A patch to stamp talloc_move/talloc_steal info ...

Richard Sharpe realrichardsharpe at gmail.com
Thu Mar 3 18:19:43 UTC 2016


Hi folks,

I talked about this a while ago.

Here is a patch.

I will try to send a properly formatted git patch soon.

diff -ur talloc-2.1.1/talloc.c talloc-2.1.1-mod/talloc.c
--- talloc-2.1.1/talloc.c       2016-02-13 13:34:47.266100765 -0800
+++ talloc-2.1.1-mod/talloc.c   2016-02-11 18:00:18.858928133 -0800
@@ -273,6 +273,8 @@
         * from.
         */
        struct talloc_pool_hdr *pool;
+
+        const char *stolen_loc;
 };

 /* 16 byte alignment seems to keep everyone happy */
@@ -850,7 +852,7 @@
        return handle->ptr;
 }

-static void *_talloc_steal_internal(const void *new_ctx, const void *ptr);
+static void *_talloc_steal_internal(const void *new_ctx, const void
*ptr, const char *location);

 static inline void _talloc_free_poolmem(struct talloc_chunk *tc,
                                        const char *location)
@@ -1067,7 +1069,7 @@
    ptr on success, or NULL if it could not be transferred.
    passing NULL as ptr will always return NULL with no side effects.
 */
-static void *_talloc_steal_internal(const void *new_ctx, const void *ptr)
+static void *_talloc_steal_internal(const void *new_ctx, const void
*ptr, const char *location)
 {
        struct talloc_chunk *tc, *new_tc;
        size_t ctx_size = 0;
@@ -1082,6 +1084,11 @@

        tc = talloc_chunk_from_ptr(ptr);

+       /* Stamp the name regardless */
+       if (location) {
+               tc->stolen_loc = location;
+        }
+
        if (tc->limit != NULL) {

                ctx_size = _talloc_total_limit_size(ptr, NULL, NULL);
@@ -1179,7 +1186,7 @@
        }
 #endif

-       return _talloc_steal_internal(new_ctx, ptr);
+       return _talloc_steal_internal(new_ctx, ptr, location);
 }

 /*
@@ -1199,13 +1206,13 @@
        }

        if (old_parent == talloc_parent(ptr)) {
-               return _talloc_steal_internal(new_parent, ptr);
+               return _talloc_steal_internal(new_parent, ptr, NULL);
        }

        tc = talloc_chunk_from_ptr(ptr);
        for (h=tc->refs;h;h=h->next) {
                if (talloc_parent(h) == old_parent) {
-                       if (_talloc_steal_internal(new_parent, h) != h) {
+                       if (_talloc_steal_internal(new_parent, h, NULL) != h) {
                                return NULL;
                        }
                        return discard_const_p(void, ptr);
@@ -1292,7 +1299,7 @@
                return -1;
        }

-       _talloc_steal_internal(new_parent, ptr);
+       _talloc_steal_internal(new_parent, ptr, NULL);

        return 0;
 }
@@ -1468,7 +1475,7 @@
                                struct talloc_chunk *p =
talloc_parent_chunk(ptr);
                                if (p) new_parent = TC_PTR_FROM_CHUNK(p);
                        }
-                       _talloc_steal_internal(new_parent, child);
+                       _talloc_steal_internal(new_parent, child, location);
                }
        }
 }
@@ -1855,10 +1862,10 @@
   a wrapper around talloc_steal() for situations where you are moving a pointer
   between two structures, and want the old pointer to be set to NULL
 */
-_PUBLIC_ void *_talloc_move(const void *new_ctx, const void *_pptr)
+_PUBLIC_ void *_talloc_move(const void *new_ctx, const void *_pptr,
const char *location)
 {
        const void **pptr = discard_const_p(const void *,_pptr);
-       void *ret = talloc_steal(new_ctx, discard_const_p(void, *pptr));
+       void *ret = _talloc_steal_loc(new_ctx, discard_const_p(void,
*pptr), location);
        (*pptr) = NULL;
        return ret;
 }
@@ -2059,9 +2066,9 @@
                return;
        }

-       fprintf(f, "%*s%-30s contains %6lu bytes in %3lu blocks (ref %d) %p\n",
+       fprintf(f, "%*s%-30s at %p contains %6lu bytes in %3lu blocks
(ref %d) %p\n",
                depth*4, "",
-               name,
+               name, ptr,
                (unsigned long)talloc_total_size(ptr),
                (unsigned long)talloc_total_blocks(ptr),
                (int)talloc_reference_count(ptr), ptr);
diff -ur talloc-2.1.1/talloc.h talloc-2.1.1-mod/talloc.h
--- talloc-2.1.1/talloc.h       2014-05-20 05:32:13.000000000 -0700
+++ talloc-2.1.1-mod/talloc.h   2016-02-11 17:49:58.627789375 -0800
@@ -412,8 +412,8 @@
  */
 void *talloc_move(const void *new_ctx, void **pptr);
 #else
-#define talloc_move(ctx, pptr)
(_TALLOC_TYPEOF(*(pptr)))_talloc_move((ctx),(void *)(pptr))
-void *_talloc_move(const void *new_ctx, const void *pptr);
+#define talloc_move(ctx, pptr)
(_TALLOC_TYPEOF(*(pptr)))_talloc_move((ctx),(void *)(pptr),
__location__)
+void *_talloc_move(const void *new_ctx, const void *pptr, const char
*location);
 #endif

 /**


-- 
Regards,
Richard Sharpe
(何以解憂?唯有杜康。--曹操)



More information about the samba-technical mailing list