7 memuse_list_t *heapusage = NULL;
8 memuse_list_t *stackusage = NULL;
9 funcenum_t *firstenum = NULL;
10 funcenum_t *lastenum = NULL;
19 functag_t *tag, *nexttag;
36 funcenum_t *funcenums_find_byval(int value)
38 funcenum_t *e = firstenum;
42 if (e->value == value)
52 funcenum_t *funcenums_add(const char *name)
54 funcenum_t *e = (funcenum_t *)malloc(sizeof(funcenum_t));
56 memset(e, 0, sizeof(funcenum_t));
58 if (firstenum == NULL)
67 strcpy(e->name, name);
68 e->value = pc_addfunctag((char *)name);
73 functag_t *functags_add(funcenum_t *en, functag_t *src)
75 functag_t *t = (functag_t *)malloc(sizeof(functag_t));
77 memcpy(t, src, sizeof(functag_t));
81 if (en->first == NULL)
94 * Creates a new mem usage tracker entry
96 void _push_memlist(memuse_list_t **head)
98 memuse_list_t *newlist = (memuse_list_t *)malloc(sizeof(memuse_list_t));
101 newlist->list_id = (*head)->list_id + 1;
103 newlist->list_id = 0;
105 newlist->prev = *head;
106 newlist->head = NULL;
111 * Pops a heap list but does not free it.
113 memuse_list_t *_pop_save_memlist(memuse_list_t **head)
115 memuse_list_t *oldlist = *head;
116 *head = (*head)->prev;
121 * Marks a memory usage on a memory list
123 int _mark_memlist(memuse_list_t *head, int type, int size)
126 if (type==MEMUSE_STATIC && size==0)
131 if (use && (type==MEMUSE_STATIC)
132 && (use->type == type))
136 use=(memuse_t *)malloc(sizeof(memuse_t));
139 use->prev=head->head;
145 void _reset_memlist(memuse_list_t **head)
147 memuse_list_t *curlist = *head;
148 memuse_list_t *tmplist;
150 memuse_t *curuse = curlist->head;
153 tmpuse = curuse->prev;
157 tmplist = curlist->prev;
166 * Wrapper for pushing the heap list
170 _push_memlist(&heapusage);
174 * Wrapper for popping and saving the heap list
176 memuse_list_t *popsaveheaplist()
178 return _pop_save_memlist(&heapusage);
182 * Wrapper for marking the heap
184 int markheap(int type, int size)
186 return _mark_memlist(heapusage, type, size);
190 * Wrapper for pushing the stack list
194 _push_memlist(&stackusage);
198 * Wrapper for marking the stack
200 int markstack(int type, int size)
202 return _mark_memlist(stackusage, type, size);
206 * Generates code to free all heap allocations on a tracker
208 void _heap_freeusage(memuse_list_t *heap, int dofree)
210 memuse_t *cur=heap->head;
214 if (cur->type == MEMUSE_STATIC)
216 modheap((-1)*cur->size*sizeof(cell));
235 void _stack_genusage(memuse_list_t *stack, int dofree)
237 memuse_t *cur = stack->head;
241 if (cur->type == MEMUSE_DYNAMIC)
246 modstk(cur->size * sizeof(cell));
264 * Pops a heap list and frees it.
268 memuse_list_t *oldlist;
269 assert(heapusage!=NULL);
271 _heap_freeusage(heapusage, 1);
272 assert(heapusage->head==NULL);
274 oldlist=heapusage->prev;
279 void genstackfree(int stop_id)
281 memuse_list_t *curlist = stackusage;
282 while (curlist && curlist->list_id > stop_id)
284 _stack_genusage(curlist, 0);
285 curlist = curlist->prev;
289 void genheapfree(int stop_id)
291 memuse_list_t *curlist = heapusage;
292 while (curlist && curlist->list_id > stop_id)
294 _heap_freeusage(curlist, 0);
295 curlist = curlist->prev;
301 memuse_list_t *oldlist;
302 assert(stackusage != NULL);
304 _stack_genusage(stackusage, 1);
305 assert(stackusage->head==NULL);
307 oldlist = stackusage->prev;
309 stackusage = oldlist;
312 void resetstacklist()
314 _reset_memlist(&stackusage);
319 _reset_memlist(&heapusage);