fix: massive memory leak (not all fixed) and added more test cases

This commit is contained in:
AfonsoCMSousa 2026-03-24 11:15:28 +00:00
parent a1f868c27b
commit 7cdecceef2
No known key found for this signature in database
3 changed files with 43 additions and 9 deletions

View File

@ -6,6 +6,7 @@
#include <stdatomic.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#define G_CONSTANT 1.98f
@ -148,7 +149,7 @@ void collision_update(Particle *particles, unsigned long long count, float resti
void *t_update(void *args) {
Physics_params *params = (Physics_params *)args;
while (params->exit != 1) {
while (!params->exit) {
pthread_mutex_lock(params->mutex);
while (params->run == 0) {
pthread_cond_wait(params->cond, params->mutex); // sleeps here
@ -202,6 +203,7 @@ void *t_update(void *args) {
pthread_barrier_wait(params->barrier);
}
printf("INFO: Thread %llu exiting\n", params->thread_id);
return NULL;
}

BIN
psystem

Binary file not shown.

View File

@ -20,13 +20,13 @@ const char FRAGMENT_SHADER_SOURCE[] = "./source/shader/fragment.glsl";
const char VERTEX_SHADER_SOURCE[] = "./source/shader/vertex.glsl";
const char PROGRAM_NAME[] = "Particle Sim";
const unsigned int THREAD_COUNT = 1;
const unsigned int THREAD_COUNT = 16;
const unsigned int SCR_WIDTH = 2560;
const unsigned int SCR_HEIGHT = 1440;
const char *glsl_version;
const unsigned int PARTICLE_COUNT = 3;
const unsigned int PARTICLE_COUNT = 500;
GLFWwindow *window;
unsigned int VBO, VAO;
@ -220,9 +220,29 @@ int main() {
if (particles == NULL) {
snprintf(errLog, 128, "There was a issue allocating memory for the particle list\n");
} else {
particles[0] = particle_init({1.000001f, 1.0f, 0.994f}, {1.0f, 0.0f, 0.0f, 255.0f});
particles[1] = particle_init({1.0f, 1.2f, 1.0f}, {0.0f, 1.0f, 0.0f, 255.0f});
particles[2] = particle_init({0.99995f, 1.4f, 1.004f}, {0.0f, 0.0f, 1.0f, 255.0f});
for (unsigned long long i = 0; i < PARTICLE_COUNT; i++) {
// TEST: 3 Particles
// INFO: Best run with 3 particles and 1 thread
/*
particles[0] = particle_init({1.000001f, 1.0f, 0.994f}, {1.0f, 0.0f, 0.0f, 255.0f});
particles[1] = particle_init({1.0f, 1.2f, 1.0f}, {0.0f, 1.0f, 0.0f, 255.0f});
particles[2] = particle_init({0.99995f, 1.4f, 1.004f}, {0.0f, 0.0f, 1.0f, 255.0f});
*/
// TEST: Cloud of particles in a 2x2x2 cube
// INFO: Best run with 500 particles and 16 threads
float x = (float)(rand() % 200) / 100.0f; // Random x between 0 and 2
float y = (float)(rand() % 200) / 100.0f; // Random y between 0 and 2
float z = (float)(rand() % 200) / 100.0f; // Random z between 0 and 2
particles[i] = particle_init({x, y, z}, {x, y, z, 255.0f});
}
/*
particles[0] = particle_init({1.000001f, 1.0f, 0.994f}, {1.0f, 0.0f, 0.0f, 255.0f});
particles[1] = particle_init({1.0f, 1.2f, 1.0f}, {0.0f, 1.0f, 0.0f, 255.0f});
particles[2] = particle_init({0.99995f, 1.4f, 1.004f}, {0.0f, 0.0f, 1.0f, 255.0f});
*/
}
float current_time;
@ -259,7 +279,6 @@ int main() {
// Poll events
glfwPollEvents();
#ifndef NDEBUG
// ESC releases cursor; if cursor already free, close window
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
if (camera.cursor_captured) {
@ -270,7 +289,7 @@ int main() {
glfwSetWindowShouldClose(window, true);
}
}
#endif
camera_keyboard(camera, window, delta_time);
// Build MVP
@ -293,7 +312,7 @@ int main() {
for (int i = 0; i < THREAD_COUNT; i++)
alive_count += thread_params[i].alive_count;
collision_update(particles, alive_count, 0.7f);
collision_update(particles, alive_count, 0.3f);
// Render
glClearColor(0.03f, 0.03f, 0.03f, 1.0f);
@ -339,6 +358,19 @@ int main() {
glfwSwapBuffers(window);
}
// Cleanup
for (int i = 0; i < THREAD_COUNT; i++) {
thread_params[i].exit = 1;
pthread_cond_broadcast(&cond); // Wake up threads so they can exit
}
free(threads);
free(thread_params);
free(particles);
ImGui_ImplGlfw_Shutdown();
ImGui_ImplOpenGL3_Shutdown();
ImGui::DestroyContext();
return 0;
}