talloc_stackframe only needs 1 talloc
authorVolker Lendecke <vl@samba.org>
Sun, 6 Jan 2008 16:25:20 +0000 (17:25 +0100)
committerVolker Lendecke <vl@samba.org>
Mon, 7 Jan 2008 20:18:00 +0000 (21:18 +0100)
source/lib/talloc_stack.c

index e6e4ed321a52a08956e652f943f5452b81f4bbac..cc7ce3a51873b34b78eeb2bae2610bde3b0c4f10 100644 (file)
 static int talloc_stacksize;
 static TALLOC_CTX **talloc_stack;
 
-static int talloc_pop(int *ptr)
+static int talloc_pop(TALLOC_CTX *frame)
 {
-       int tos = *ptr;
        int i;
 
-       for (i=talloc_stacksize-1; i>=tos; i--) {
+       for (i=talloc_stacksize-1; i>0; i--) {
+               if (frame == talloc_stack[i]) {
+                       break;
+               }
                talloc_free(talloc_stack[i]);
        }
 
-       talloc_stacksize = tos;
+       talloc_stacksize = i;
        return 0;
 }
 
@@ -64,7 +66,6 @@ static int talloc_pop(int *ptr)
 TALLOC_CTX *talloc_stackframe(void)
 {
        TALLOC_CTX **tmp, *top;
-       int *cleanup;
 
        if (!(tmp = TALLOC_REALLOC_ARRAY(NULL, talloc_stack, TALLOC_CTX *,
                                         talloc_stacksize + 1))) {
@@ -77,12 +78,7 @@ TALLOC_CTX *talloc_stackframe(void)
                goto fail;
        }
 
-       if (!(cleanup = talloc(top, int))) {
-               goto fail;
-       }
-
-       *cleanup = talloc_stacksize;
-       talloc_set_destructor(cleanup, talloc_pop);
+       talloc_set_destructor(top, talloc_pop);
 
        talloc_stack[talloc_stacksize++] = top;