diff options
author | Martin Schanzenbach <mschanzenbach@posteo.de> | 2020-08-06 23:06:16 +0200 |
---|---|---|
committer | Martin Schanzenbach <mschanzenbach@posteo.de> | 2020-08-06 23:06:16 +0200 |
commit | 7648cde6cfb181f03df9e145a576430220234f5f (patch) | |
tree | 987badd6024e09608b47e72f56052cf79f67b405 /src/rest | |
parent | 19fe8e8ff74a9639fc075f5d974a01a977e1196a (diff) | |
download | gnunet-7648cde6cfb181f03df9e145a576430220234f5f.tar.gz gnunet-7648cde6cfb181f03df9e145a576430220234f5f.zip |
-improve request cleanup handling
Diffstat (limited to 'src/rest')
-rw-r--r-- | src/rest/plugin_rest_config.c | 31 | ||||
-rw-r--r-- | src/rest/plugin_rest_copying.c | 28 |
2 files changed, 56 insertions, 3 deletions
diff --git a/src/rest/plugin_rest_config.c b/src/rest/plugin_rest_config.c index e5d0fffb0..af833efff 100644 --- a/src/rest/plugin_rest_config.c +++ b/src/rest/plugin_rest_config.c | |||
@@ -45,6 +45,16 @@ const struct GNUNET_CONFIGURATION_Handle *cfg; | |||
45 | struct RequestHandle | 45 | struct RequestHandle |
46 | { | 46 | { |
47 | /** | 47 | /** |
48 | * DLL | ||
49 | */ | ||
50 | struct RequestHandle *next; | ||
51 | |||
52 | /** | ||
53 | * DLL | ||
54 | */ | ||
55 | struct RequestHandle *prev; | ||
56 | |||
57 | /** | ||
48 | * Handle to rest request | 58 | * Handle to rest request |
49 | */ | 59 | */ |
50 | struct GNUNET_REST_RequestHandle *rest_handle; | 60 | struct GNUNET_REST_RequestHandle *rest_handle; |
@@ -70,6 +80,17 @@ struct RequestHandle | |||
70 | char *url; | 80 | char *url; |
71 | }; | 81 | }; |
72 | 82 | ||
83 | /** | ||
84 | * DLL | ||
85 | */ | ||
86 | static struct RequestHandle *requests_head; | ||
87 | |||
88 | /** | ||
89 | * DLL | ||
90 | */ | ||
91 | static struct RequestHandle *requests_tail; | ||
92 | |||
93 | |||
73 | 94 | ||
74 | /** | 95 | /** |
75 | * Cleanup request handle. | 96 | * Cleanup request handle. |
@@ -82,6 +103,9 @@ cleanup_handle (struct RequestHandle *handle) | |||
82 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Cleaning up\n"); | 103 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Cleaning up\n"); |
83 | if (NULL != handle->url) | 104 | if (NULL != handle->url) |
84 | GNUNET_free (handle->url); | 105 | GNUNET_free (handle->url); |
106 | GNUNET_CONTAINER_DLL_remove (requests_head, | ||
107 | requests_tail, | ||
108 | handle); | ||
85 | GNUNET_free (handle); | 109 | GNUNET_free (handle); |
86 | } | 110 | } |
87 | 111 | ||
@@ -367,7 +391,9 @@ rest_config_process_request (struct GNUNET_REST_RequestHandle *conndata_handle, | |||
367 | handle->url = GNUNET_strdup (conndata_handle->url); | 391 | handle->url = GNUNET_strdup (conndata_handle->url); |
368 | if (handle->url[strlen (handle->url) - 1] == '/') | 392 | if (handle->url[strlen (handle->url) - 1] == '/') |
369 | handle->url[strlen (handle->url) - 1] = '\0'; | 393 | handle->url[strlen (handle->url) - 1] = '\0'; |
370 | 394 | GNUNET_CONTAINER_DLL_insert (requests_head, | |
395 | requests_tail, | ||
396 | handle); | ||
371 | if (GNUNET_NO == | 397 | if (GNUNET_NO == |
372 | GNUNET_REST_handle_request (conndata_handle, handlers, &err, handle)) | 398 | GNUNET_REST_handle_request (conndata_handle, handlers, &err, handle)) |
373 | { | 399 | { |
@@ -415,8 +441,9 @@ libgnunet_plugin_rest_config_done (void *cls) | |||
415 | struct GNUNET_REST_Plugin *api = cls; | 441 | struct GNUNET_REST_Plugin *api = cls; |
416 | struct Plugin *plugin; | 442 | struct Plugin *plugin; |
417 | 443 | ||
444 | while (NULL != requests_head) | ||
445 | cleanup_handle (requests_head); | ||
418 | plugin = api->cls; | 446 | plugin = api->cls; |
419 | |||
420 | plugin->cfg = NULL; | 447 | plugin->cfg = NULL; |
421 | GNUNET_free (api); | 448 | GNUNET_free (api); |
422 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "CONFIG REST plugin is finished\n"); | 449 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "CONFIG REST plugin is finished\n"); |
diff --git a/src/rest/plugin_rest_copying.c b/src/rest/plugin_rest_copying.c index 1649da3bb..6d074d3d1 100644 --- a/src/rest/plugin_rest_copying.c +++ b/src/rest/plugin_rest_copying.c | |||
@@ -46,6 +46,16 @@ const struct GNUNET_CONFIGURATION_Handle *cfg; | |||
46 | struct RequestHandle | 46 | struct RequestHandle |
47 | { | 47 | { |
48 | /** | 48 | /** |
49 | * DLL | ||
50 | */ | ||
51 | struct RequestHandle *next; | ||
52 | |||
53 | /** | ||
54 | * DLL | ||
55 | */ | ||
56 | struct RequestHandle *prev; | ||
57 | |||
58 | /** | ||
49 | * Handle to rest request | 59 | * Handle to rest request |
50 | */ | 60 | */ |
51 | struct GNUNET_REST_RequestHandle *rest_handle; | 61 | struct GNUNET_REST_RequestHandle *rest_handle; |
@@ -66,6 +76,15 @@ struct RequestHandle | |||
66 | int response_code; | 76 | int response_code; |
67 | }; | 77 | }; |
68 | 78 | ||
79 | /** | ||
80 | * DLL | ||
81 | */ | ||
82 | static struct RequestHandle *requests_head; | ||
83 | |||
84 | /** | ||
85 | * DLL | ||
86 | */ | ||
87 | static struct RequestHandle *requests_tail; | ||
69 | 88 | ||
70 | /** | 89 | /** |
71 | * Cleanup request handle. | 90 | * Cleanup request handle. |
@@ -77,6 +96,9 @@ cleanup_handle (struct RequestHandle *handle) | |||
77 | { | 96 | { |
78 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 97 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
79 | "Cleaning up\n"); | 98 | "Cleaning up\n"); |
99 | GNUNET_CONTAINER_DLL_remove (requests_head, | ||
100 | requests_tail, | ||
101 | handle); | ||
80 | GNUNET_free (handle); | 102 | GNUNET_free (handle); |
81 | } | 103 | } |
82 | 104 | ||
@@ -153,7 +175,9 @@ rest_copying_process_request (struct GNUNET_REST_RequestHandle *conndata_handle, | |||
153 | handle->proc_cls = proc_cls; | 175 | handle->proc_cls = proc_cls; |
154 | handle->proc = proc; | 176 | handle->proc = proc; |
155 | handle->rest_handle = conndata_handle; | 177 | handle->rest_handle = conndata_handle; |
156 | 178 | GNUNET_CONTAINER_DLL_insert (requests_head, | |
179 | requests_tail, | ||
180 | handle); | ||
157 | return GNUNET_REST_handle_request (conndata_handle, | 181 | return GNUNET_REST_handle_request (conndata_handle, |
158 | handlers, | 182 | handlers, |
159 | &err, | 183 | &err, |
@@ -201,6 +225,8 @@ libgnunet_plugin_rest_copying_done (void *cls) | |||
201 | struct GNUNET_REST_Plugin *api = cls; | 225 | struct GNUNET_REST_Plugin *api = cls; |
202 | struct Plugin *plugin = api->cls; | 226 | struct Plugin *plugin = api->cls; |
203 | 227 | ||
228 | while (NULL != requests_head) | ||
229 | cleanup_handle (requests_head); | ||
204 | plugin->cfg = NULL; | 230 | plugin->cfg = NULL; |
205 | GNUNET_free (api); | 231 | GNUNET_free (api); |
206 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 232 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |