From 3475ce4e8fe94b1f93ea7f5429922a343658ed05 Mon Sep 17 00:00:00 2001 From: Alessandre Laguierce Date: Wed, 2 Apr 2025 08:35:57 +0200 Subject: [PATCH] feat: add cache for last_thread_t structure --- src/thread/thread.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/thread/thread.c b/src/thread/thread.c index 0163107..994f558 100644 --- a/src/thread/thread.c +++ b/src/thread/thread.c @@ -51,6 +51,8 @@ struct context_entry { }; struct last_thread_t { + STAILQ_ENTRY(last_thread_t) + link; struct context_entry * last_thread; int ref; // number of reference to this struct (for free) }; @@ -61,6 +63,7 @@ static TAILQ_HEAD(context_head, context_entry) head = TAILQ_HEAD_INITIALIZER(hea static struct context_entry* running = NULL; static TAILQ_HEAD(freed_context_head, context_entry) context_to_freed = TAILQ_HEAD_INITIALIZER(context_to_freed); +static STAILQ_HEAD(last_thread_head, last_thread_t) last_thread_freed = STAILQ_HEAD_INITIALIZER(last_thread_freed); struct mutex_fifo_entry_t { @@ -195,7 +198,12 @@ int thread_join(thread_t thread, void** retval) running->last_waited = entry->last_waited; } else { // the thread we want to join is solo - running->last_waited = malloc(sizeof(struct last_thread_t)); + if (STAILQ_EMPTY(&last_thread_freed)) { + running->last_waited = malloc(sizeof(struct last_thread_t)); + } else { + running->last_waited = STAILQ_FIRST(&last_thread_freed); + STAILQ_REMOVE_HEAD(&last_thread_freed, link); + } running->last_waited->ref = 0 ; entry->last_waited = running->last_waited; running->last_waited->last_thread = entry; @@ -231,7 +239,8 @@ int thread_join(thread_t thread, void** retval) // Release the last waited thread if no one use it anymore DBG("Last waited ref : %d", running->last_waited->ref); if (--running->last_waited->ref == 0) { - free(running->last_waited); + STAILQ_INSERT_TAIL(&last_thread_freed, running->last_waited, link); + // free(running->last_waited); } running->last_waited = NULL; } @@ -301,6 +310,13 @@ void clear_context(void) free(last); } + struct last_thread_t* last_thread; + while (!STAILQ_EMPTY(&last_thread_freed)) { + last_thread = STAILQ_FIRST(&last_thread_freed); + STAILQ_REMOVE_HEAD(&last_thread_freed, link); + free(last_thread); + } + // Free all the fifo that might have been allocated for (int i = 0 ; i < HASHMAP_SIZE ; ++i) free(mutex_fifo_hashmap[i]);