diff options
author | Tyler Murphy <tylerm@tylerm.dev> | 2023-04-24 15:59:41 -0400 |
---|---|---|
committer | Tyler Murphy <tylerm@tylerm.dev> | 2023-04-24 15:59:41 -0400 |
commit | 3c25e6a318524ab8d999cd86d7db03c573271e51 (patch) | |
tree | f685bf86629338c3a03e69ba13bf48bcb556fc3a /src/screen.c | |
parent | i made a swapchain (diff) | |
download | raycaster-3c25e6a318524ab8d999cd86d7db03c573271e51.tar.gz raycaster-3c25e6a318524ab8d999cd86d7db03c573271e51.tar.bz2 raycaster-3c25e6a318524ab8d999cd86d7db03c573271e51.zip |
signal handeling and properly close swapchain
Diffstat (limited to 'src/screen.c')
-rw-r--r-- | src/screen.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/src/screen.c b/src/screen.c index eb2de87..5e84038 100644 --- a/src/screen.c +++ b/src/screen.c @@ -1,5 +1,4 @@ #include "screen.h" -#include <sched.h> #undef Screen #include <math.h> @@ -7,9 +6,9 @@ #include <stdlib.h> #include <string.h> #include <time.h> -#include <sys/select.h> #include <pthread.h> #include <unistd.h> +#include <signal.h> #define XLIB_ILLEGAL_ACCESS #include <X11/X.h> @@ -123,16 +122,20 @@ static Swapchain create_swapchain(int width, int height, int frames, int bit_dep return swapchain; } -static void free_swapchain(Swapchain swapchain, WindowState* state) { - for (uint8_t i = 0; i < swapchain.image_count; i++) { +static void free_swapchain(Swapchain* swapchain, WindowState* state) { + pthread_mutex_lock(&state->recreate_lock); + for (uint8_t i = 0; i < swapchain->image_count; i++) { XDestroyImage(state->images[i]); // also frees pixel buffer :3 } - free(swapchain.images); + free(swapchain->images); free(state->images); + swapchain->images = NULL; XFreePixmap(dpy, state->pixel_map); XFreeGC(dpy, state->graphics_ctx); + + pthread_mutex_unlock(&state->recreate_lock); } static void recreate_swapchain(int width, int height, int bit_depth, Swapchain* swapchain, WindowState* state) { @@ -186,8 +189,13 @@ static void* swapchain_thread(void* arg) { WindowState* state = (WindowState*) screen->internal; while (1) { - pthread_mutex_lock(&state->recreate_lock); + + if (screen->swapchain.images == NULL) { + return NULL; + } + pthread_mutex_lock(&state->recreate_lock); + pthread_mutex_lock(&screen->swapchain.lock); int index = screen->swapchain.image_recent; screen->swapchain.image_front = index; @@ -294,9 +302,12 @@ bool poll_screen(struct Screen* screen) { void free_screen(struct Screen* screen) { WindowState* state = (WindowState*) screen->internal; + free_swapchain(&screen->swapchain, state); pthread_exit(&state->update_thread); + pthread_mutex_destroy(&screen->swapchain.lock); + pthread_mutex_destroy(&state->recreate_lock); + XUnmapWindow(dpy, state->window); - free_swapchain(screen->swapchain, state); XDestroyWindow(dpy, state->window); free(screen->internal); |