static int expandoSPUCleanup(void) { crFreeHashtable(expando_spu.contextTable, expando_free_context_state); crStateDestroy(); return 1; }
static void crServerTearDown( void ) { GLint i; CRClientNode *pNode, *pNext; /* avoid a race condition */ if (tearingdown) return; tearingdown = 1; crStateSetCurrent( NULL ); cr_server.curClient = NULL; cr_server.run_queue = NULL; crFree( cr_server.overlap_intens ); cr_server.overlap_intens = NULL; /* Deallocate all semaphores */ crFreeHashtable(cr_server.semaphores, crFree); cr_server.semaphores = NULL; /* Deallocate all barriers */ crFreeHashtable(cr_server.barriers, DeleteBarrierCallback); cr_server.barriers = NULL; /* Free all context info */ crFreeHashtable(cr_server.contextTable, deleteContextCallback); /* Free context/window creation info */ crFreeHashtable(cr_server.pContextCreateInfoTable, crServerCreateInfoDeleteCB); crFreeHashtable(cr_server.pWindowCreateInfoTable, crServerCreateInfoDeleteCB); /* Free vertex programs */ crFreeHashtable(cr_server.programTable, crFree); for (i = 0; i < cr_server.numClients; i++) { if (cr_server.clients[i]) { CRConnection *conn = cr_server.clients[i]->conn; crNetFreeConnection(conn); crFree(cr_server.clients[i]); } } cr_server.numClients = 0; pNode = cr_server.pCleanupClient; while (pNode) { pNext=pNode->next; crFree(pNode->pClient); crFree(pNode); pNode=pNext; } cr_server.pCleanupClient = NULL; #if 1 /* disable these two lines if trying to get stack traces with valgrind */ crSPUUnloadChain(cr_server.head_spu); cr_server.head_spu = NULL; #endif crStateDestroy(); crNetTearDown(); }