*/
void *talloc_reference(const void *context, const void *ptr)
{
- struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
+ struct talloc_chunk *tc;
struct talloc_reference_handle *handle;
+ if (ptr == NULL) return NULL;
+
+ tc = talloc_chunk_from_ptr(ptr);
handle = talloc_named_const(context, sizeof(*handle), TALLOC_MAGIC_REFERENCE);
+
if (handle == NULL) return NULL;
/* note that we hang the destructor off the handle, not the
struct talloc_chunk *tc_p, *new_p;
void *new_parent;
+ if (ptr == NULL) {
+ return -1;
+ }
+
if (context == NULL) {
context = null_context;
}
talloc_free(r1);
talloc_report_full(NULL, stdout);
+ printf("Testing NULL\n");
+ if (talloc_reference(root, NULL)) {
+ return False;
+ }
+
CHECK_BLOCKS(root, 1);
CHECK_SIZE(root, 0);
talloc_unlink(NULL, p2);
talloc_unlink(root, p1);
-
+ /* Test that talloc_unlink is a no-op */
+
+ if (talloc_unlink(root, NULL) != -1) {
+ printf("failed: talloc_unlink(root, NULL) == -1\n");
+ return False;
+ }
talloc_report(root, stdout);
talloc_report(NULL, stdout);
which case it will return NULL (each additional reference consumes
around 48 bytes of memory on intel x86 platforms).
+If "ptr" is NULL, then the function is a no-op, and simply returns NULL.
+
After creating a reference you can free it in one of the following
ways:
with this pointer, or must be a direct parent of ptr.
Note that if the parent has already been removed using talloc_free()
-then this function will fail and will return -1.
+then this function will fail and will return -1. Likewise, if "ptr"
+is NULL, then the function will make no modifications and return -1.
Usually you can just use talloc_free() instead of talloc_unlink(), but
sometimes it is useful to have the additional control on which parent