talloc: talloc_set_flag/talloc_unset_flag and TALLOC_FLAG_WARN_MAY_REFERENCE talloc-reference-check-wip
authorRusty Russell <rusty@rustcorp.com.au>
Tue, 25 Oct 2011 00:51:37 +0000 (11:21 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Tue, 25 Oct 2011 00:51:37 +0000 (11:21 +1030)
Add new API for twiddling talloc features.  Make it fail on unknown features
for future compatibility.

The only feature is TALLOC_FLAG_WARN_MAY_REFERENCE, which gets serious with
warning about using talloc_may_reference().

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
lib/talloc/talloc.c
lib/talloc/talloc.h
lib/talloc/wscript

index 41684dfee18c360c5aaf3b7040b1ad2b306992b2..5756a5e51f558b3b74958a526b6c64f3e67e2dbc 100644 (file)
 */
 static void *null_context;
 static void *autofree_context;
+static unsigned int flags;
 
 /* used to enable fill of memory on free, which can be useful for
  * catching use after free errors when valgrind is too slow
@@ -285,6 +286,24 @@ _PUBLIC_ void talloc_set_log_fn(void (*log_fn)(const char *message))
        talloc_log_fn = log_fn;
 }
 
+int talloc_set_flag(unsigned int flag)
+{
+       if (flag != TALLOC_FLAG_WARN_MAY_REFERENCE) {
+               return -1;
+       }
+       flags |= flag;
+       return 0;
+}
+
+int talloc_unset_flag(unsigned int flag)
+{
+       if (flag != TALLOC_FLAG_WARN_MAY_REFERENCE) {
+               return -1;
+       }
+       flags |= ~flag;
+       return 0;
+}
+
 static void talloc_log(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2);
 static void talloc_log(const char *fmt, ...)
 {
@@ -711,6 +730,10 @@ _PUBLIC_ void *_talloc_reference_loc(const void *context, const void *ptr, const
        if (unlikely(ptr == NULL)) return NULL;
 
        tc = talloc_chunk_from_ptr(ptr);
+       if ((flags & TALLOC_FLAG_WARN_MAY_REFERENCE) && !(tc->flags & TALLOC_FLAG_MAY_REF)) {
+               talloc_log("talloc_reference on non-may_reference pointer at %s)", location);
+       }
+
        handle = (struct talloc_reference_handle *)_talloc_named_const(context,
                                                   sizeof(struct talloc_reference_handle),
                                                   TALLOC_MAGIC_REFERENCE);
index cedc8d50f02fe94bc3703ea6a1067a3910c26a01..956dd4cdd860b177ddcbb2b6aa19671e5da37e86 100644 (file)
@@ -955,7 +955,7 @@ void *_talloc_reference_loc(const void *context, const void *ptr, const char *lo
  *     talloc_may_reference(a);
  * @endcode
  *
- * @see talloc_reference()
+ * @see talloc_reference(), talloc_set_flag()
  */
 void *talloc_may_reference(const void *ptr);
 
@@ -1711,6 +1711,26 @@ void talloc_enable_leak_report(void);
  */
 void talloc_enable_leak_report_full(void);
 
+#define TALLOC_FLAG_WARN_MAY_REFERENCE 0x1
+/**
+ * @brief Set a global flag which alters talloc's behavior.
+ *
+ * 0 is returned if the flag is known, -1 otherwise.
+ *
+ * Flag is one of the following:
+ * TALLOC_FLAG_WARN_MAY_REFERENCE:
+ *     Warn if talloc_reference() is called on a pointer without talloc_may_reference()
+ *     being called first.
+ */
+int talloc_set_flag(unsigned int flag);
+
+/**
+ * @brief Remove a global flag which alters talloc's behavior.
+ *
+ * 0 is returned if the flag is known, -1 otherwise.
+ */
+int talloc_unset_flag(unsigned int flag);
+
 /* @} ******************************************************************/
 
 void talloc_set_abort_fn(void (*abort_fn)(const char *reason));
index 44e7f2b224d855d3e442d83ad61e93ac6cf53cc1..f9acb7b38421be172cc703b2d163cb0fe8b3108f 100644 (file)
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 APPNAME = 'talloc'
-VERSION = '2.1.0'
+VERSION = '2.1.1'
 
 
 blddir = 'bin'