/// //Frees all components of a GObject // //Parameters: // GO: The GObject to free void GObject_Free(GObject* GO) { //Free frame of reference FrameOfReference_Free(GO->frameOfReference); //Free all (if any) states LinkedList_Node* current = GO->states->head; LinkedList_Node* next = NULL; State* currentState = NULL; while(current != NULL) { next = current->next; currentState = (State*)current->data; //Free the state //which frees the members State_Free(currentState); current = next; } //Free list of states LinkedList_Free(GO->states); //Free other components if gameobject has them //One mesh might be shared by many objects, so we probably should leave //The deletion of these to the AssetManager //if(GO->mesh != NULL) //Mesh_Free(GO->mesh); //if(GO->texture != NULL) //Texture_Free(GO->texture); if(GO->body != NULL) { RigidBody_Free(GO->body); } if(GO->collider != NULL) { Collider_Free(GO->collider); } memset(GO, 0, sizeof(GObject)); //Free the gameObject free(GO); }
void SoundDecoder_Quit() { size_t i; if(0 == s_isInitialized) { return; } /* * SDL_sound actually embeds the linked list in the internal data structure. * So any sample can potentially reach any other sample. * But I'm keeping my own separate list. */ while(LinkedList_Size(s_listOfLoadedSamples) > 0) { SoundDecoder_Sample* sound_sample = (SoundDecoder_Sample*)LinkedList_PopBack(s_listOfLoadedSamples); SoundDecoder_FreeSample(sound_sample); } LinkedList_Free(s_listOfLoadedSamples); s_listOfLoadedSamples = NULL; for(i = 0; s_linkedDecoders[i].funcs != NULL; i++) { if (s_linkedDecoders[i].available) { s_linkedDecoders[i].funcs->quit(); s_linkedDecoders[i].available = 0; } } if(NULL != s_availableDecoders) { free(s_availableDecoders); } s_availableDecoders = NULL; /* Remember: ALmixer_SetError/GetError calls will not work while this is gone. */ TError_FreeErrorPool(s_errorPool); s_errorPool = NULL; s_isInitialized = 0; }
static UINT smartcard_free_(SMARTCARD_DEVICE* smartcard) { if (!smartcard) return CHANNEL_RC_OK; if (smartcard->IrpQueue) { MessageQueue_Free(smartcard->IrpQueue); CloseHandle(smartcard->thread); } Stream_Free(smartcard->device.data, TRUE); LinkedList_Free(smartcard->names); ListDictionary_Free(smartcard->rgSCardContextList); ListDictionary_Free(smartcard->rgOutstandingMessages); Queue_Free(smartcard->CompletedIrpQueue); if (smartcard->StartedEvent) SCardReleaseStartedEvent(); free(smartcard); return CHANNEL_RC_OK; }
int TestLinkedList(int argc, char* argv[]) { int count; int number; wLinkedList* list; list = LinkedList_New(); LinkedList_AddFirst(list, (void*) (size_t) 1); LinkedList_AddLast(list, (void*) (size_t) 2); LinkedList_AddLast(list, (void*) (size_t) 3); count = LinkedList_Count(list); if (count != 3) { printf("LinkedList_Count: expected %d, actual: %d\n", 3, count); return -1; } LinkedList_Enumerator_Reset(list); while (LinkedList_Enumerator_MoveNext(list)) { number = (int) (size_t) LinkedList_Enumerator_Current(list); printf("\t%d\n", number); } printf("\n"); printf("LinkedList First: %d Last: %d\n", (int) (size_t) LinkedList_First(list), (int) (size_t) LinkedList_Last(list)); LinkedList_RemoveFirst(list); LinkedList_RemoveLast(list); count = LinkedList_Count(list); if (count != 1) { printf("LinkedList_Count: expected %d, actual: %d\n", 1, count); return -1; } LinkedList_Enumerator_Reset(list); while (LinkedList_Enumerator_MoveNext(list)) { number = (int) (size_t) LinkedList_Enumerator_Current(list); printf("\t%d\n", number); } printf("\n"); printf("LinkedList First: %d Last: %d\n", (int) (size_t) LinkedList_First(list), (int) (size_t) LinkedList_Last(list)); LinkedList_RemoveFirst(list); LinkedList_RemoveLast(list); count = LinkedList_Count(list); if (count != 0) { printf("LinkedList_Count: expected %d, actual: %d\n", 0, count); return -1; } LinkedList_AddFirst(list, (void*) (size_t) 4); LinkedList_AddLast(list, (void*) (size_t) 5); LinkedList_AddLast(list, (void*) (size_t) 6); count = LinkedList_Count(list); if (count != 3) { printf("LinkedList_Count: expected %d, actual: %d\n", 3, count); return -1; } LinkedList_Enumerator_Reset(list); while (LinkedList_Enumerator_MoveNext(list)) { number = (int) (size_t) LinkedList_Enumerator_Current(list); printf("\t%d\n", number); } printf("\n"); printf("LinkedList First: %d Last: %d\n", (int) (size_t) LinkedList_First(list), (int) (size_t) LinkedList_Last(list)); LinkedList_Remove(list, (void*) (size_t) 5); LinkedList_Enumerator_Reset(list); while (LinkedList_Enumerator_MoveNext(list)) { number = (int) (size_t) LinkedList_Enumerator_Current(list); printf("\t%d\n", number); } printf("\n"); printf("LinkedList First: %d Last: %d\n", (int) (size_t) LinkedList_First(list), (int) (size_t) LinkedList_Last(list)); LinkedList_Free(list); /* Test enumerator robustness */ /* enumerator on an empty list */ list = LinkedList_New(); LinkedList_Enumerator_Reset(list); while (LinkedList_Enumerator_MoveNext(list)) { number = (int) (size_t) LinkedList_Enumerator_Current(list); printf("\t%d\n", number); } printf("\n"); LinkedList_Free(list); /* Use an enumerator without reset */ list = LinkedList_New(); LinkedList_AddFirst(list, (void*) (size_t) 4); LinkedList_AddLast(list, (void*) (size_t) 5); LinkedList_AddLast(list, (void*) (size_t) 6); while (LinkedList_Enumerator_MoveNext(list)) { number = (int) (size_t) LinkedList_Enumerator_Current(list); printf("\t%d\n", number); } printf("\n"); LinkedList_Free(list); return 0; }