]> Shamusworld >> Repos - virtualjaguar/blob - src/memory.cpp
Initial revision
[virtualjaguar] / src / memory.cpp
1 //////////////////////////////////////////////////////////////////////////////
2 //
3 //////////////////////////////////////////////////////////////////////////////
4 //
5 //
6 //
7 //
8 //
9 //
10 //////////////////////////////////////////////////////////////////////////////
11
12 #include "include/memory.h"
13
14 typedef struct sMemBlockInfo
15 {
16     void                    *ptr;
17     char                    *info;
18     UINT32                  size;
19     struct  sMemBlockInfo   *next;
20     struct  sMemBlockInfo   *prev;
21 } sMemBlockInfo;
22
23 sMemBlockInfo   memoryInfo;
24 UINT32          memoryMaxAllocated;
25 UINT32          currentAllocatedMemory;
26 UINT32          maximumAllocatedMemory;
27
28 //////////////////////////////////////////////////////////////////////////////
29 //
30 //////////////////////////////////////////////////////////////////////////////
31 //
32 //
33 //
34 //
35 //
36 //
37 //////////////////////////////////////////////////////////////////////////////
38 void memory_addMemInfo(void *ptr, UINT32 size, char *info)
39 {
40     sMemBlockInfo   *alias;
41
42     alias=&memoryInfo;
43     while (alias->next) alias=alias->next;
44     alias->next=(sMemBlockInfo*)malloc(sizeof(sMemBlockInfo));
45     if (alias->next==NULL)
46     {
47                 exit(0);
48         return;
49     }
50     alias->next->prev=alias;
51     alias=alias->next;
52     alias->next=NULL;
53     alias->size=size;
54     alias->ptr=ptr;
55     alias->info=info;
56 }
57 //////////////////////////////////////////////////////////////////////////////
58 //
59 //////////////////////////////////////////////////////////////////////////////
60 //
61 //
62 //
63 //
64 //
65 //
66 //////////////////////////////////////////////////////////////////////////////
67 void memory_init(void)
68 {
69     memoryInfo.next=NULL;
70     memoryInfo.prev=NULL;
71     currentAllocatedMemory=0;
72     maximumAllocatedMemory=0;
73 }
74 //////////////////////////////////////////////////////////////////////////////
75 //
76 //////////////////////////////////////////////////////////////////////////////
77 //
78 //
79 //
80 //
81 //
82 //
83 //////////////////////////////////////////////////////////////////////////////
84 void *memory_malloc(UINT32 size, char *info)
85 {
86     void *ptr;
87
88     ptr=(void*)malloc(size);
89     if (ptr==NULL)
90     {
91         return(NULL);
92     }
93     memory_addMemInfo(ptr,size,info);
94     currentAllocatedMemory+=size;
95     if (currentAllocatedMemory>maximumAllocatedMemory)
96         maximumAllocatedMemory=currentAllocatedMemory;
97     return(ptr);
98 }
99 //////////////////////////////////////////////////////////////////////////////
100 //
101 //////////////////////////////////////////////////////////////////////////////
102 //
103 //
104 //
105 //
106 //
107 //
108 //////////////////////////////////////////////////////////////////////////////
109 void memory_malloc_secure(void **new_ptr, UINT32 size, char *info)
110 {
111     void *ptr;
112
113     fprintf(log_get(),"memory: allocating %i bytes of memory for <%s>...",size,(info==NULL)?"unknown":info);
114     ptr=(void*)malloc(size);
115     if (ptr==NULL)
116     {
117                 fprintf(log_get(),"failed\n");
118                 log_done();
119                 exit(0);
120     }
121     memory_addMemInfo(ptr,size,info);
122     currentAllocatedMemory+=size;
123     if (currentAllocatedMemory>maximumAllocatedMemory)
124         maximumAllocatedMemory=currentAllocatedMemory;
125     *new_ptr=ptr;
126         fprintf(log_get(),"ok\n");
127 }
128 //////////////////////////////////////////////////////////////////////////////
129 //
130 //////////////////////////////////////////////////////////////////////////////
131 //
132 //
133 //
134 //////////////////////////////////////////////////////////////////////////////
135 void memory_memoryUsage(FILE *fp)
136 {
137     sMemBlockInfo   *alias;
138     UINT32 total=0;
139
140     fprintf(fp,"Memory usage:\n");
141     alias=&memoryInfo;
142     alias=alias->next;
143     while (alias)
144     {
145         fprintf(fp,"\t%16i bytes : <%s> (@ 0x%.8x)\n",alias->size,alias->info,alias->ptr);
146         total+=alias->size;
147         alias=alias->next;
148     }
149     fprintf(fp,"\n\t%16i bytes total(%i Mb)\n",total,(total>>20));
150     fprintf(fp,"\n\t%16i bytes memory peak(%i Mb)\n",maximumAllocatedMemory,maximumAllocatedMemory>>20);
151 }
152
153 //////////////////////////////////////////////////////////////////////////////
154 //
155 //////////////////////////////////////////////////////////////////////////////
156 //
157 //
158 //
159 //////////////////////////////////////////////////////////////////////////////
160 void memory_done(void)
161 {
162 }
163 //////////////////////////////////////////////////////////////////////////////
164 //
165 //////////////////////////////////////////////////////////////////////////////
166 //
167 //
168 //
169 //////////////////////////////////////////////////////////////////////////////
170 void memory_free(void *ptr)
171 {
172     sMemBlockInfo   *alias;
173
174     alias=&memoryInfo;
175     alias=alias->next;
176     while (alias->ptr!=ptr)
177         alias=alias->next;
178     free(ptr);
179     currentAllocatedMemory-=alias->size;
180     alias->prev->next=alias->next;
181     if (alias->next!=NULL)
182         alias->next->prev=alias->prev;
183     free(alias);
184 }