gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-quickjs-tart] 04/04: thread safe multi_add_handle + add/cancel qu


From: gnunet
Subject: [taler-quickjs-tart] 04/04: thread safe multi_add_handle + add/cancel queues
Date: Mon, 27 May 2024 21:47:45 +0200

This is an automated email from the git hooks/post-receive script.

ivan-avalos pushed a commit to branch master
in repository quickjs-tart.

commit cae2f55bb924a2395dafe8fec60090b10468d40a
Author: Iván Ávalos <avalos@disroot.org>
AuthorDate: Mon May 27 12:27:50 2024 -0600

    thread safe multi_add_handle + add/cancel queues
---
 quickjs/quickjs-http.c | 45 ++++++++++++++++++++++++++++++---------------
 1 file changed, 30 insertions(+), 15 deletions(-)

diff --git a/quickjs/quickjs-http.c b/quickjs/quickjs-http.c
index 638e4b6..cabb6c2 100644
--- a/quickjs/quickjs-http.c
+++ b/quickjs/quickjs-http.c
@@ -37,11 +37,15 @@ struct CurlClientState {
     CURLM *curlm;
     int last_request_id;
     struct list_head request_list; /* list of CurlRequestState.link */
+    struct list_head add_queue;    /* multi_add_handle queue */
+    struct list_head cancel_queue; /* multi_remove_handle queue */
 };
 
 struct CurlRequestState {
     struct CurlClientState *ccs;
-    struct list_head link;
+    struct list_head link_req;    /* for request_list */
+    struct list_head link_add;    /* for add_queue */
+    struct list_head link_cancel; /* for cancel_queue */
     DynBuf response_data;
     BOOL cancelled;
     CURL *curl;
@@ -66,7 +70,7 @@ static void destroy_curl_request_state(struct 
CurlRequestState *crs)
     ccs = crs->ccs;
     crs->ccs = NULL;
 
-    list_del(&crs->link);
+    list_del(&crs->link_req);
     curl_slist_free_all(crs->req_headers);
     curl_slist_free_all(crs->resp_headers);
     dbuf_free(&crs->response_data);
@@ -302,10 +306,10 @@ create_impl(void *cls, struct JSHttpRequestInfo *req_info)
     curl_easy_setopt(curl, CURLOPT_HTTPHEADER, crs->req_headers);
 
     pthread_mutex_lock(&ccs->mutex);
-    list_add_tail(&crs->link, &ccs->request_list);
+    list_add_tail(&crs->link_add, &ccs->add_queue);
+    list_add_tail(&crs->link_req, &ccs->request_list);
     pthread_mutex_unlock(&ccs->mutex);
 
-    curl_multi_add_handle(ccs->curlm, curl);
     curl_multi_wakeup(ccs->curlm);
 
     return crs->request_id;
@@ -332,9 +336,9 @@ destroy_impl(void *cls, int request_id)
     pthread_mutex_lock(&ccs->mutex);
 
     list_for_each(el, &ccs->request_list) {
-        struct CurlRequestState *crs = list_entry(el, struct CurlRequestState, 
link);
-        if (crs->request_id == request_id) {
-          crs->cancelled = TRUE;
+        struct CurlRequestState *crs = list_entry(el, struct CurlRequestState, 
link_req);
+        if (crs->request_id == request_id && !crs->cancelled) {
+            list_add_tail(&crs->link_cancel, &ccs->cancel_queue);
         }
     }
 
@@ -382,14 +386,23 @@ curl_multi_thread_run(void *cls)
         }
 
         do {
-            // Remove cancelled requests in queue
+
+            // Add new requests in queue
+            pthread_mutex_lock(&ccs->mutex);
+            list_for_each_safe(el, el1, &ccs->add_queue) {
+                struct CurlRequestState *crs = list_entry(el, struct 
CurlRequestState, link_add);
+                curl_multi_add_handle(ccs->curlm, crs->curl);
+                list_del(el);
+            }
+            pthread_mutex_unlock(&ccs->mutex);
+
+            // Cancel requests in queue
             pthread_mutex_lock(&ccs->mutex);
-            list_for_each_safe(el, el1, &ccs->request_list) {
-                struct CurlRequestState *crs = list_entry(el, struct 
CurlRequestState, link);
-                if (crs->cancelled) {
-                    curl_multi_remove_handle(ccs->curlm, crs->curl);
-                    list_del(el);
-                }
+            list_for_each_safe(el, el1, &ccs->cancel_queue) {
+                struct CurlRequestState *crs = list_entry(el, struct 
CurlRequestState, link_cancel);
+                curl_multi_remove_handle(ccs->curlm, crs->curl);
+                crs->cancelled = TRUE;
+                list_del(el);
             }
             pthread_mutex_unlock(&ccs->mutex);
 
@@ -437,6 +450,8 @@ js_curl_http_client_create()
       goto error;
     }
     init_list_head(&ccs->request_list);
+    init_list_head(&ccs->add_queue);
+    init_list_head(&ccs->cancel_queue);
 
     curl_share_setopt(ccs->curlsh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
     curl_share_setopt(ccs->curlsh, CURLSHOPT_SHARE, 
CURL_LOCK_DATA_SSL_SESSION);
@@ -493,7 +508,7 @@ destroy_client_state(struct CurlClientState *ccs)
     }
     pthread_mutex_lock(&ccs->mutex);
     list_for_each_safe(el, el1, &ccs->request_list) {
-        struct CurlRequestState *crs = list_entry(el, struct CurlRequestState, 
link);
+        struct CurlRequestState *crs = list_entry(el, struct CurlRequestState, 
link_req);
         destroy_curl_request_state(crs);
     }
     pthread_mutex_unlock(&ccs->mutex);

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]