mirror of https://github.com/bjornbytes/lovr.git
Free objects in their destructors;
This commit is contained in:
parent
ae470d8804
commit
d31dca5520
|
@ -16,6 +16,7 @@ void lovrMicrophoneDestroy(void* ref) {
|
||||||
Microphone* microphone = ref;
|
Microphone* microphone = ref;
|
||||||
lovrMicrophoneStopRecording(microphone);
|
lovrMicrophoneStopRecording(microphone);
|
||||||
alcCaptureCloseDevice(microphone->device);
|
alcCaptureCloseDevice(microphone->device);
|
||||||
|
free(microphone);
|
||||||
}
|
}
|
||||||
|
|
||||||
int lovrMicrophoneGetBitDepth(Microphone* microphone) {
|
int lovrMicrophoneGetBitDepth(Microphone* microphone) {
|
||||||
|
|
|
@ -37,6 +37,7 @@ void lovrSourceDestroy(void* ref) {
|
||||||
alDeleteBuffers(source->type == SOURCE_STATIC ? 1 : SOURCE_BUFFERS, source->buffers);
|
alDeleteBuffers(source->type == SOURCE_STATIC ? 1 : SOURCE_BUFFERS, source->buffers);
|
||||||
lovrRelease(SoundData, source->soundData);
|
lovrRelease(SoundData, source->soundData);
|
||||||
lovrRelease(AudioStream, source->stream);
|
lovrRelease(AudioStream, source->stream);
|
||||||
|
free(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
SourceType lovrSourceGetType(Source* source) {
|
SourceType lovrSourceGetType(Source* source) {
|
||||||
|
|
|
@ -28,6 +28,7 @@ void lovrAudioStreamDestroy(void* ref) {
|
||||||
stb_vorbis_close(stream->decoder);
|
stb_vorbis_close(stream->decoder);
|
||||||
lovrRelease(Blob, stream->blob);
|
lovrRelease(Blob, stream->blob);
|
||||||
free(stream->buffer);
|
free(stream->buffer);
|
||||||
|
free(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
int lovrAudioStreamDecode(AudioStream* stream, short* destination, int size) {
|
int lovrAudioStreamDecode(AudioStream* stream, short* destination, int size) {
|
||||||
|
|
|
@ -10,4 +10,5 @@ Blob* lovrBlobInit(Blob* blob, void* data, size_t size, const char* name) {
|
||||||
void lovrBlobDestroy(void* ref) {
|
void lovrBlobDestroy(void* ref) {
|
||||||
Blob* blob = ref;
|
Blob* blob = ref;
|
||||||
free(blob->data);
|
free(blob->data);
|
||||||
|
free(blob);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ void lovrModelDataDestroy(void* ref) {
|
||||||
lovrRelease(TextureData, model->textures[i]);
|
lovrRelease(TextureData, model->textures[i]);
|
||||||
}
|
}
|
||||||
free(model->data);
|
free(model->data);
|
||||||
|
free(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note: this code is a scary optimization
|
// Note: this code is a scary optimization
|
||||||
|
|
|
@ -34,6 +34,7 @@ Rasterizer* lovrRasterizerInit(Rasterizer* rasterizer, Blob* blob, float size) {
|
||||||
void lovrRasterizerDestroy(void* ref) {
|
void lovrRasterizerDestroy(void* ref) {
|
||||||
Rasterizer* rasterizer = ref;
|
Rasterizer* rasterizer = ref;
|
||||||
lovrRelease(Blob, rasterizer->blob);
|
lovrRelease(Blob, rasterizer->blob);
|
||||||
|
free(rasterizer);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool lovrRasterizerHasGlyph(Rasterizer* rasterizer, uint32_t character) {
|
bool lovrRasterizerHasGlyph(Rasterizer* rasterizer, uint32_t character) {
|
||||||
|
|
|
@ -12,6 +12,7 @@ void lovrFileDestroy(void* ref) {
|
||||||
if (file->handle) {
|
if (file->handle) {
|
||||||
PHYSFS_close(file->handle);
|
PHYSFS_close(file->handle);
|
||||||
}
|
}
|
||||||
|
free(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
int lovrFileOpen(File* file, FileMode mode) {
|
int lovrFileOpen(File* file, FileMode mode) {
|
||||||
|
|
|
@ -36,6 +36,7 @@ void lovrAnimatorDestroy(void* ref) {
|
||||||
Animator* animator = ref;
|
Animator* animator = ref;
|
||||||
lovrRelease(ModelData, animator->data);
|
lovrRelease(ModelData, animator->data);
|
||||||
vec_deinit(&animator->tracks);
|
vec_deinit(&animator->tracks);
|
||||||
|
free(animator);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrAnimatorReset(Animator* animator) {
|
void lovrAnimatorReset(Animator* animator) {
|
||||||
|
|
|
@ -61,6 +61,7 @@ void lovrFontDestroy(void* ref) {
|
||||||
}
|
}
|
||||||
map_deinit(&font->atlas.glyphs);
|
map_deinit(&font->atlas.glyphs);
|
||||||
map_deinit(&font->kerning);
|
map_deinit(&font->kerning);
|
||||||
|
free(font);
|
||||||
}
|
}
|
||||||
|
|
||||||
Rasterizer* lovrFontGetRasterizer(Font* font) {
|
Rasterizer* lovrFontGetRasterizer(Font* font) {
|
||||||
|
|
|
@ -27,6 +27,7 @@ void lovrMaterialDestroy(void* ref) {
|
||||||
for (int i = 0; i < MAX_MATERIAL_TEXTURES; i++) {
|
for (int i = 0; i < MAX_MATERIAL_TEXTURES; i++) {
|
||||||
lovrRelease(Texture, material->textures[i]);
|
lovrRelease(Texture, material->textures[i]);
|
||||||
}
|
}
|
||||||
|
free(material);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrMaterialBind(Material* material, Shader* shader) {
|
void lovrMaterialBind(Material* material, Shader* shader) {
|
||||||
|
|
|
@ -193,6 +193,7 @@ void lovrModelDestroy(void* ref) {
|
||||||
lovrRelease(Mesh, model->meshes[i]);
|
lovrRelease(Mesh, model->meshes[i]);
|
||||||
}
|
}
|
||||||
lovrRelease(ModelData, model->data);
|
lovrRelease(ModelData, model->data);
|
||||||
|
free(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrModelDraw(Model* model, mat4 transform, int instances) {
|
void lovrModelDraw(Model* model, mat4 transform, int instances) {
|
||||||
|
|
|
@ -1241,6 +1241,7 @@ void lovrTextureDestroy(void* ref) {
|
||||||
glDeleteTextures(1, &texture->id);
|
glDeleteTextures(1, &texture->id);
|
||||||
glDeleteRenderbuffers(1, &texture->msaaId);
|
glDeleteRenderbuffers(1, &texture->msaaId);
|
||||||
lovrGpuDestroySyncResource(texture, texture->incoherent);
|
lovrGpuDestroySyncResource(texture, texture->incoherent);
|
||||||
|
free(texture);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrTextureAllocate(Texture* texture, int width, int height, int depth, TextureFormat format) {
|
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->attachments[i].texture);
|
||||||
}
|
}
|
||||||
lovrRelease(Texture, canvas->depth.texture);
|
lovrRelease(Texture, canvas->depth.texture);
|
||||||
|
free(canvas);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrCanvasResolve(Canvas* canvas) {
|
void lovrCanvasResolve(Canvas* canvas) {
|
||||||
|
@ -1597,6 +1599,7 @@ void lovrBufferDestroy(void* ref) {
|
||||||
#ifndef LOVR_WEBGL
|
#ifndef LOVR_WEBGL
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
free(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void* lovrBufferMap(Buffer* buffer, size_t offset) {
|
void* lovrBufferMap(Buffer* buffer, size_t offset) {
|
||||||
|
@ -1961,6 +1964,7 @@ void lovrShaderDestroy(void* ref) {
|
||||||
map_deinit(&shader->attributes);
|
map_deinit(&shader->attributes);
|
||||||
map_deinit(&shader->uniformMap);
|
map_deinit(&shader->uniformMap);
|
||||||
map_deinit(&shader->blockMap);
|
map_deinit(&shader->blockMap);
|
||||||
|
free(shader);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mesh
|
// Mesh
|
||||||
|
@ -1987,6 +1991,7 @@ void lovrMeshDestroy(void* ref) {
|
||||||
lovrRelease(Buffer, mesh->vertexBuffer);
|
lovrRelease(Buffer, mesh->vertexBuffer);
|
||||||
lovrRelease(Buffer, mesh->indexBuffer);
|
lovrRelease(Buffer, mesh->indexBuffer);
|
||||||
lovrRelease(Material, mesh->material);
|
lovrRelease(Material, mesh->material);
|
||||||
|
free(mesh);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrMeshSetIndexBuffer(Mesh* mesh, Buffer* buffer, uint32_t indexCount, size_t indexSize, size_t offset) {
|
void lovrMeshSetIndexBuffer(Mesh* mesh, Buffer* buffer, uint32_t indexCount, size_t indexSize, size_t offset) {
|
||||||
|
|
|
@ -198,6 +198,7 @@ void lovrShaderBlockDestroy(void* ref) {
|
||||||
lovrRelease(Buffer, block->buffer);
|
lovrRelease(Buffer, block->buffer);
|
||||||
vec_deinit(&block->uniforms);
|
vec_deinit(&block->uniforms);
|
||||||
map_deinit(&block->uniformMap);
|
map_deinit(&block->uniformMap);
|
||||||
|
free(block);
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockType lovrShaderBlockGetType(ShaderBlock* block) {
|
BlockType lovrShaderBlockGetType(ShaderBlock* block) {
|
||||||
|
|
|
@ -51,5 +51,5 @@ void lovrHeadsetDestroy() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrControllerDestroy(void* ref) {
|
void lovrControllerDestroy(void* ref) {
|
||||||
//
|
free(ref);
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,7 @@ Curve* lovrCurveInit(Curve* curve, int sizeHint) {
|
||||||
void lovrCurveDestroy(void* ref) {
|
void lovrCurveDestroy(void* ref) {
|
||||||
Curve* curve = ref;
|
Curve* curve = ref;
|
||||||
vec_deinit(&curve->points);
|
vec_deinit(&curve->points);
|
||||||
|
free(curve);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrCurveEvaluate(Curve* curve, float t, vec3 p) {
|
void lovrCurveEvaluate(Curve* curve, float t, vec3 p) {
|
||||||
|
|
|
@ -18,6 +18,7 @@ Pool* lovrPoolInit(Pool* pool, size_t size) {
|
||||||
void lovrPoolDestroy(void* ref) {
|
void lovrPoolDestroy(void* ref) {
|
||||||
Pool* pool = ref;
|
Pool* pool = ref;
|
||||||
free(pool->data);
|
free(pool->data);
|
||||||
|
free(pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
float* lovrPoolAllocate(Pool* pool, MathType type) {
|
float* lovrPoolAllocate(Pool* pool, MathType type) {
|
||||||
|
|
|
@ -29,7 +29,7 @@ RandomGenerator* lovrRandomGeneratorInit(RandomGenerator* generator) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrRandomGeneratorDestroy(void* ref) {
|
void lovrRandomGeneratorDestroy(void* ref) {
|
||||||
//
|
free(ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
Seed lovrRandomGeneratorGetSeed(RandomGenerator* generator) {
|
Seed lovrRandomGeneratorGetSeed(RandomGenerator* generator) {
|
||||||
|
|
|
@ -68,6 +68,7 @@ void lovrWorldDestroy(void* ref) {
|
||||||
lovrWorldDestroyData(world);
|
lovrWorldDestroyData(world);
|
||||||
vec_deinit(&world->overlaps);
|
vec_deinit(&world->overlaps);
|
||||||
map_deinit(&world->tags);
|
map_deinit(&world->tags);
|
||||||
|
free(world);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrWorldDestroyData(World* world) {
|
void lovrWorldDestroyData(World* world) {
|
||||||
|
@ -300,6 +301,7 @@ void lovrColliderDestroy(void* ref) {
|
||||||
lovrColliderDestroyData(collider);
|
lovrColliderDestroyData(collider);
|
||||||
vec_deinit(&collider->shapes);
|
vec_deinit(&collider->shapes);
|
||||||
vec_deinit(&collider->joints);
|
vec_deinit(&collider->joints);
|
||||||
|
free(collider);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrColliderDestroyData(Collider* collider) {
|
void lovrColliderDestroyData(Collider* collider) {
|
||||||
|
@ -662,6 +664,7 @@ void lovrColliderGetAABB(Collider* collider, float aabb[6]) {
|
||||||
void lovrShapeDestroy(void* ref) {
|
void lovrShapeDestroy(void* ref) {
|
||||||
Shape* shape = ref;
|
Shape* shape = ref;
|
||||||
lovrShapeDestroyData(shape);
|
lovrShapeDestroyData(shape);
|
||||||
|
free(shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrShapeDestroyData(Shape* shape) {
|
void lovrShapeDestroyData(Shape* shape) {
|
||||||
|
@ -871,6 +874,7 @@ void lovrCylinderShapeSetLength(CylinderShape* cylinder, float length) {
|
||||||
void lovrJointDestroy(void* ref) {
|
void lovrJointDestroy(void* ref) {
|
||||||
Joint* joint = ref;
|
Joint* joint = ref;
|
||||||
lovrJointDestroyData(joint);
|
lovrJointDestroyData(joint);
|
||||||
|
free(joint);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrJointDestroyData(Joint* joint) {
|
void lovrJointDestroyData(Joint* joint) {
|
||||||
|
|
|
@ -15,6 +15,7 @@ void lovrChannelDestroy(void* ref) {
|
||||||
vec_deinit(&channel->messages);
|
vec_deinit(&channel->messages);
|
||||||
mtx_destroy(&channel->lock);
|
mtx_destroy(&channel->lock);
|
||||||
cnd_destroy(&channel->cond);
|
cnd_destroy(&channel->cond);
|
||||||
|
free(channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool lovrChannelPush(Channel* channel, Variant variant, double timeout, uint64_t* id) {
|
bool lovrChannelPush(Channel* channel, Variant variant, double timeout, uint64_t* id) {
|
||||||
|
|
|
@ -47,6 +47,7 @@ void lovrThreadDestroy(void* ref) {
|
||||||
Thread* thread = ref;
|
Thread* thread = ref;
|
||||||
mtx_destroy(&thread->lock);
|
mtx_destroy(&thread->lock);
|
||||||
thrd_detach(thread->handle);
|
thrd_detach(thread->handle);
|
||||||
|
free(thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrThreadStart(Thread* thread) {
|
void lovrThreadStart(Thread* thread) {
|
||||||
|
|
|
@ -110,5 +110,5 @@ uint32_t nextPo2(uint32_t x);
|
||||||
#define lovrAssert(c, ...) if (!(c)) { lovrThrow(__VA_ARGS__); }
|
#define lovrAssert(c, ...) if (!(c)) { lovrThrow(__VA_ARGS__); }
|
||||||
#define lovrAlloc(T) (T*) _lovrAlloc(sizeof(T), T_ ## T)
|
#define lovrAlloc(T) (T*) _lovrAlloc(sizeof(T), T_ ## T)
|
||||||
#define lovrRetain(r) if (r && ++(((Ref*) r)->count) >= 0xff) lovrThrow("Ref count overflow")
|
#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 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), free(r)
|
#define lovrGenericRelease(r) if (r && --(((Ref*) r)->count) == 0) lovrTypeInfo[((Ref*) r)->type].destructor(r)
|
||||||
|
|
Loading…
Reference in New Issue