From 159db01883ae7e058d1102b8fd0ab7dba95c9d33 Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Mon, 25 Nov 2024 10:40:00 -0500 Subject: Android build, packet stream fixes Signed-off-by: Andrew Opalach --- src/curl/curl.c | 14 +++++++++++--- src/curl/curl.h | 1 + 2 files changed, 12 insertions(+), 3 deletions(-) (limited to 'src/curl') diff --git a/src/curl/curl.c b/src/curl/curl.c index 5560487..b96d46f 100644 --- a/src/curl/curl.c +++ b/src/curl/curl.c @@ -2,6 +2,8 @@ #include "curl.h" +// TODO: https://curl.se/libcurl/c/externalsocket.html + static void curl_socket_action_callback(struct ev_loop *loop, ev_io *w, s32 revents) { (void)loop; @@ -36,10 +38,8 @@ static s32 sock_callback(CURL *e, curl_socket_t s, s32 what, void *cbp, void *so if (!sockp) { curl->sock = s; curl_multi_assign(curl->multi_handle, curl->sock, curl); - set_sock(curl, what); - } else { - set_sock(curl, what); } + set_sock(curl, what); } return 0; } @@ -88,6 +88,7 @@ bool aki_curl_init(struct aki_curl *curl) curl_multi_setopt(curl->multi_handle, CURLMOPT_SOCKETDATA, curl); curl_multi_setopt(curl->multi_handle, CURLMOPT_TIMERFUNCTION, timer_callback); curl_multi_setopt(curl->multi_handle, CURLMOPT_TIMERDATA, curl); + curl->added = false; curl->timer_started = false; curl->loop = NULL; curl->event.data = curl; @@ -107,6 +108,7 @@ void aki_curl_set_url(struct aki_curl *curl, str *url) bool aki_curl_add_handle(struct aki_curl *curl) { + al_assert(!curl->added); // CURLM_RECURSIVE_API_CALL (8) also means we can't even call this // while a callback is running on another thread. CURLMcode mc = curl_multi_add_handle(curl->multi_handle, curl->handle); @@ -114,21 +116,27 @@ bool aki_curl_add_handle(struct aki_curl *curl) al_log_error("curl", "curl_multi_add_handle() failed (%s).", curl_multi_strerror(mc)); return false; } + curl->added = true; return true; } bool aki_curl_remove_handle(struct aki_curl *curl) { + al_assert(curl->added); CURLMcode mc = curl_multi_remove_handle(curl->multi_handle, curl->handle); if (mc != CURLM_OK) { al_log_error("curl", "curl_multi_remove_handle() failed (%s).", curl_multi_strerror(mc)); return false; } + curl->added = false; return true; } void aki_curl_close(struct aki_curl *curl) { + if (curl->handle && curl->multi_handle && curl->added) { + aki_curl_remove_handle(curl); + } if (curl->handle) curl_easy_cleanup(curl->handle); if (curl->multi_handle) curl_multi_cleanup(curl->multi_handle); } diff --git a/src/curl/curl.h b/src/curl/curl.h index 5bb38c0..ce14f3c 100644 --- a/src/curl/curl.h +++ b/src/curl/curl.h @@ -12,6 +12,7 @@ struct aki_curl { struct aki_event_loop *loop; CURL *handle; CURLM *multi_handle; + bool added; curl_socket_t sock; void (*handle_events)(void *, struct aki_curl *); void *userdata; -- cgit v1.2.3-101-g0448