From d31dca5520820c2568afda38d593a96934e1bfb0 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 5 Apr 2019 03:56:10 -0700 Subject: [PATCH] Free objects in their destructors; --- src/audio/microphone.c | 1 + src/audio/source.c | 1 + src/data/audioStream.c | 1 + src/data/blob.c | 1 + src/data/modelData.c | 1 + src/data/rasterizer.c | 1 + src/filesystem/file.c | 1 + src/graphics/animator.c | 1 + src/graphics/font.c | 1 + src/graphics/material.c | 1 + src/graphics/model.c | 1 + src/graphics/opengl.c | 5 +++++ src/graphics/shader.c | 1 + src/headset/headset.c | 2 +- src/math/curve.c | 1 + src/math/pool.c | 1 + src/math/randomGenerator.c | 2 +- src/physics/physics.c | 4 ++++ src/thread/channel.c | 1 + src/thread/thread.c | 1 + src/util.h | 4 ++-- 21 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/audio/microphone.c b/src/audio/microphone.c index a4e8c185..7ae8d17d 100644 --- a/src/audio/microphone.c +++ b/src/audio/microphone.c @@ -16,6 +16,7 @@ void lovrMicrophoneDestroy(void* ref) { Microphone* microphone = ref; lovrMicrophoneStopRecording(microphone); alcCaptureCloseDevice(microphone->device); + free(microphone); } int lovrMicrophoneGetBitDepth(Microphone* microphone) { diff --git a/src/audio/source.c b/src/audio/source.c index 63e55ac8..45dda0bf 100644 --- a/src/audio/source.c +++ b/src/audio/source.c @@ -37,6 +37,7 @@ void lovrSourceDestroy(void* ref) { alDeleteBuffers(source->type == SOURCE_STATIC ? 1 : SOURCE_BUFFERS, source->buffers); lovrRelease(SoundData, source->soundData); lovrRelease(AudioStream, source->stream); + free(source); } SourceType lovrSourceGetType(Source* source) { diff --git a/src/data/audioStream.c b/src/data/audioStream.c index 396cd7fd..dd0a8d31 100644 --- a/src/data/audioStream.c +++ b/src/data/audioStream.c @@ -28,6 +28,7 @@ void lovrAudioStreamDestroy(void* ref) { stb_vorbis_close(stream->decoder); lovrRelease(Blob, stream->blob); free(stream->buffer); + free(stream); } int lovrAudioStreamDecode(AudioStream* stream, short* destination, int size) { diff --git a/src/data/blob.c b/src/data/blob.c index d6485faa..c781782d 100644 --- a/src/data/blob.c +++ b/src/data/blob.c @@ -10,4 +10,5 @@ Blob* lovrBlobInit(Blob* blob, void* data, size_t size, const char* name) { void lovrBlobDestroy(void* ref) { Blob* blob = ref; free(blob->data); + free(blob); } diff --git a/src/data/modelData.c b/src/data/modelData.c index d5cde1f4..29627124 100644 --- a/src/data/modelData.c +++ b/src/data/modelData.c @@ -20,6 +20,7 @@ void lovrModelDataDestroy(void* ref) { lovrRelease(TextureData, model->textures[i]); } free(model->data); + free(model); } // Note: this code is a scary optimization diff --git a/src/data/rasterizer.c b/src/data/rasterizer.c index 5da2b936..d0e8945c 100644 --- a/src/data/rasterizer.c +++ b/src/data/rasterizer.c @@ -34,6 +34,7 @@ Rasterizer* lovrRasterizerInit(Rasterizer* rasterizer, Blob* blob, float size) { void lovrRasterizerDestroy(void* ref) { Rasterizer* rasterizer = ref; lovrRelease(Blob, rasterizer->blob); + free(rasterizer); } bool lovrRasterizerHasGlyph(Rasterizer* rasterizer, uint32_t character) { diff --git a/src/filesystem/file.c b/src/filesystem/file.c index 2cfa16c0..2da3a62e 100644 --- a/src/filesystem/file.c +++ b/src/filesystem/file.c @@ -12,6 +12,7 @@ void lovrFileDestroy(void* ref) { if (file->handle) { PHYSFS_close(file->handle); } + free(file); } int lovrFileOpen(File* file, FileMode mode) { diff --git a/src/graphics/animator.c b/src/graphics/animator.c index d3ba9287..e157de82 100644 --- a/src/graphics/animator.c +++ b/src/graphics/animator.c @@ -36,6 +36,7 @@ void lovrAnimatorDestroy(void* ref) { Animator* animator = ref; lovrRelease(ModelData, animator->data); vec_deinit(&animator->tracks); + free(animator); } void lovrAnimatorReset(Animator* animator) { diff --git a/src/graphics/font.c b/src/graphics/font.c index 40a14814..9463cc92 100644 --- a/src/graphics/font.c +++ b/src/graphics/font.c @@ -61,6 +61,7 @@ void lovrFontDestroy(void* ref) { } map_deinit(&font->atlas.glyphs); map_deinit(&font->kerning); + free(font); } Rasterizer* lovrFontGetRasterizer(Font* font) { diff --git a/src/graphics/material.c b/src/graphics/material.c index 6e909e62..5741b87f 100644 --- a/src/graphics/material.c +++ b/src/graphics/material.c @@ -27,6 +27,7 @@ void lovrMaterialDestroy(void* ref) { for (int i = 0; i < MAX_MATERIAL_TEXTURES; i++) { lovrRelease(Texture, material->textures[i]); } + free(material); } void lovrMaterialBind(Material* material, Shader* shader) { diff --git a/src/graphics/model.c b/src/graphics/model.c index 9f7d8c4c..24c969f8 100644 --- a/src/graphics/model.c +++ b/src/graphics/model.c @@ -193,6 +193,7 @@ void lovrModelDestroy(void* ref) { lovrRelease(Mesh, model->meshes[i]); } lovrRelease(ModelData, model->data); + free(model); } void lovrModelDraw(Model* model, mat4 transform, int instances) { diff --git a/src/graphics/opengl.c b/src/graphics/opengl.c index 01f65f24..1ebe3244 100644 --- a/src/graphics/opengl.c +++ b/src/graphics/opengl.c @@ -1241,6 +1241,7 @@ void lovrTextureDestroy(void* ref) { glDeleteTextures(1, &texture->id); glDeleteRenderbuffers(1, &texture->msaaId); lovrGpuDestroySyncResource(texture, texture->incoherent); + free(texture); } void lovrTextureAllocate(Texture* texture, int width, int height, int depth, TextureFormat format) { @@ -1485,6 +1486,7 @@ void lovrCanvasDestroy(void* ref) { lovrRelease(Texture, canvas->attachments[i].texture); } lovrRelease(Texture, canvas->depth.texture); + free(canvas); } void lovrCanvasResolve(Canvas* canvas) { @@ -1597,6 +1599,7 @@ void lovrBufferDestroy(void* ref) { #ifndef LOVR_WEBGL } #endif + free(buffer); } void* lovrBufferMap(Buffer* buffer, size_t offset) { @@ -1961,6 +1964,7 @@ void lovrShaderDestroy(void* ref) { map_deinit(&shader->attributes); map_deinit(&shader->uniformMap); map_deinit(&shader->blockMap); + free(shader); } // Mesh @@ -1987,6 +1991,7 @@ void lovrMeshDestroy(void* ref) { lovrRelease(Buffer, mesh->vertexBuffer); lovrRelease(Buffer, mesh->indexBuffer); lovrRelease(Material, mesh->material); + free(mesh); } void lovrMeshSetIndexBuffer(Mesh* mesh, Buffer* buffer, uint32_t indexCount, size_t indexSize, size_t offset) { diff --git a/src/graphics/shader.c b/src/graphics/shader.c index 89711108..e57b667b 100644 --- a/src/graphics/shader.c +++ b/src/graphics/shader.c @@ -198,6 +198,7 @@ void lovrShaderBlockDestroy(void* ref) { lovrRelease(Buffer, block->buffer); vec_deinit(&block->uniforms); map_deinit(&block->uniformMap); + free(block); } BlockType lovrShaderBlockGetType(ShaderBlock* block) { diff --git a/src/headset/headset.c b/src/headset/headset.c index 7fc0b03a..9665e859 100644 --- a/src/headset/headset.c +++ b/src/headset/headset.c @@ -51,5 +51,5 @@ void lovrHeadsetDestroy() { } void lovrControllerDestroy(void* ref) { - // + free(ref); } diff --git a/src/math/curve.c b/src/math/curve.c index 381c36bc..e5f7f226 100644 --- a/src/math/curve.c +++ b/src/math/curve.c @@ -46,6 +46,7 @@ Curve* lovrCurveInit(Curve* curve, int sizeHint) { void lovrCurveDestroy(void* ref) { Curve* curve = ref; vec_deinit(&curve->points); + free(curve); } void lovrCurveEvaluate(Curve* curve, float t, vec3 p) { diff --git a/src/math/pool.c b/src/math/pool.c index a81de02f..02ed967b 100644 --- a/src/math/pool.c +++ b/src/math/pool.c @@ -18,6 +18,7 @@ Pool* lovrPoolInit(Pool* pool, size_t size) { void lovrPoolDestroy(void* ref) { Pool* pool = ref; free(pool->data); + free(pool); } float* lovrPoolAllocate(Pool* pool, MathType type) { diff --git a/src/math/randomGenerator.c b/src/math/randomGenerator.c index 57905d89..e221c635 100644 --- a/src/math/randomGenerator.c +++ b/src/math/randomGenerator.c @@ -29,7 +29,7 @@ RandomGenerator* lovrRandomGeneratorInit(RandomGenerator* generator) { } void lovrRandomGeneratorDestroy(void* ref) { - // + free(ref); } Seed lovrRandomGeneratorGetSeed(RandomGenerator* generator) { diff --git a/src/physics/physics.c b/src/physics/physics.c index 498fc894..27e347ff 100644 --- a/src/physics/physics.c +++ b/src/physics/physics.c @@ -68,6 +68,7 @@ void lovrWorldDestroy(void* ref) { lovrWorldDestroyData(world); vec_deinit(&world->overlaps); map_deinit(&world->tags); + free(world); } void lovrWorldDestroyData(World* world) { @@ -300,6 +301,7 @@ void lovrColliderDestroy(void* ref) { lovrColliderDestroyData(collider); vec_deinit(&collider->shapes); vec_deinit(&collider->joints); + free(collider); } void lovrColliderDestroyData(Collider* collider) { @@ -662,6 +664,7 @@ void lovrColliderGetAABB(Collider* collider, float aabb[6]) { void lovrShapeDestroy(void* ref) { Shape* shape = ref; lovrShapeDestroyData(shape); + free(shape); } void lovrShapeDestroyData(Shape* shape) { @@ -871,6 +874,7 @@ void lovrCylinderShapeSetLength(CylinderShape* cylinder, float length) { void lovrJointDestroy(void* ref) { Joint* joint = ref; lovrJointDestroyData(joint); + free(joint); } void lovrJointDestroyData(Joint* joint) { diff --git a/src/thread/channel.c b/src/thread/channel.c index 7ec20b50..2b838a32 100644 --- a/src/thread/channel.c +++ b/src/thread/channel.c @@ -15,6 +15,7 @@ void lovrChannelDestroy(void* ref) { vec_deinit(&channel->messages); mtx_destroy(&channel->lock); cnd_destroy(&channel->cond); + free(channel); } bool lovrChannelPush(Channel* channel, Variant variant, double timeout, uint64_t* id) { diff --git a/src/thread/thread.c b/src/thread/thread.c index db3f1bad..108cd7db 100644 --- a/src/thread/thread.c +++ b/src/thread/thread.c @@ -47,6 +47,7 @@ void lovrThreadDestroy(void* ref) { Thread* thread = ref; mtx_destroy(&thread->lock); thrd_detach(thread->handle); + free(thread); } void lovrThreadStart(Thread* thread) { diff --git a/src/util.h b/src/util.h index 4c066897..fed27462 100644 --- a/src/util.h +++ b/src/util.h @@ -110,5 +110,5 @@ uint32_t nextPo2(uint32_t x); #define lovrAssert(c, ...) if (!(c)) { lovrThrow(__VA_ARGS__); } #define lovrAlloc(T) (T*) _lovrAlloc(sizeof(T), T_ ## T) #define lovrRetain(r) if (r && ++(((Ref*) r)->count) >= 0xff) lovrThrow("Ref count overflow") -#define lovrRelease(T, r) if (r && --(((Ref*) r)->count) == 0) lovr ## T ## Destroy(r), free(r) -#define lovrGenericRelease(r) if (r && --(((Ref*) r)->count) == 0) lovrTypeInfo[((Ref*) r)->type].destructor(r), free(r) +#define lovrRelease(T, r) if (r && --(((Ref*) r)->count) == 0) lovr ## T ## Destroy(r) +#define lovrGenericRelease(r) if (r && --(((Ref*) r)->count) == 0) lovrTypeInfo[((Ref*) r)->type].destructor(r)