twister

HTTP fault injector for testing
Log | Files | Refs | README | LICENSE

commit 15ea1c1ddbbcdf2b780c612bb49edbc8ccc42dcb
parent 86df5df0a89acd80ea3532d2e82db363166c875d
Author: Marcello Stanisci <stanisci.m@gmail.com>
Date:   Tue,  5 Jun 2018 10:39:36 +0200

Undo 9dc679300003ee9..

It is never good to make the Twister block using
a function that does not belong to the GNUnet
scheduler.

This way, the scheduler would ignore all signals
and requests from Twister clients, and possibly
behave unexpectedly in other contexts.

Diffstat:
Msrc/twister/taler-twister-service.c | 78+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 67 insertions(+), 11 deletions(-)

diff --git a/src/twister/taler-twister-service.c b/src/twister/taler-twister-service.c @@ -561,20 +561,76 @@ curl_task_download (void *cls); static void curl_download_prepare () { - int numfds; - - curl_multi_wait (curl_multi, - NULL, - 0, - 1000, // millisecs. - &numfds); + CURLMcode mret; + fd_set rs; + fd_set ws; + fd_set es; + int max; + struct GNUNET_NETWORK_FDSet *grs; + struct GNUNET_NETWORK_FDSet *gws; + long to; + struct GNUNET_TIME_Relative rtime; - curl_download_task = GNUNET_SCHEDULER_add_now - (&curl_task_download, - curl_multi); + if (NULL != curl_download_task) + { + GNUNET_SCHEDULER_cancel (curl_download_task); + curl_download_task = NULL; + } + max = -1; + FD_ZERO (&rs); + FD_ZERO (&ws); + FD_ZERO (&es); + if (CURLM_OK != (mret = curl_multi_fdset (curl_multi, + &rs, + &ws, + &es, + &max))) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "%s failed at %s:%d: `%s'\n", + "curl_multi_fdset", + __FILE__, + __LINE__, + curl_multi_strerror (mret)); + return; + } + to = -1; + GNUNET_break (CURLM_OK == + curl_multi_timeout (curl_multi, + &to)); + if (-1 == to) + rtime = GNUNET_TIME_UNIT_FOREVER_REL; + else + rtime = GNUNET_TIME_relative_multiply + (GNUNET_TIME_UNIT_MILLISECONDS, to); + if (-1 != max) + { + grs = GNUNET_NETWORK_fdset_create (); + gws = GNUNET_NETWORK_fdset_create (); + GNUNET_NETWORK_fdset_copy_native (grs, + &rs, + max + 1); + GNUNET_NETWORK_fdset_copy_native (gws, + &ws, + max + 1); + curl_download_task = GNUNET_SCHEDULER_add_select + (GNUNET_SCHEDULER_PRIORITY_DEFAULT, + rtime, + grs, gws, + &curl_task_download, + curl_multi); + GNUNET_NETWORK_fdset_destroy (gws); + GNUNET_NETWORK_fdset_destroy (grs); + } + else + { + curl_download_task = GNUNET_SCHEDULER_add_delayed + (rtime, + &curl_task_download, + curl_multi); + } } - /** * Task that is run when we are ready to receive * more data from curl.