Adding fixes for the fork based implementation, also removed some redundant code...
[model-checker.git] / mymemory.cc
1 #include "mymemory.h"
2 #include "snapshot.h"
3 #include "snapshotimp.h"
4 #include <stdio.h>
5 #include <dlfcn.h>
6 #if !USE_MPROTECT_SNAPSHOT
7 static mspace sStaticSpace = NULL;
8 #endif
9
10 void *MYMALLOC(size_t size) {
11 #if USE_MPROTECT_SNAPSHOT
12         static void *(*mallocp)(size_t size);
13         char *error;
14         void *ptr;
15   
16         /* get address of libc malloc */
17         if (!mallocp) {
18                 mallocp = ( void * ( * )( size_t ) )dlsym(RTLD_NEXT, "malloc");
19                 if ((error = dlerror()) != NULL) {
20                         fputs(error, stderr);
21                         exit(1);
22                 }
23         }
24         ptr = mallocp(size);     
25         return ptr;
26 #else
27         if( !sTheRecord ){
28                 createSharedLibrary();
29         }
30         if( NULL == sStaticSpace )
31                 sStaticSpace = create_mspace_with_base( ( void * )( sTheRecord->mSharedMemoryBase ), SHARED_MEMORY_DEFAULT -sizeof( struct Snapshot_t ), 1 );
32         return mspace_malloc( sStaticSpace, size );
33 #endif
34 }
35
36 void *system_malloc( size_t size ){
37         static void *(*mallocp)(size_t size);
38         char *error;
39         void *ptr;
40
41         /* get address of libc malloc */
42         if (!mallocp) {
43                 mallocp = ( void * ( * )( size_t ) )dlsym(RTLD_NEXT, "malloc");
44                 if ((error = dlerror()) != NULL) {
45                         fputs(error, stderr);
46                         exit(1);
47                 }
48         }
49         ptr = mallocp(size);
50         return ptr;
51 }
52
53 void system_free( void * ptr ){
54         static void (*freep)(void *);
55         char *error;
56
57         /* get address of libc free */
58         if (!freep) {
59                 freep = ( void  ( * )( void * ) )dlsym(RTLD_NEXT, "free");
60                 if ((error = dlerror()) != NULL) {
61                         fputs(error, stderr);
62                         exit(1);
63                 }
64         }
65         freep(ptr);
66 }
67 void MYFREE(void *ptr) {
68 #if USE_MPROTECT_SNAPSHOT
69         static void (*freep)(void *);
70         char *error;
71
72         /* get address of libc free */
73         if (!freep) {
74                 freep = ( void  ( * )( void * ) )dlsym(RTLD_NEXT, "free");
75                 if ((error = dlerror()) != NULL) {
76                         fputs(error, stderr);
77                         exit(1);
78                 }
79         }
80         freep(ptr);
81 #else
82         mspace_free( sStaticSpace, ptr );
83 #endif
84 }
85 mspace mySpace = NULL;
86 void * basemySpace = NULL;
87
88 void *malloc( size_t size ) {
89         return mspace_malloc( mySpace, size );
90 }
91
92 void free( void * ptr ){
93         mspace_free( mySpace, ptr );
94 }
95
96 void *realloc( void *ptr, size_t size ){
97         return mspace_realloc( mySpace, ptr, size );
98 }
99
100 void * operator new(size_t size) throw(std::bad_alloc) {
101         return malloc(size);
102 }
103
104 void operator delete(void *p) throw() {
105         free(p);
106 }
107
108 void * operator new[](size_t size) throw(std::bad_alloc) {
109         return malloc(size);
110 }
111
112 void operator delete[](void *p, size_t size) {
113         free(p);
114 }