]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/rssclient/serv_rssclient.c
RSS-Client: add missing locks
[citadel.git] / citadel / modules / rssclient / serv_rssclient.c
index 8a3ba63549a5aadacfa2bfd88d0cc25138541a01..68f04ab75daddf83fd0fef6c04c3b4f82cf3ae44 100644 (file)
@@ -5,17 +5,11 @@
  *
  * This program is open source software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 3.
- * 
- * 
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
  * GNU General Public License for more details.
- *
- * 
- * 
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA02111-1307USA
  */
 
 #include <stdlib.h>
@@ -69,6 +63,7 @@ HashList *RSSQueueRooms = NULL; /* rss_room_counter */
 HashList *RSSFetchUrls = NULL; /*->rss_aggregator;->RefCount access locked*/
 
 eNextState RSSAggregator_Terminate(AsyncIO *IO);
+eNextState RSSAggregator_TerminateDB(AsyncIO *IO);
 eNextState RSSAggregator_ShutdownAbort(AsyncIO *IO);
 struct CitContext rss_CC;
 
@@ -129,6 +124,7 @@ void UnlinkRSSAggregator(rss_aggregator *Cfg)
 {
        HashPos *At;
 
+       pthread_mutex_lock(&RSSQueueMutex);
        UnlinkRooms(Cfg);
 
        At = GetNewHashPos(RSSFetchUrls, 0);
@@ -138,6 +134,7 @@ void UnlinkRSSAggregator(rss_aggregator *Cfg)
        }
        DeleteHashPos(&At);
        last_run = time(NULL);
+       pthread_mutex_unlock(&RSSQueueMutex);
 }
 
 void DeleteRssCfg(void *vptr)
@@ -180,6 +177,17 @@ eNextState RSSAggregator_Terminate(AsyncIO *IO)
        return eAbort;
 }
 
+eNextState RSSAggregator_TerminateDB(AsyncIO *IO)
+{
+       rss_aggregator *RSSAggr = (rss_aggregator *)IO->Data;
+
+       EVM_syslog(LOG_DEBUG, "RSS: Terminating.\n");
+
+
+       UnlinkRSSAggregator(RSSAggr);
+       return eAbort;
+}
+
 eNextState RSSAggregator_ShutdownAbort(AsyncIO *IO)
 {
        const char *pUrl;
@@ -294,6 +302,7 @@ int rss_do_fetching(rss_aggregator *Cfg)
                               "Citadel RSS Client",
                               RSSAggregator_ParseReply,
                               RSSAggregator_Terminate,
+                              RSSAggregator_TerminateDB,
                               RSSAggregator_ShutdownAbort))
        {
                syslog(LOG_ALERT, "Unable to initialize libcurl.\n");
@@ -486,6 +495,7 @@ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data)
  * Scan for rooms that have RSS client requests configured
  */
 void rssclient_scan(void) {
+       int RSSRoomCount, RSSCount;
        rss_aggregator *rptr = NULL;
        void *vrptr = NULL;
        HashPos *it;
@@ -495,18 +505,30 @@ void rssclient_scan(void) {
 
        /* Run no more than once every 15 minutes. */
        if ((now - last_run) < 900) {
+               syslog(LOG_DEBUG,
+                       "rssclient: polling interval not yet reached; last run was %ldm%lds ago",
+                       ((now - last_run) / 60),
+                       ((now - last_run) % 60)
+               );
                return;
        }
 
        /*
         * This is a simple concurrency check to make sure only one rssclient
-        * run is done at a time.We could do this with a mutex, but since we
-        * don't really require extremely fine granularity here, we'll do it
-        * with a static variable instead.
+        * run is done at a time.
         */
+       pthread_mutex_lock(&RSSQueueMutex);
+       RSSCount = GetCount(RSSFetchUrls);
+       RSSRoomCount = GetCount(RSSQueueRooms);
+       pthread_mutex_unlock(&RSSQueueMutex);
 
-       if ((GetCount(RSSQueueRooms) > 0) || (GetCount(RSSFetchUrls) > 0))
+       if ((RSSRoomCount > 0) || (RSSCount > 0)) {
+               syslog(LOG_DEBUG,
+                      "rssclient: concurrency check failed; %d rooms and %d url's are queued",
+                      RSSRoomCount, RSSCount
+                       );
                return;
+       }
 
        become_session(&rss_CC);
        syslog(LOG_DEBUG, "rssclient started\n");