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