summaryrefslogtreecommitdiff
path: root/src/screen.c
diff options
context:
space:
mode:
authorTyler Murphy <tylerm@tylerm.dev>2023-04-24 15:59:41 -0400
committerTyler Murphy <tylerm@tylerm.dev>2023-04-24 15:59:41 -0400
commit3c25e6a318524ab8d999cd86d7db03c573271e51 (patch)
treef685bf86629338c3a03e69ba13bf48bcb556fc3a /src/screen.c
parenti made a swapchain (diff)
downloadraycaster-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.c25
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);