Fix: malloc wrapper: infinite recursion with compat TLS
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 18 Mar 2014 14:27:03 +0000 (10:27 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 18 Mar 2014 14:27:03 +0000 (10:27 -0400)
Fixes #765

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
liblttng-ust-libc-wrapper/lttng-ust-malloc.c

index 06e0efe8679a4a24d635715f01e1130eb0d1ea20..54afb1445785381aefeeb658ce3ba30ae573420d 100644 (file)
@@ -26,6 +26,7 @@
 #include <urcu/uatomic.h>
 #include <urcu/compiler.h>
 #include <urcu/tls-compat.h>
+#include <urcu/arch.h>
 #include <lttng/align.h>
 
 #define TRACEPOINT_DEFINE
@@ -56,8 +57,40 @@ struct alloc_functions cur_alloc;
 static
 void *static_calloc(size_t nmemb, size_t size);
 
+/*
+ * pthread mutex replacement for URCU tls compat layer.
+ */
+static int ust_malloc_lock;
+
+static __attribute__((unused))
+void ust_malloc_spin_lock(pthread_mutex_t *lock)
+{
+       /*
+        * The memory barrier within cmpxchg takes care of ordering
+        * memory accesses with respect to the start of the critical
+        * section.
+        */
+       while (uatomic_cmpxchg(&ust_malloc_lock, 0, 1) != 0)
+               caa_cpu_relax();
+}
+
+static __attribute__((unused))
+void ust_malloc_spin_unlock(pthread_mutex_t *lock)
+{
+       /*
+        * Ensure memory accesses within the critical section do not
+        * leak outside.
+        */
+       cmm_smp_mb();
+       uatomic_set(&ust_malloc_lock, 0);
+}
+
 #define calloc static_calloc
+#define pthread_mutex_lock ust_malloc_spin_lock
+#define pthread_mutex_unlock ust_malloc_spin_unlock
 static DEFINE_URCU_TLS(int, malloc_nesting);
+#undef ust_malloc_spin_unlock
+#undef ust_malloc_spin_lock
 #undef calloc
 
 /*
This page took 0.025391 seconds and 4 git commands to generate.