more documentation
[cdsspec-compiler.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 /** Non-snapshotting malloc for our use. */
11
12 void *MYMALLOC(size_t size) {
13 #if USE_MPROTECT_SNAPSHOT
14         static void *(*mallocp)(size_t size);
15         char *error;
16         void *ptr;
17   
18         /* get address of libc malloc */
19         if (!mallocp) {
20                 mallocp = ( void * ( * )( size_t ) )dlsym(RTLD_NEXT, "malloc");
21                 if ((error = dlerror()) != NULL) {
22                         fputs(error, stderr);
23                         exit(EXIT_FAILURE);
24                 }
25         }
26         ptr = mallocp(size);     
27         return ptr;
28 #else
29         if( !sTheRecord ){
30                 createSharedLibrary();
31         }
32         if( NULL == sStaticSpace )
33                 sStaticSpace = create_mspace_with_base( ( void * )( sTheRecord->mSharedMemoryBase ), SHARED_MEMORY_DEFAULT -sizeof( struct Snapshot_t ), 1 );
34         return mspace_malloc( sStaticSpace, size );
35 #endif
36 }
37
38 void *system_malloc( size_t size ){
39         static void *(*mallocp)(size_t size);
40         char *error;
41         void *ptr;
42
43         /* get address of libc malloc */
44         if (!mallocp) {
45                 mallocp = ( void * ( * )( size_t ) )dlsym(RTLD_NEXT, "malloc");
46                 if ((error = dlerror()) != NULL) {
47                         fputs(error, stderr);
48                         exit(EXIT_FAILURE);
49                 }
50         }
51         ptr = mallocp(size);
52         return ptr;
53 }
54
55 void system_free( void * ptr ){
56         static void (*freep)(void *);
57         char *error;
58
59         /* get address of libc free */
60         if (!freep) {
61                 freep = ( void  ( * )( void * ) )dlsym(RTLD_NEXT, "free");
62                 if ((error = dlerror()) != NULL) {
63                         fputs(error, stderr);
64                         exit(EXIT_FAILURE);
65                 }
66         }
67         freep(ptr);
68 }
69
70 /** Non-snapshotting free for our use. */
71 void MYFREE(void *ptr) {
72 #if USE_MPROTECT_SNAPSHOT
73         static void (*freep)(void *);
74         char *error;
75
76         /* get address of libc free */
77         if (!freep) {
78                 freep = ( void  ( * )( void * ) )dlsym(RTLD_NEXT, "free");
79                 if ((error = dlerror()) != NULL) {
80                         fputs(error, stderr);
81                         exit(EXIT_FAILURE);
82                 }
83         }
84         freep(ptr);
85 #else
86         mspace_free( sStaticSpace, ptr );
87 #endif
88 }
89
90
91 /** This global references the mspace for the snapshotting heap */
92 mspace mySpace = NULL;
93
94 /** This global references the unaligned memory address that was malloced for the snapshotting heap */
95 void * basemySpace = NULL;
96
97 //Subramanian --- please make these work for the fork based approach
98
99 /** Snapshotting malloc implementation for user programs. */
100
101 void *malloc( size_t size ) {
102         return mspace_malloc( mySpace, size );
103 }
104
105 /** Snapshotting free implementation for user programs. */
106
107 void free( void * ptr ){
108         mspace_free( mySpace, ptr );
109 }
110
111 /** Snapshotting realloc implementation for user programs. */
112
113 void *realloc( void *ptr, size_t size ){
114         return mspace_realloc( mySpace, ptr, size );
115 }
116
117 /** Snapshotting new operator for user programs. */
118
119 void * operator new(size_t size) throw(std::bad_alloc) {
120         return malloc(size);
121 }
122
123 /** Snapshotting delete operator for user programs. */
124
125 void operator delete(void *p) throw() {
126         free(p);
127 }
128
129 /** Snapshotting new[] operator for user programs. */
130
131 void * operator new[](size_t size) throw(std::bad_alloc) {
132         return malloc(size);
133 }
134
135 /** Snapshotting delete[] operator for user programs. */
136
137 void operator delete[](void *p, size_t size) {
138         free(p);
139 }