From: Wilfried Goesgens Date: Sun, 6 Nov 2011 20:05:46 +0000 (+0100) Subject: add shutdown handlers for libcurl wrapper X-Git-Tag: v8.11~392 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=b5b30adb3ece1aa3de706047de6ba0245eea74fc add shutdown handlers for libcurl wrapper --- diff --git a/citadel/event_client.h b/citadel/event_client.h index 9564e5ba1..dd334f963 100644 --- a/citadel/event_client.h +++ b/citadel/event_client.h @@ -180,12 +180,12 @@ void InitC_ares_dns(AsyncIO *IO); syslog(LOG_ERR, "error setting option " #s " on curl handle: %s", curl_easy_strerror(sta)); \ } } while (0) - -int evcurl_init(AsyncIO *IO, - void *CustomData, - const char* Desc, - IO_CallBack CallBack, - IO_CallBack Terminate); +int evcurl_init(AsyncIO *IO, + void *CustomData, + const char* Desc, + IO_CallBack CallBack, + IO_CallBack Terminate, + IO_CallBack ShutdownAbort); eNextState ReAttachIO(AsyncIO *IO, void *pData, diff --git a/citadel/modules/eventclient/serv_eventclient.c b/citadel/modules/eventclient/serv_eventclient.c index 153f1847e..1bd4c7181 100644 --- a/citadel/modules/eventclient/serv_eventclient.c +++ b/citadel/modules/eventclient/serv_eventclient.c @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include @@ -86,15 +87,13 @@ evcurl_global_data global; static void gotstatus(int nnrun) { - CURLM *mhnd; CURLMsg *msg; int nmsg; global.nrun = nnrun; - mhnd = global.mhnd; syslog(LOG_DEBUG, "CURLEV: gotstatus(): about to call curl_multi_info_read\n"); - while ((msg = curl_multi_info_read(mhnd, &nmsg))) { + while ((msg = curl_multi_info_read(global.mhnd, &nmsg))) { syslog(LOG_ERR, "EVCURL: got curl multi_info message msg=%d\n", msg->msg); if (CURLMSG_DONE == msg->msg) { CURL *chnd; @@ -126,17 +125,18 @@ gotstatus(int nnrun) curl_slist_free_all(IO->HttpReq.headers); - msta = curl_multi_remove_handle(mhnd, chnd); + msta = curl_multi_remove_handle(global.mhnd, chnd); if (msta) EV_syslog(LOG_ERR, "EVCURL: warning problem detaching completed handle from curl multi: %s\n", curl_multi_strerror(msta)); - curl_easy_cleanup(IO->HttpReq.chnd); - IO->HttpReq.chnd = NULL; + ev_cleanup_stop(event_base, &IO->abort_by_shutdown); IO->HttpReq.attached = 0; switch(IO->SendDone(IO)) { case eDBQuery: + curl_easy_cleanup(IO->HttpReq.chnd); + IO->HttpReq.chnd = NULL; break; case eSendDNSQuery: case eReadDNSReply: @@ -148,9 +148,13 @@ gotstatus(int nnrun) case eReadMore: case eReadPayload: case eReadFile: + curl_easy_cleanup(IO->HttpReq.chnd); + IO->HttpReq.chnd = NULL; break; case eTerminateConnection: case eAbort: + curl_easy_cleanup(IO->HttpReq.chnd); + IO->HttpReq.chnd = NULL; FreeStrBuf(&IO->HttpReq.ReplyData); FreeURL(&IO->ConnectMe); RemoveContext(IO->CitContext); @@ -325,11 +329,12 @@ void curl_init_connectionpool(void) -int evcurl_init(AsyncIO *IO, - void *CustomData, +int evcurl_init(AsyncIO *IO, + void *CustomData, const char* Desc, - IO_CallBack CallBack, - IO_CallBack Terminate) + IO_CallBack CallBack, + IO_CallBack Terminate, + IO_CallBack ShutdownAbort) { CURLcode sta; CURL *chnd; @@ -338,6 +343,7 @@ int evcurl_init(AsyncIO *IO, IO->HttpReq.attached = 0; IO->SendDone = CallBack; IO->Terminate = Terminate; + IO->ShutdownAbort = ShutdownAbort; chnd = IO->HttpReq.chnd = curl_easy_init(); if (!chnd) { @@ -353,7 +359,7 @@ int evcurl_init(AsyncIO *IO, OPT(NOSIGNAL, (long)1); OPT(FAILONERROR, (long)1); OPT(ENCODING, ""); - OPT(FOLLOWLOCATION, (long)0); + OPT(FOLLOWLOCATION, (long)1); OPT(MAXREDIRS, (long)7); OPT(USERAGENT, CITADEL); @@ -406,6 +412,26 @@ int evcurl_init(AsyncIO *IO, return 1; } + +static void IOcurl_abort_shutdown_callback(struct ev_loop *loop, ev_cleanup *watcher, int revents) +{ + CURLMcode msta; + AsyncIO *IO = watcher->data; + EV_syslog(LOG_DEBUG, "EVENT Curl: %s\n", __FUNCTION__); + + curl_slist_free_all(IO->HttpReq.headers); + msta = curl_multi_remove_handle(global.mhnd, IO->HttpReq.chnd); + if (msta) + EV_syslog(LOG_ERR, "EVCURL: warning problem detaching completed handle from curl multi: %s\n", curl_multi_strerror(msta)); + + curl_easy_cleanup(IO->HttpReq.chnd); + IO->HttpReq.chnd = NULL; + ev_cleanup_stop(event_base, &IO->abort_by_shutdown); + ev_io_stop(event_base, &IO->recv_event); + ev_io_stop(event_base, &IO->send_event); + assert(IO->ShutdownAbort); + IO->ShutdownAbort(IO); +} eNextState evcurl_handle_start(AsyncIO *IO) { @@ -417,6 +443,9 @@ evcurl_handle_start(AsyncIO *IO) EV_syslog(LOG_ERR, "EVCURL: error attaching to curl multi handle: %s\n", curl_multi_strerror(msta)); IO->HttpReq.attached = 1; ev_async_send (event_base, &WakeupCurl); + ev_cleanup_init(&IO->abort_by_shutdown, + IOcurl_abort_shutdown_callback); + ev_cleanup_start(event_base, &IO->abort_by_shutdown); return eReadMessage; } @@ -525,7 +554,6 @@ void *client_event_thread(void *arg) syslog(LOG_DEBUG, "client_ev_thread() initializing\n"); event_base = ev_default_loop (EVFLAG_AUTO); - ev_async_init(&AddJob, QueueEventAddCallback); ev_async_start(event_base, &AddJob); ev_async_init(&ExitEventLoop, EventExitCallback); @@ -540,7 +568,8 @@ void *client_event_thread(void *arg) ///what todo here? CtdlClearSystemContext(); ev_loop_destroy (EV_DEFAULT_UC); - + curl_global_cleanup(); + curl_multi_cleanup(global.mhnd); DeleteHash(&QueueEvents); InboundEventQueue = NULL; DeleteHash(&InboundEventQueues[0]); diff --git a/citadel/modules/extnotify/funambol65.c b/citadel/modules/extnotify/funambol65.c index 2f6ef6e5c..2d65f20ef 100644 --- a/citadel/modules/extnotify/funambol65.c +++ b/citadel/modules/extnotify/funambol65.c @@ -49,6 +49,7 @@ eNextState EvaluateResult(AsyncIO *IO); eNextState ExtNotifyTerminate(AsyncIO *IO); +eNextState ExtNotifyShutdownAbort(AsyncIO *IO); /* * \brief Sends a message to the Funambol server notifying @@ -156,7 +157,8 @@ int notify_http_server(char *remoteurl, NULL, "Citadel ExtNotify", EvaluateResult, - ExtNotifyTerminate)) + ExtNotifyTerminate, + ExtNotifyShutdownAbort)) { syslog(LOG_ALERT, "Unable to initialize libcurl.\n"); goto abort; @@ -265,3 +267,8 @@ eNextState ExtNotifyTerminate(AsyncIO *IO) free(IO); return eAbort; } +eNextState ExtNotifyShutdownAbort(AsyncIO *IO) +{ + free(IO); + return eAbort; +} diff --git a/citadel/modules/rssclient/serv_rssclient.c b/citadel/modules/rssclient/serv_rssclient.c index 24e3d6097..79ba35c60 100644 --- a/citadel/modules/rssclient/serv_rssclient.c +++ b/citadel/modules/rssclient/serv_rssclient.c @@ -69,7 +69,7 @@ HashList *RSSQueueRooms = NULL; /* rss_room_counter */ HashList *RSSFetchUrls = NULL; /* -> rss_aggregator; ->RefCount access to be locked too. */ eNextState RSSAggregatorTerminate(AsyncIO *IO); - +eNextState RSSAggregatorShutdownAbort(AsyncIO *IO); struct CitContext rss_CC; struct rssnetcfg *rnclist = NULL; @@ -475,7 +475,8 @@ int rss_do_fetching(rss_aggregator *Cfg) NULL, "Citadel RSS Client", ParseRSSReply, - RSSAggregatorTerminate)) + RSSAggregatorTerminate, + RSSAggregatorShutdownAbort)) { syslog(LOG_DEBUG, "Unable to initialize libcurl.\n"); return 0; @@ -532,6 +533,21 @@ eNextState RSSAggregatorTerminate(AsyncIO *IO) EVM_syslog(LOG_DEBUG, "RSS: Terminating.\n"); + UnlinkRSSAggregator(rncptr); + return eAbort; +} +eNextState RSSAggregatorShutdownAbort(AsyncIO *IO) +{ + const char *pUrl; + rss_aggregator *rncptr = (rss_aggregator *)IO->Data; + + pUrl = IO->ConnectMe->PlainUrl; + if (pUrl == NULL) + pUrl = ""; + + EV_syslog(LOG_DEBUG, "RSS: Aborting by shutdown: %s.\n", pUrl); + + UnlinkRSSAggregator(rncptr); return eAbort; } diff --git a/citadel/modules/urldeshortener/serv_expand_shorter_urls.c b/citadel/modules/urldeshortener/serv_expand_shorter_urls.c index dafc0c634..f914d5a43 100644 --- a/citadel/modules/urldeshortener/serv_expand_shorter_urls.c +++ b/citadel/modules/urldeshortener/serv_expand_shorter_urls.c @@ -93,7 +93,11 @@ size_t GetLocationString( void *ptr, size_t size, size_t nmemb, void *userdata) } return size * nmemb; } - +eNextState ShutdownLookuUrl(AsyncIO *IO) +{ +//TOOD + return eAbort; +} eNextState TerminateLookupUrl(AsyncIO *IO) { //TOOD @@ -123,7 +127,8 @@ int LookupUrl(StrBuf *ShorterUrlStr) NULL, "Citadel RSS ShorterURL Expander", LookupUrlResult, - TerminateLookupUrl)) + TerminateLookupUrl, + ShutdownLookuUrl)) { syslog(LOG_ALERT, "Unable to initialize libcurl.\n"); goto shutdown;