Browse Source

Various memory leak fixes

master
Nathaniel Walizer 11 months ago
parent
commit
f7e12ef9a9
5 changed files with 25 additions and 6 deletions
  1. +4
    -0
      src/cart.c
  2. +5
    -4
      src/nese.c
  3. +11
    -0
      src/overlay.c
  4. +1
    -0
      src/overlay.h
  5. +4
    -2
      src/sdl_render.c

+ 4
- 0
src/cart.c View File

@@ -70,6 +70,10 @@ int nes_cart_init_mem(nes_cart* cart, void* mem, int len) {
} }


void nes_cart_done(nes_cart* cart) { void nes_cart_done(nes_cart* cart) {
if (NULL != cart->mapper) {
nes_map_done(cart->mapper);
cart->mapper = NULL;
}
if (NULL != cart->ines_mem) { if (NULL != cart->ines_mem) {
unmap_file(cart->ines_mem, cart->ines_size); unmap_file(cart->ines_mem, cart->ines_size);
cart->ines_mem = NULL; cart->ines_mem = NULL;


+ 5
- 4
src/nese.c View File

@@ -124,7 +124,7 @@ static int select_rom(menu_state* menu, nes_Renderer* rend,
nes_cart new_cart = {0}; nes_cart new_cart = {0};


while (0 == status && NULL == cart.file) { while (0 == status && NULL == cart.file) {
// Display a load failure message?
// Display a load failure message
if (NULL != cart.filename) { if (NULL != cart.filename) {
char message[1024]; char message[1024];
snprintf(message, sizeof(message) - 1, snprintf(message, sizeof(message) - 1,
@@ -134,10 +134,11 @@ static int select_rom(menu_state* menu, nes_Renderer* rend,
// Program closed inside modal // Program closed inside modal
status = input_Result_Quit; status = input_Result_Quit;
} }
free(cart.filename);
cart.filename = NULL;
} }


if (0 == status) { if (0 == status) {
// If we didn't launch with a file, run the loader
cart.filename = run_main_menu(menu, rend, cart.filename = run_main_menu(menu, rend,
input, sys); input, sys);


@@ -226,9 +227,9 @@ int main(int argc, char* argv[]) {
} }
} }


menu_state main_menu = {0};
// If we didn't launch with a file, run the loader
if (0 == status && NULL == cart.file) { if (0 == status && NULL == cart.file) {
status = select_rom(&main_menu, rend, input,
status = select_rom(NULL, rend, input,
&sys, &cart); &sys, &cart);
} }




+ 11
- 0
src/overlay.c View File

@@ -10,6 +10,17 @@ int overlay_init(Overlay* overlay) {
return 0; return 0;
} }


void overlay_done(Overlay* overlay) {
overlay_message* next = NULL;
for ( overlay_message* message = overlay->messages;
NULL != message;
message = next) {
next = message->next;
free(message->string);
free(message);
}
}

int overlay_clear(Overlay* overlay) { int overlay_clear(Overlay* overlay) {
int n_cleared = 0; int n_cleared = 0;
for ( overlay_message* message = overlay->messages; for ( overlay_message* message = overlay->messages;


+ 1
- 0
src/overlay.h View File

@@ -17,6 +17,7 @@ typedef struct {




int overlay_init(Overlay*); int overlay_init(Overlay*);
void overlay_done(Overlay*);
int overlay_add_message(Overlay*, const char*, int expiry); int overlay_add_message(Overlay*, const char*, int expiry);
int overlay_clear_message(Overlay*, int id); int overlay_clear_message(Overlay*, int id);
int overlay_clear(Overlay*); int overlay_clear(Overlay*);


+ 4
- 2
src/sdl_render.c View File

@@ -43,8 +43,9 @@ typedef struct {
SDL_Surface* background; SDL_Surface* background;
SDL_Surface* foreground; SDL_Surface* foreground;
SDL_Surface* target; SDL_Surface* target;
SDL_Texture* texture;
sdl_overlay_font font; sdl_overlay_font font;

SDL_Texture* texture;
int win_w; int win_w;
int win_h; int win_h;
} sdl_render_data; } sdl_render_data;
@@ -95,7 +96,6 @@ static int sdl_render_init(nes_Renderer* rend) {


} else { } else {
overlay_init(&rend->overlay); overlay_init(&rend->overlay);
// TODO: Cleanup
sdl_overlay_font_init(data->renderer, &data->font); sdl_overlay_font_init(data->renderer, &data->font);
} }
} }
@@ -169,6 +169,8 @@ static int sdl_render_init(nes_Renderer* rend) {


static void sdl_render_done(nes_Renderer* rend) { static void sdl_render_done(nes_Renderer* rend) {
sdl_render_data* data = (sdl_render_data*)rend->data; sdl_render_data* data = (sdl_render_data*)rend->data;
overlay_done(&rend->overlay);
sdl_overlay_font_done(&data->font);
SDL_DestroyTexture(data->texture); SDL_DestroyTexture(data->texture);
SDL_FreeSurface(data->foreground); SDL_FreeSurface(data->foreground);
SDL_FreeSurface(data->background); SDL_FreeSurface(data->background);


Loading…
Cancel
Save