From: Brian Norris <banorris@uci.edu>
Date: Thu, 5 Apr 2012 02:35:41 +0000 (-0700)
Subject: malloc: add myMalloc() and myFree()
X-Git-Tag: pldi2013~569
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=1064d480bed6b57e551f3c9ffe6a6d8f29ebe92e;p=model-checker.git

malloc: add myMalloc() and myFree()
---

diff --git a/Makefile b/Makefile
index 9e50d84..327bbb5 100644
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,8 @@
 CC=g++
 BIN=libthreads
-SOURCE=libthreads.cc schedule.cc libatomic.cc userprog.c model.cc
+SOURCE=libthreads.cc schedule.cc libatomic.cc userprog.c model.cc malloc.c
 HEADERS=libthreads.h schedule.h common.h libatomic.h model.h
-FLAGS=-Wall
+FLAGS=-Wall -ldl
 
 all: ${BIN}
 
diff --git a/common.h b/common.h
index 19409c8..f262720 100644
--- a/common.h
+++ b/common.h
@@ -13,4 +13,7 @@
 #define DBG()
 #endif
 
+void *myMalloc(size_t size);
+void myFree(void *ptr);
+
 #endif /* __COMMON_H__ */
diff --git a/malloc.c b/malloc.c
new file mode 100644
index 0000000..196be43
--- /dev/null
+++ b/malloc.c
@@ -0,0 +1,38 @@
+#include "common.h"
+
+/* for RTLD_NEXT */
+#ifndef __USE_GNU
+#define __USE_GNU
+#endif
+
+#include <dlfcn.h>
+
+static void * (*real_malloc)(size_t) = NULL;
+static void (*real_free)(void *ptr) = NULL;
+
+static void __my_alloc_init(void)
+{
+
+	real_malloc = (void *(*)(size_t))dlsym(RTLD_NEXT, "malloc");
+	real_free = (void (*)(void *))dlsym(RTLD_NEXT, "free");
+	if (real_malloc == NULL || real_free == NULL) {
+		fprintf(stderr, "Error in `dlsym`: %s\n", dlerror());
+		return;
+	}
+}
+
+void *myMalloc(size_t size)
+{
+	if (real_malloc == NULL)
+		__my_alloc_init();
+
+	return real_malloc(size);
+}
+
+void myFree(void *ptr)
+{
+	if (real_free == NULL)
+		__my_alloc_init();
+
+	real_free(ptr);
+}