From 8e6f87eb17b562fd3d1def7a65b5dc8346642f8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Mon, 28 Oct 2019 18:48:43 +0100 Subject: [PATCH] render worker context: allocate, and let worker threads free Since we now initialize the worker threads from term_init(), which returns before the threads terminate, we can no longer use stack-allocated worker contexts. We _could_ put them in the terminal struct. But a simpler solution is to allocate them in term_init(), and let the threads free them when they don't need them anymore. --- render.c | 1 + terminal.c | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/render.c b/render.c index f1eaa9fa..0c559ce0 100644 --- a/render.c +++ b/render.c @@ -374,6 +374,7 @@ render_worker_thread(void *_ctx) struct render_worker_context *ctx = _ctx; struct terminal *term = ctx->term; const int my_id = ctx->my_id; + free(ctx); char proc_title[16]; snprintf(proc_title, sizeof(proc_title), "foot:render:%d", my_id); diff --git a/terminal.c b/terminal.c index cd8d0ed9..5c9c7b37 100644 --- a/terminal.c +++ b/terminal.c @@ -219,7 +219,7 @@ term_init(const struct config *conf, struct fdm *fdm, struct wayland *wayl, int delay_upper_fd = -1; struct terminal *term = NULL; - struct render_worker_context worker_context[conf->render_worker_count]; + struct render_worker_context *worker_context[conf->render_worker_count]; if ((ptmx = posix_openpt(O_RDWR | O_NOCTTY)) == -1) { LOG_ERRNO("failed to open PTY"); @@ -343,9 +343,10 @@ term_init(const struct config *conf, struct fdm *fdm, struct wayland *wayl, term->render.workers.threads = calloc(term->render.workers.count, sizeof(term->render.workers.threads[0])); for (size_t i = 0; i < term->render.workers.count; i++) { - worker_context[i].term = term; - worker_context[i].my_id = 1 + i; - thrd_create(&term->render.workers.threads[i], &render_worker_thread, &worker_context[i]); + worker_context[i] = malloc(sizeof(*worker_context[i])); + worker_context[i]->term = term; + worker_context[i]->my_id = 1 + i; + thrd_create(&term->render.workers.threads[i], &render_worker_thread, worker_context[i]); } font_list_t font_names = tll_init();