Browse Source

Implemented the helper thread.

default 2 years ago
parent
commit
8bb7582062
3 changed files with 38 additions and 4 deletions
  1. 1 1
      Makefile
  2. 4 2
      TODO.md
  3. 33 1
      httpd.c

+ 1 - 1
Makefile

@@ -3,7 +3,7 @@ CFLAGS=-g -Wall
 all: snac
 
 snac: snac.o main.o data.o http.o httpd.o webfinger.o activitypub.o html.o
-	$(CC) -L/usr/local/lib *.o -lcurl -lcrypto -o $@
+	$(CC) -L/usr/local/lib *.o -lcurl -lcrypto -pthread -o $@
 
 .c.o:
 	$(CC) $(CFLAGS) -I/usr/local/include -c $<

+ 4 - 2
TODO.md

@@ -2,14 +2,14 @@
 
 ## Open
 
-Implement the helper thread.
-
 Import the man pages.
 
 Implement the 'init' command-line option.
 
 Implement the 'adduser' command-line option.
 
+Implement the local timeline cache.
+
 Show dates in local time and not UTC.
 
 Add web interface for private messages.
@@ -131,3 +131,5 @@ Add a user configuration flag to hide likes from the timeline (2022-10-01T20:27:
 Implement an input queue (2022-10-01T20:27:52+0200).
 
 Refactor HTML rendering because it's a mess and write build_timeline(), that generates a big structure with everything to show in a timeline, to be passed to the HTML renderer (2022-10-01T20:27:52+0200).
+
+Implement the helper thread (2022-10-01T20:56:46+0200).

+ 33 - 1
httpd.c

@@ -11,6 +11,7 @@
 #include "snac.h"
 
 #include <setjmp.h>
+#include <pthread.h>
 
 /* susie.png */
 const char *susie =
@@ -199,12 +200,41 @@ void term_handler(int s)
 }
 
 
+static void *helper_thread(void *arg)
+/* helper thread (queue management) */
+{
+    srv_log(xs_fmt("subthread start"));
+
+    while (srv_running) {
+        xs *list = user_list();
+        char *p, *uid;
+
+        p = list;
+        while (xs_list_iter(&p, &uid)) {
+            snac snac;
+
+            if (user_open(&snac, uid)) {
+                process_queue(&snac);
+                user_free(&snac);
+            }
+        }
+
+        sleep(3);
+    }
+
+    srv_log(xs_fmt("subthread stop"));
+
+    return NULL;
+}
+
+
 void httpd(void)
 /* starts the server */
 {
     char *address;
     int port;
     int rs;
+    pthread_t htid;
 
     address = xs_dict_get(srv_config, "address");
     port    = xs_number_get(xs_dict_get(srv_config, "port"));
@@ -222,6 +252,8 @@ void httpd(void)
 
     srv_log(xs_fmt("httpd start %s:%d", address, port));
 
+    pthread_create(&htid, NULL, helper_thread, NULL);
+
     if (setjmp(on_break) == 0) {
         for (;;) {
             httpd_connection(rs);
@@ -231,7 +263,7 @@ void httpd(void)
     srv_running = 0;
 
     /* wait for the helper thread to end */
-    /* ... */
+    pthread_join(htid, NULL);
 
     srv_log(xs_fmt("httpd stop %s:%d", address, port));
 }