X-Git-Url: https://git.wpitchoune.net/gitweb/?p=prss.git;a=blobdiff_plain;f=src%2Fttrss_wsasync.c;h=35e42e745229c16be4d9a4e1b3033f590a3e62d3;hp=cb30f84a695111003f8043bb0d852f8de3203fc4;hb=03759c1d9512afb87624c268481d5c9c499e8275;hpb=09bcceb88ae4a548c573098fc35a884fe0cc96ad diff --git a/src/ttrss_wsasync.c b/src/ttrss_wsasync.c index cb30f84..35e42e7 100644 --- a/src/ttrss_wsasync.c +++ b/src/ttrss_wsasync.c @@ -17,6 +17,7 @@ * 02110-1301 USA */ +#include #include #include @@ -29,15 +30,31 @@ #include "ttrss_ws.h" #include "ttrss_wsasync.h" +struct async_request { + void *data; + struct json_object *request; + void (*callback)(struct json_object *, void *); +}; + static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; -static struct json_object **requests; +static struct async_request **requests; static pthread_t *thread; -void *loop() +static void async_request_free(struct async_request *rq) +{ + if (rq) { + if (rq->request) + json_object_put(rq->request); + free(rq); + } +} + +static void *loop() { - struct json_object **tmp, **cur, *rp, *rq; + struct json_object *rp; + struct async_request **tmp, **cur, *rq; while (1) { log_debug("loop()"); @@ -55,12 +72,17 @@ void *loop() cur = tmp; while (*cur) { rq = *cur; - rp = ws_execute(rq); - json_object_put(rq); + rp = ws_execute(rq->request); + + if (rq->callback) + rq->callback(rp, rq->data); + + async_request_free(rq); if (rp) json_object_put(rp); + cur++; - usleep(100000); + usleep(500000); } free(tmp); } @@ -72,24 +94,79 @@ void *loop() pthread_exit(NULL); } -void ws_async_set_article_unread(int id, int unread) +static struct async_request * +add_async_request(struct json_object *rq, + void (*callback)(struct json_object *, void *data), + void *data) { - struct json_object *rq, **tmp; - - log_debug("ws_async_set_article_unread(%d,%d)", id, unread); - - rq = ws_request_new_set_article_unread(id, unread); + struct async_request *async_rq; + struct async_request **tmp; pthread_mutex_lock(&lock); if (!thread) { thread = malloc(sizeof(pthread_t)); pthread_create(thread, NULL, loop, NULL); } + pthread_mutex_unlock(&lock); - tmp = (struct json_object **)list_add((void **)requests, rq); + async_rq = malloc(sizeof(struct async_request)); + async_rq->request = rq; + async_rq->data = data; + async_rq->callback = callback; + + pthread_mutex_lock(&lock); + tmp = (struct async_request **)list_add((void **)requests, async_rq); list_free((void **)requests); requests = tmp; pthread_mutex_unlock(&lock); + return async_rq; +} + +void ws_async_set_article_unread(int id, int unread) +{ + struct json_object *rq; + + log_debug("ws_async_set_article_unread(%d,%d)", id, unread); + + rq = ws_request_new_set_article_unread(id, unread); + + add_async_request(rq, NULL, NULL); + log_debug("ws_async_set_article_unread(%d,%d) done", id, unread); } + +struct cbk_data { + int id; + void (*callback)(int id, const char *); +}; + +void async_article_content_cbk(struct json_object *rp, void *userdata) +{ + struct cbk_data *data; + + data = userdata; + + log_debug("async_article_content_cbk %d\n", data->id); + + if (data->callback) + data->callback(data->id, ws_reply_get_article_content(rp)); + + free(data); +} + + +void +ws_async_get_article_content(int id, void (*callback)(int id, const char *)) +{ + struct json_object *rq; + struct cbk_data *data; + + rq = ws_request_new_get_article_content(id); + + data = malloc(sizeof(struct cbk_data)); + data->id = id; + data->callback = callback; + + add_async_request(rq, async_article_content_cbk, data); +}