From: Wilfried Goesgens Date: Sun, 10 Jul 2011 13:40:38 +0000 (+0000) Subject: finalize allocation & freeing of rss stuff X-Git-Tag: v8.11~1030 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=67d954e97ccee1cd9c9ae8a969eece1383a04d46 finalize allocation & freeing of rss stuff --- diff --git a/citadel/event_client.h b/citadel/event_client.h index 4a8b0f02f..5939ad914 100644 --- a/citadel/event_client.h +++ b/citadel/event_client.h @@ -147,6 +147,7 @@ void InitC_ares_dns(AsyncIO *IO); int evcurl_init(AsyncIO *IO, void *CustomData, const char* Desc, - IO_CallBack CallBack); + IO_CallBack CallBack, + IO_CallBack Terminate); void evcurl_handle_start(AsyncIO *IO); diff --git a/citadel/modules/eventclient/serv_eventclient.c b/citadel/modules/eventclient/serv_eventclient.c index 6f95a6cf0..05f8e6f1c 100644 --- a/citadel/modules/eventclient/serv_eventclient.c +++ b/citadel/modules/eventclient/serv_eventclient.c @@ -144,7 +144,7 @@ gotstatus(evcurl_global_data *global, int nnrun) FreeStrBuf(&IO->HttpReq.ReplyData); FreeURL(&IO->ConnectMe); RemoveContext(IO->CitContext); - free(IO); + IO->Terminate(IO); } } } @@ -272,7 +272,8 @@ void curl_init_connectionpool(void) int evcurl_init(AsyncIO *IO, void *CustomData, const char* Desc, - IO_CallBack CallBack) + IO_CallBack CallBack, + IO_CallBack Terminate) { CURLcode sta; CURL *chnd; @@ -280,6 +281,7 @@ int evcurl_init(AsyncIO *IO, CtdlLogPrintf(CTDL_DEBUG,"EVCURL: evcurl_init called ms\n"); IO->HttpReq.attached = 0; IO->SendDone = CallBack; + IO->Terminate = Terminate; chnd = IO->HttpReq.chnd = curl_easy_init(); if (!chnd) { @@ -477,7 +479,7 @@ void *client_event_thread(void *arg) ev_run (event_base, 0); - CtdlClearSystemContext(); +///what todo here? CtdlClearSystemContext(); ev_loop_destroy (EV_DEFAULT_UC); DeleteHash(&QueueEvents); @@ -505,6 +507,8 @@ HashList *DBInboundEventQueues[2] = { NULL, NULL }; ev_async DBAddJob; ev_async DBExitEventLoop; +extern void ShutDownDBCLient(AsyncIO *IO); + static void DBQueueEventAddCallback(EV_P_ ev_async *w, int revents) { HashList *q; @@ -530,7 +534,15 @@ static void DBQueueEventAddCallback(EV_P_ ev_async *w, int revents) while (GetNextHashPos(q, It, &len, &Key, &v)) { IOAddHandler *h = v; - h->EvAttch(h->IO); + eNextState rc; + rc = h->EvAttch(h->IO); + switch (rc) + { + case eAbort: + ShutDownDBCLient(h->IO); + default: + break; + } } DeleteHashPos(&It); DeleteHashContent(&q); @@ -540,9 +552,8 @@ static void DBQueueEventAddCallback(EV_P_ ev_async *w, int revents) static void DBEventExitCallback(EV_P_ ev_async *w, int revents) { - ev_break(event_db, EVBREAK_ALL); - CtdlLogPrintf(CTDL_DEBUG, "EVENT Q exiting.\n"); + ev_break(event_db, EVBREAK_ALL); } @@ -590,7 +601,7 @@ void *db_event_thread(void *arg) ev_run (event_db, 0); - CtdlClearSystemContext(); +//// what to do here? CtdlClearSystemContext(); ev_loop_destroy (event_db); DeleteHash(&DBQueueEvents); diff --git a/citadel/modules/extnotify/funambol65.c b/citadel/modules/extnotify/funambol65.c index a3c744ece..f81b41dbf 100644 --- a/citadel/modules/extnotify/funambol65.c +++ b/citadel/modules/extnotify/funambol65.c @@ -48,6 +48,7 @@ #include "extnotify.h" eNextState EvaluateResult(AsyncIO *IO); +eNextState ExtNotifyTerminate(AsyncIO *IO); /* * \brief Sends a message to the Funambol server notifying @@ -154,7 +155,8 @@ int notify_http_server(char *remoteurl, // Ctx, NULL, "Citadel ExtNotify", - EvaluateResult)) + EvaluateResult, + ExtNotifyTerminate)) { CtdlLogPrintf(CTDL_ALERT, "Unable to initialize libcurl.\n"); goto abort; @@ -256,3 +258,9 @@ eNextState EvaluateResult(AsyncIO *IO) ///FreeStrBuf (&ReplyBuf); return 0; } + +eNextState ExtNotifyTerminate(AsyncIO *IO) +{ + free(IO); + return eAbort; +} diff --git a/citadel/modules/rssclient/rss_atom_parser.c b/citadel/modules/rssclient/rss_atom_parser.c index e86d30b84..bed68587c 100644 --- a/citadel/modules/rssclient/rss_atom_parser.c +++ b/citadel/modules/rssclient/rss_atom_parser.c @@ -679,7 +679,7 @@ shutdown: } -void rss_cleanup(void) +void rss_parser_cleanup(void) { DeleteHash(&StartHandlers); DeleteHash(&EndHandlers); @@ -773,7 +773,7 @@ CTDL_MODULE_INIT(rssparser) /* we don't like these namespaces because of they shadow our usefull parameters. */ Put(KnownNameSpaces, HKEY("http://search.yahoo.com/mrss/"), NULL, reference_free_handler); #endif - CtdlRegisterCleanupHook(rss_cleanup); + CtdlRegisterCleanupHook(rss_parser_cleanup); } return "rssparser"; } diff --git a/citadel/modules/rssclient/rss_atom_parser.h b/citadel/modules/rssclient/rss_atom_parser.h index e6deb8a8a..b5bd79c4b 100644 --- a/citadel/modules/rssclient/rss_atom_parser.h +++ b/citadel/modules/rssclient/rss_atom_parser.h @@ -81,7 +81,7 @@ struct rss_aggregator { rss_item *Item; - rss_xml_handler *Current; + const rss_xml_handler *Current; }; diff --git a/citadel/modules/rssclient/serv_rssclient.c b/citadel/modules/rssclient/serv_rssclient.c index d62798cfa..438332109 100644 --- a/citadel/modules/rssclient/serv_rssclient.c +++ b/citadel/modules/rssclient/serv_rssclient.c @@ -66,6 +66,7 @@ citthread_mutex_t RSSQueueMutex; /* locks the access to the following vars: */ HashList *RSSQueueRooms = NULL; /* rss_room_counter */ HashList *RSSFetchUrls = NULL; /* -> rss_aggregator; ->RefCount access to be locked too. */ +eNextState RSSAggregatorTerminate(AsyncIO *IO); struct rssnetcfg *rnclist = NULL; @@ -101,17 +102,20 @@ void DeleteRoomReference(long QRnumber) HashPos *At; long HKLen; const char *HK; - void *vData; + void *vData = NULL; rss_room_counter *pRoomC; At = GetNewHashPos(RSSQueueRooms, 0); GetHashPosFromKey(RSSQueueRooms, LKEY(QRnumber), At); GetHashPos(RSSQueueRooms, At, &HKLen, &HK, &vData); - pRoomC = (rss_room_counter *) vData; - pRoomC->count --; - if (pRoomC->count == 0) - DeleteEntryFromHash(RSSQueueRooms, At); + if (vData != NULL) + { + pRoomC = (rss_room_counter *) vData; + pRoomC->count --; + if (pRoomC->count == 0) + DeleteEntryFromHash(RSSQueueRooms, At); + } DeleteHashPos(&At); } @@ -169,6 +173,7 @@ eNextState FreeNetworkSaveMessage (AsyncIO *IO) CtdlFreeMessage(Ctx->Msg); free_recipients(Ctx->recp); + FreeStrBuf(&Ctx->Message); FreeStrBuf(&Ctx->MsgGUID); free(Ctx); return eAbort; @@ -176,7 +181,7 @@ eNextState FreeNetworkSaveMessage (AsyncIO *IO) eNextState AbortNetworkSaveMessage (AsyncIO *IO) { - return eAbort; ///TODO + return eAbort; ///TODO } eNextState RSSSaveMessage(AsyncIO *IO) @@ -215,7 +220,7 @@ eNextState FetchNetworkUsetableEntry(AsyncIO *IO) cdb_store(CDB_USETABLE, SKEY(Ctx->MsgGUID), &Ctx->ut, sizeof(struct UseTable) ); - return eTerminateConnection; + return eAbort; } else #endif @@ -433,7 +438,8 @@ int rss_do_fetching(rss_aggregator *Cfg) // Ctx, NULL, "Citadel RSS Client", - ParseRSSReply)) + ParseRSSReply, + RSSAggregatorTerminate)) { CtdlLogPrintf(CTDL_ALERT, "Unable to initialize libcurl.\n"); return 0; @@ -451,9 +457,59 @@ void DeleteRssCfg(void *vptr) FreeStrBuf(&rncptr->Url); FreeStrBuf(&rncptr->rooms); + FreeStrBuf(&rncptr->CData); + FreeStrBuf(&rncptr->Key); + + DeleteHash(&rncptr->OtherQRnumbers); + + if (rncptr->Item != NULL) + { + FreeStrBuf(&rncptr->Item->guid); + FreeStrBuf(&rncptr->Item->title); + FreeStrBuf(&rncptr->Item->link); + FreeStrBuf(&rncptr->Item->linkTitle); + FreeStrBuf(&rncptr->Item->reLink); + FreeStrBuf(&rncptr->Item->reLinkTitle); + FreeStrBuf(&rncptr->Item->description); + FreeStrBuf(&rncptr->Item->channel_title); + FreeStrBuf(&rncptr->Item->author_or_creator); + FreeStrBuf(&rncptr->Item->author_url); + FreeStrBuf(&rncptr->Item->author_email); + + free(rncptr->Item); + } free(rncptr); } +eNextState RSSAggregatorTerminate(AsyncIO *IO) +{ + rss_aggregator *rncptr = (rss_aggregator *)IO->Data; + HashPos *At; + long HKLen; + const char *HK; + void *vData; + + citthread_mutex_lock(&RSSQueueMutex); + rncptr->RefCount --; + if (rncptr->RefCount == 0) + { + UnlinkAggregator(rncptr); + + } + citthread_mutex_unlock(&RSSQueueMutex); +/* + At = GetNewHashPos(RSSFetchUrls, 0); + + citthread_mutex_lock(&RSSQueueMutex); + GetHashPosFromKey(RSSFetchUrls, SKEY(rncptr->Url), At); + GetHashPos(RSSFetchUrls, At, &HKLen, &HK, &vData); + DeleteEntryFromHash(RSSFetchUrls, At); + citthread_mutex_unlock(&RSSQueueMutex); + + DeleteHashPos(&At); +*/ + return eAbort; +} /* * Scan a room's netconfig to determine whether it is requesting any RSS feeds @@ -477,7 +533,10 @@ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data) citthread_mutex_lock(&RSSQueueMutex); if (GetHash(RSSQueueRooms, LKEY(qrbuf->QRnumber), &vptr)) { - //CtdlLogPrintf(CTDL_DEBUG, "rssclient: %s already in progress.\n", qrbuf->QRname); + CtdlLogPrintf(CTDL_DEBUG, + "rssclient: [%ld] %s already in progress.\n", + qrbuf->QRnumber, + qrbuf->QRname); citthread_mutex_unlock(&RSSQueueMutex); return; } @@ -560,8 +619,6 @@ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data) if (use_this_rncptr->roomlist_parts == 1) { use_this_rncptr->OtherQRnumbers = NewHash(1, lFlathash); - -//// TODO add reference here! } QRnumber = (long*)malloc(sizeof(long)); *QRnumber = qrbuf->QRnumber; @@ -587,6 +644,8 @@ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data) { Count->QRnumber = qrbuf->QRnumber; citthread_mutex_lock(&RSSQueueMutex); + CtdlLogPrintf(CTDL_DEBUG, "rssclient: [%ld] %s now starting.\n", + qrbuf->QRnumber, qrbuf->QRname); Put(RSSQueueRooms, LKEY(qrbuf->QRnumber), Count, NULL); citthread_mutex_unlock(&RSSQueueMutex); } @@ -626,9 +685,7 @@ void rssclient_scan(void) { rptr = (rss_aggregator *)vrptr; if (rptr->RefCount == 0) if (!rss_do_fetching(rptr)) - { - /// TODO: flush me. - } + UnlinkAggregator(rptr); } DeleteHashPos(&it); citthread_mutex_unlock(&RSSQueueMutex); @@ -638,7 +695,7 @@ void rssclient_scan(void) { return; } -void RSSCleanup(void) +void rss_cleanup(void) { citthread_mutex_destroy(&RSSQueueMutex); DeleteHash(&RSSFetchUrls); @@ -651,10 +708,11 @@ CTDL_MODULE_INIT(rssclient) if (threading) { citthread_mutex_init(&RSSQueueMutex, NULL); - RSSQueueRooms = NewHash(1, Flathash); + RSSQueueRooms = NewHash(1, lFlathash); RSSFetchUrls = NewHash(1, NULL); CtdlLogPrintf(CTDL_INFO, "%s\n", curl_version()); CtdlRegisterSessionHook(rssclient_scan, EVT_TIMER); + CtdlRegisterCleanupHook(rss_cleanup); } return "rssclient"; } diff --git a/citadel/modules/urldeshortener/serv_expand_shorter_urls.c b/citadel/modules/urldeshortener/serv_expand_shorter_urls.c index 3c3b11a2a..7dc209668 100644 --- a/citadel/modules/urldeshortener/serv_expand_shorter_urls.c +++ b/citadel/modules/urldeshortener/serv_expand_shorter_urls.c @@ -93,7 +93,10 @@ size_t GetLocationString( void *ptr, size_t size, size_t nmemb, void *userdata) return size * nmemb; } - +eNextState TerminateLookupUrl(AsyncIO *IO) +{ +//TOOD +} eNextState LookupUrlResult(AsyncIO *IO) { return eTerminateConnection; /// /TODO @@ -117,7 +120,8 @@ int LookupUrl(StrBuf *ShorterUrlStr) // Ctx, NULL, "Citadel RSS ShorterURL Expander", - LookupUrlResult)) + LookupUrlResult, + TerminateLookupUrl)) { CtdlLogPrintf(CTDL_ALERT, "Unable to initialize libcurl.\n"); goto shutdown;