diff options
Diffstat (limited to 'src/cache/handlers')
| -rw-r--r-- | src/cache/handlers/cdio.c | 5 | ||||
| -rw-r--r-- | src/cache/handlers/file.c | 1 | ||||
| -rw-r--r-- | src/cache/handlers/http.c | 21 |
3 files changed, 17 insertions, 10 deletions
diff --git a/src/cache/handlers/cdio.c b/src/cache/handlers/cdio.c index e319f74..9a5e698 100644 --- a/src/cache/handlers/cdio.c +++ b/src/cache/handlers/cdio.c @@ -102,7 +102,7 @@ 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->waits, cdio->handler.entry, cdio->backing, wait); + return cch_threaded_wait_for_range(&cdio->waits, cdio->backing, wait); } static void handler_cdio_free(struct cch_handler **handler) @@ -172,7 +172,7 @@ static bool open_cd_drive(struct cch_handler_cdio *cdio) offset = track_end + 1; } // end is a valid index so add one framesize. - cch_entry_set_size(cdio->handler.entry, ((end - start) + 1) * CDIO_CD_FRAMESIZE_RAW); + cdio->backing->set_size(cdio->backing, ((end - start) + 1) * CDIO_CD_FRAMESIZE_RAW, true); cdio->start = -1; cdio->end = end; @@ -192,7 +192,6 @@ struct cch_entry *cch_handler_cdio_create(void) struct cch_entry *entry = al_alloc_object(struct cch_entry); entry->backing = backing; entry->handler = (struct cch_handler *)cdio; - entry->unknown_size = false; nn_mutex_init(&entry->mutex); entry->handler->can_seek = handler_cdio_can_seek; entry->handler->maybe_spawn_worker = handler_cdio_maybe_spawn_worker; diff --git a/src/cache/handlers/file.c b/src/cache/handlers/file.c index 9529772..cd78a2c 100644 --- a/src/cache/handlers/file.c +++ b/src/cache/handlers/file.c @@ -39,7 +39,6 @@ struct cch_entry *cch_handler_file_create(str *path, str *liana) struct cch_entry *entry = al_alloc_object(struct cch_entry); entry->backing = backing; entry->handler = (struct cch_handler *)file; - entry->unknown_size = false; nn_mutex_init(&entry->mutex); entry->handler->can_seek = handler_file_can_seek; entry->handler->maybe_spawn_worker = handler_file_maybe_spawn_worker; diff --git a/src/cache/handlers/http.c b/src/cache/handlers/http.c index ed84bdc..02f656b 100644 --- a/src/cache/handlers/http.c +++ b/src/cache/handlers/http.c @@ -25,8 +25,8 @@ static void http_callback(void *userdata, u8 op, u8 *buf, void *opaque) case NNWT_HTTP_WRITE: { size_t n = *(size_t *)opaque; // If we got data before a Content-Length, assume the size is unknown. - if (cch_entry_get_size(http->handler.entry) < 0) { - cch_entry_set_size(http->handler.entry, 0); + if (http->backing->get_size_if_known(http->backing) < 0) { + http->backing->set_size(http->backing, 0, false); } http->backing->write(http->backing, buf, http->pointer, &n); http->pointer += n; @@ -42,8 +42,10 @@ static void http_callback(void *userdata, u8 op, u8 *buf, void *opaque) case NNWT_HTTP_CONTENT_LENGTH: { curl_off_t length = *(curl_off_t *)opaque; log_debug("Content-Length: %"CURL_FORMAT_CURL_OFF_T".", length); - cch_entry_set_size(http->handler.entry, length); - cch_threaded_waits_signal_any(&http->waits); + if (length > 0) { // HTTP 204 No Content. finalize() with 0 size. + http->backing->set_size(http->backing, length, true); + } + cch_threaded_waits_signal_anys(&http->waits); break; } case NNWT_HTTP_REDIRECT: { @@ -52,6 +54,14 @@ static void http_callback(void *userdata, u8 op, u8 *buf, void *opaque) break; } case NNWT_HTTP_FINISHED: + http->backing->finalize(http->backing); + if (http->backing->get_size_if_known(http->backing) == 0) { + // The handle needs to consider that it could wake up from any + // wait with a filesize of 0. + cch_threaded_waits_disable_all(&http->waits); + } else { + cch_threaded_waits_evaluate(&http->waits, http->backing); + } log_debug("Transfer finished."); break; case NNWT_HTTP_ERROR: @@ -78,7 +88,7 @@ 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->waits, http->handler.entry, http->backing, wait); + return cch_threaded_wait_for_range(&http->waits, http->backing, wait); } static void handler_http_free(struct cch_handler **handler) @@ -106,7 +116,6 @@ struct cch_entry *cch_handler_http_create(str *url, struct nn_event_loop *loop) struct cch_entry *entry = al_alloc_object(struct cch_entry); entry->backing = backing; entry->handler = (struct cch_handler *)http; - entry->unknown_size = false; nn_mutex_init(&entry->mutex); entry->handler->can_seek = handler_http_can_seek; entry->handler->maybe_spawn_worker = handler_http_maybe_spawn_worker; |