#endif
extern void initStablePtrTable ( void );
+extern void exitStablePtrTable ( void );
extern void enlargeStablePtrTable ( void );
extern StgWord lookupStableName ( StgPtr p );
extern void gcStablePtrTable ( void );
extern void updateStablePtrTable ( rtsBool full );
+extern void exitHashTable ( void );
+
#endif
static HashList *freeList = NULL;
+static struct chunkList {
+ void *chunk;
+ struct chunkList *next;
+} *chunks;
+
static HashList *
allocHashList(void)
{
HashList *hl, *p;
+ struct chunkList *cl;
if ((hl = freeList) != NULL) {
freeList = hl->next;
} else {
hl = stgMallocBytes(HCHUNK * sizeof(HashList), "allocHashList");
+ cl = stgMallocBytes(sizeof (*cl), "allocHashList: chunkList");
+ cl->chunk = hl;
+ cl->next = chunks;
+ chunks = cl;
freeList = hl + 1;
for (p = freeList; p < hl + HCHUNK - 1; p++)
return allocHashTable_((HashFunction *)hashStr,
(CompareFunction *)compareStr);
}
+
+void
+exitHashTable(void)
+{
+ struct chunkList *cl;
+
+ while ((cl = chunks) != NULL) {
+ chunks = cl->next;
+ stgFree(cl->chunk);
+ stgFree(cl);
+ }
+}
// also outputs the stats (+RTS -s) info.
exitStorage();
+ /* initialise the stable pointer table */
+ exitStablePtrTable();
+
+ /* free hash table storage */
+ exitHashTable();
+
#ifdef RTS_GTK_FRONTPANEL
if (RtsFlags.GcFlags.frontpanel) {
stopFrontPanel();
#endif
}
+void
+exitStablePtrTable(void)
+{
+ if (addrToStableHash)
+ freeHashTable(addrToStableHash, NULL);
+ addrToStableHash = NULL;
+ if (stable_ptr_table)
+ stgFree(stable_ptr_table);
+ stable_ptr_table = NULL;
+ SPT_size = 0;
+}
+
/*
* get at the real stuff...remove indirections.
*
statsFlush();
statsClose();
}
+ if (GC_coll_times)
+ stgFree(GC_coll_times);
+ GC_coll_times = NULL;
}
/* -----------------------------------------------------------------------------
void
freeStorage (void)
{
+ nat g;
+
+ for(g = 0; g < RtsFlags.GcFlags.generations; g++)
+ stgFree(generations[g].steps);
+ stgFree(generations);
freeAllMBlocks();
}
void
stopTaskManager (void)
{
+ Task *task, *next;
+
debugTrace(DEBUG_sched,
"stopping task manager, %d tasks still running",
tasksRunning);
+
+ ACQUIRE_LOCK(&sched_mutex);
+ for (task = task_free_list; task != NULL; next) {
+ next = task->next;
+ stgFree(task);
+ }
+ task_free_list = NULL;
+ RELEASE_LOCK(&sched_mutex);
}