asynchronous download of the article content
[prss.git] / src / ttrss_cache.c
index 1526e25..a2af0b0 100644 (file)
 #include <unistd.h>
 
 #include <glib.h>
+#include <pthread.h>
 
 #include "io.h"
 #include "log.h"
 #include "ttrss_cache.h"
 
+static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
 static char *cache_dir;
 
 static const char *get_cache_dir()
@@ -49,13 +51,13 @@ static const char *get_cache_dir()
        return cache_dir;
 }
 
-static gchar *content_get_path(const struct headline *h)
+static gchar *content_get_path(int id)
 {
        const char *cache_dir;
 
        cache_dir = get_cache_dir();
        if (cache_dir)
-               return g_strdup_printf("%s/%d", cache_dir, h->id);
+               return g_strdup_printf("%s/%d", cache_dir, id);
 
        return NULL;
 }
@@ -73,14 +75,17 @@ static void file_set_content(const char *path, const char *content)
        }
 }
 
-void cache_put(const struct headline *h, const char *content)
+void cache_put(int id, const char *content)
 {
        char *path;
 
-       path = content_get_path(h);
-       
-       if (path)
+       path = content_get_path(id);
+
+       if (path) {
+               pthread_mutex_lock(&lock);
                file_set_content(path, content);
+               pthread_mutex_unlock(&lock);
+       }
 
        g_free(path);
 }
@@ -91,12 +96,14 @@ int cache_exists(const struct headline *h)
        char *path;
        int result;
 
-       path = content_get_path(h);
+       path = content_get_path(h->id);
 
+       pthread_mutex_lock(&lock);
        if (stat(path, &s) == -1)
                result = 0;
        else
                result = 1;
+       pthread_mutex_unlock(&lock);
 
        g_free(path);
 
@@ -107,11 +114,15 @@ char *cache_get(const struct headline *h)
 {
        char *content, *path;
 
-       path = content_get_path(h);
-       if (path)
+
+       path = content_get_path(h->id);
+       if (path) {
+               pthread_mutex_lock(&lock);
                content = file_get_content(path);
-       else
+               pthread_mutex_unlock(&lock);
+       } else {
                content = NULL;
+       }
 
        g_free(path);