From 457a3cc1a04e45e31370d9083186436b0d12ab1d Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Mon, 27 Jan 2025 21:56:39 -0500 Subject: Refactor threaded waits - Move seek to handler thread. - Cleanup and comment some stuff. Signed-off-by: Andrew Opalach --- src/cache/handlers/cdio.c | 12 ++++++------ src/cache/handlers/cdio.h | 2 ++ src/cache/handlers/http.c | 14 +++++++------- src/cache/handlers/http.h | 4 +++- 4 files changed, 18 insertions(+), 14 deletions(-) (limited to 'src/cache/handlers') diff --git a/src/cache/handlers/cdio.c b/src/cache/handlers/cdio.c index ac90c03..1b4c44b 100644 --- a/src/cache/handlers/cdio.c +++ b/src/cache/handlers/cdio.c @@ -68,7 +68,7 @@ static nn_thread_result NNWT_THREADCALL cd_read_thread(void *userdata) cch_backing_fill_range(cdio->backing, pointer, BYTES_PER_STEP); cdio->sector += ret; cdio->backing->unlock(cdio->backing); - cch_threaded_waits_evaluate(&cdio->handler, cdio->backing); + cch_threaded_waits_evaluate(&cdio->waits, cdio->backing); if (ret < SECTORS_PER_STEP || cdio->sector > cdio->end) { al_log_debug("cdio", "Normal CD EOF."); break; @@ -78,7 +78,7 @@ static nn_thread_result NNWT_THREADCALL cd_read_thread(void *userdata) if (cdio->sector <= cdio->end) { al_log_warn("cdio", "Disc read cut short (sectors: %zd, end: %zd).", cdio->sector, cdio->end); // We didn't read the full disc, disable waiters. - cch_threaded_waits_disable_all(&cdio->handler); + cch_threaded_waits_disable_all(&cdio->waits); } return 0; @@ -101,13 +101,13 @@ static void handler_cdio_maybe_spawn_worker(struct cch_handler *handler, size_t static bool handler_cdio_wait_for_range(struct cch_handler *handler, struct cch_handler_wait *wait) { struct cch_handler_cdio *cdio = (struct cch_handler_cdio *)handler; - return cch_threaded_wait_for_range(&cdio->handler, cdio->backing, wait); + return cch_threaded_wait_for_range(&cdio->waits, cdio->handler.entry, cdio->backing, wait); } static void handler_cdio_free(struct cch_handler **handler) { struct cch_handler_cdio *cdio = (struct cch_handler_cdio *)*handler; - cch_threaded_waits_disable_all(&cdio->handler); + cch_threaded_waits_disable_all(&cdio->waits); if (al_atomic_load(s32)(&cdio->running, AL_ATOMIC_RELAXED)) { al_atomic_store(s32)(&cdio->running, 0, AL_ATOMIC_RELAXED); nn_thread_join(&cdio->thread); @@ -116,7 +116,7 @@ static void handler_cdio_free(struct cch_handler **handler) cdio_log_messages(cdio); cdio_cddap_close(cdio->drive); } - cch_threaded_waits_close(&cdio->handler); + cch_threaded_waits_close(&cdio->waits); al_str_free(&cdio->handler.liana); al_free(cdio); *handler = NULL; @@ -208,6 +208,6 @@ struct cch_entry *cch_handler_cdio_create(void) nn_buffer_init(&cdio->buffer); nn_buffer_ensure_space(&cdio->buffer, BYTES_PER_STEP); nn_buffer_set_size(&cdio->buffer, BYTES_PER_STEP); - cch_threaded_waits_init(&cdio->handler); + cch_threaded_waits_init(&cdio->waits); return entry; } diff --git a/src/cache/handlers/cdio.h b/src/cache/handlers/cdio.h index 3a3966a..650d2e5 100644 --- a/src/cache/handlers/cdio.h +++ b/src/cache/handlers/cdio.h @@ -5,6 +5,7 @@ #include "../handler.h" #include "../entry.h" +#include "../threaded_waits.h" struct cch_handler_cdio { struct cch_handler handler; @@ -16,6 +17,7 @@ struct cch_handler_cdio { struct nn_buffer buffer; atomic(s32) running; struct nn_thread thread; + struct cch_handler_waits waits; }; struct cch_entry *cch_handler_cdio_create(void); diff --git a/src/cache/handlers/http.c b/src/cache/handlers/http.c index b34e4ba..1856014 100644 --- a/src/cache/handlers/http.c +++ b/src/cache/handlers/http.c @@ -30,7 +30,7 @@ static void http_callback(void *userdata, u8 op, u8 *buf, void *opaque) http->backing->write(http->backing, buf, http->pointer, &n); http->pointer += n; *(size_t *)opaque = n; - cch_threaded_waits_evaluate(&http->handler, http->backing); + cch_threaded_waits_evaluate(&http->waits, http->backing); break; } case NNWT_HTTP_RESPONSE_CODE: { @@ -42,7 +42,7 @@ static void http_callback(void *userdata, u8 op, u8 *buf, void *opaque) curl_off_t length = *(curl_off_t *)opaque; al_log_debug("cache_handler_http", "Content-Length: %"CURL_FORMAT_CURL_OFF_T".", length); cch_entry_set_size(http->handler.entry, length); - cch_threaded_waits_signal_any(&http->handler); + cch_threaded_waits_signal_any(&http->waits); break; } case NNWT_HTTP_REDIRECT: { @@ -54,7 +54,7 @@ static void http_callback(void *userdata, u8 op, u8 *buf, void *opaque) al_log_debug("cache_handler_http", "Transfer finished."); break; case NNWT_HTTP_ERROR: - cch_threaded_waits_disable_all(&http->handler); + cch_threaded_waits_disable_all(&http->waits); break; default: break; @@ -77,18 +77,18 @@ static void handler_http_maybe_spawn_worker(struct cch_handler *handler, size_t static bool handler_http_wait_for_range(struct cch_handler *handler, struct cch_handler_wait *wait) { struct cch_handler_http *http = (struct cch_handler_http *)handler; - return cch_threaded_wait_for_range(&http->handler, http->backing, wait); + return cch_threaded_wait_for_range(&http->waits, http->handler.entry, http->backing, wait); } static void handler_http_free(struct cch_handler **handler) { struct cch_handler_http *http = (struct cch_handler_http *)*handler; - cch_threaded_waits_disable_all(&http->handler); + cch_threaded_waits_disable_all(&http->waits); struct nn_http *request; al_array_foreach_ptr(http->requests, i, request) { nn_http_close(request); } - cch_threaded_waits_close(&http->handler); + cch_threaded_waits_close(&http->waits); al_array_free(http->requests); al_str_free(&http->url); al_str_free(&http->handler.liana); @@ -119,6 +119,6 @@ struct cch_entry *cch_handler_http_create(str *url, struct nn_event_loop *loop) al_str_clone(&http->url, url); http->pointer = 0; al_array_init(http->requests); - cch_threaded_waits_init(&http->handler); + cch_threaded_waits_init(&http->waits); return entry; } diff --git a/src/cache/handlers/http.h b/src/cache/handlers/http.h index ef47173..2b87db9 100644 --- a/src/cache/handlers/http.h +++ b/src/cache/handlers/http.h @@ -6,14 +6,16 @@ #include "../handler.h" #include "../entry.h" +#include "../threaded_waits.h" struct cch_handler_http { struct cch_handler handler; struct cch_backing *backing; + struct nn_event_loop *loop; str url; off_t pointer; array(struct nn_http) requests; - struct nn_event_loop *loop; + struct cch_handler_waits waits; }; struct cch_entry *cch_handler_http_create(str *url, struct nn_event_loop *loop); -- cgit v1.2.3-101-g0448