talloc: add talloc_get_type_abort()
authorStefan Metzmacher <metze@samba.org>
Tue, 3 Mar 2009 17:01:01 +0000 (18:01 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 3 Mar 2009 17:07:33 +0000 (18:07 +0100)
metze

lib/talloc/talloc.c
lib/talloc/talloc.h

index 1f7e52439f81619ae6f6cb78fdb09f140f878ecd..c472e9fda9c685e7bab11f1ff83f562662c0569e 100644 (file)
@@ -806,6 +806,30 @@ void *talloc_check_name(const void *ptr, const char *name)
        return NULL;
 }
 
+static void talloc_abort_type_missmatch(const char *location,
+                                       const char *name,
+                                       const char *expected)
+{
+       TALLOC_ABORT("Type missmatch");
+}
+
+void *_talloc_get_type_abort(const void *ptr, const char *name, const char *location)
+{
+       const char *pname;
+
+       if (unlikely(ptr == NULL)) {
+               talloc_abort_type_missmatch(location, NULL, name);
+               return NULL;
+       }
+
+       pname = talloc_get_name(ptr);
+       if (likely(pname == name || strcmp(pname, name) == 0)) {
+               return discard_const_p(void, ptr);
+       }
+
+       talloc_abort_type_missmatch(location, pname, name);
+       return NULL;
+}
 
 /*
   this is for compatibility with older versions of talloc
index 5431971655ed7093a2e9d2db3c3239da69c18177..002e06e52da9e175f9f4e6e48be320efc03c79c0 100644 (file)
@@ -102,6 +102,7 @@ typedef void TALLOC_CTX;
 
 #define talloc_set_type(ptr, type) talloc_set_name_const(ptr, #type)
 #define talloc_get_type(ptr, type) (type *)talloc_check_name(ptr, #type)
+#define talloc_get_type_abort(ptr, type) (type *)_talloc_get_type_abort(ptr, #type, __location__)
 
 #define talloc_find_parent_bytype(ptr, type) (type *)talloc_find_parent_byname(ptr, #type)
 
@@ -129,6 +130,7 @@ void *talloc_named(const void *context, size_t size,
 void *talloc_named_const(const void *context, size_t size, const char *name);
 const char *talloc_get_name(const void *ptr);
 void *talloc_check_name(const void *ptr, const char *name);
+void *_talloc_get_type_abort(const void *ptr, const char *name, const char *location);
 void *talloc_parent(const void *ptr);
 const char *talloc_parent_name(const void *ptr);
 void *talloc_init(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2);