summaryrefslogtreecommitdiff
path: root/src/cache/handlers
diff options
context:
space:
mode:
Diffstat (limited to 'src/cache/handlers')
-rw-r--r--src/cache/handlers/cdio.c5
-rw-r--r--src/cache/handlers/file.c1
-rw-r--r--src/cache/handlers/http.c21
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;