summaryrefslogtreecommitdiffstats
path: root/src/blogc-make/httpd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/blogc-make/httpd.c')
-rw-r--r--src/blogc-make/httpd.c121
1 files changed, 0 insertions, 121 deletions
diff --git a/src/blogc-make/httpd.c b/src/blogc-make/httpd.c
deleted file mode 100644
index c352da0..0000000
--- a/src/blogc-make/httpd.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * blogc: A blog compiler.
- * Copyright (C) 2014-2020 Rafael G. Martins <rafael@rafaelmartins.eng.br>
- *
- * This program can be distributed under the terms of the BSD License.
- * See the file LICENSE.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <pthread.h>
-#include <unistd.h>
-#include "../common/utils.h"
-#include "ctx.h"
-#include "exec.h"
-#include "reloader.h"
-#include "httpd.h"
-
-// we are not going to unit-test these functions, then printing errors
-// directly is not a big issue
-
-
-typedef struct {
- bm_ctx_t *ctx;
- bc_trie_t *args;
-} bm_httpd_t;
-
-static pthread_mutex_t mutex_httpd_starting = PTHREAD_MUTEX_INITIALIZER;
-static bool httpd_starting = false;
-
-
-static void*
-httpd_thread(void *arg)
-{
- bm_httpd_t *httpd = arg;
-
- pthread_mutex_lock(&mutex_httpd_starting);
- httpd_starting = true;
- pthread_mutex_unlock(&mutex_httpd_starting);
-
- int rv = bm_exec_blogc_runserver(httpd->ctx, bc_trie_lookup(httpd->args, "host"),
- bc_trie_lookup(httpd->args, "port"), bc_trie_lookup(httpd->args, "threads"));
-
- pthread_mutex_lock(&mutex_httpd_starting);
- httpd_starting = false;
- pthread_mutex_unlock(&mutex_httpd_starting);
-
- free(httpd);
-
- // stop the reloader
- bm_reloader_stop(rv);
-
- return NULL;
-}
-
-
-int
-bm_httpd_run(bm_ctx_t **ctx, bm_rule_exec_func_t rule_exec, bc_slist_t *outputs,
- bc_trie_t *args)
-{
- pthread_mutex_lock(&mutex_httpd_starting);
- bool starting = httpd_starting;
- pthread_mutex_unlock(&mutex_httpd_starting);
-
- if (starting) {
- fprintf(stderr, "blogc-make: error: httpd already running\n");
- return 1;
- }
-
- int err;
-
- pthread_attr_t attr;
- if (0 != (err = pthread_attr_init(&attr))) {
- fprintf(stderr, "blogc-make: error: failed to initialize httpd "
- "thread attributes: %s\n", strerror(err));
- return 1;
- }
-
- // we run the thread detached, because we don't want to wait it to join
- // before exiting. the OS can clean it properly
- if (0 != (err = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED))) {
- fprintf(stderr, "blogc-make: error: failed to mark httpd thread as "
- "detached: %s\n", strerror(err));
- return 1;
- }
-
- bm_httpd_t *rv = bc_malloc(sizeof(bm_httpd_t));
- rv->ctx = *ctx;
- rv->args = args;
-
- pthread_t thread;
- if (0 != (err = pthread_create(&thread, &attr, httpd_thread, rv))) {
- fprintf(stderr, "blogc-make: error: failed to create httpd "
- "thread: %s\n", strerror(err));
- free(rv);
- return 1;
- }
-
- // we could use some pthread_*_timedwait() apis here, but I decided to
- // just use simple mutexes for the sake of portability.
- size_t count = 0;
- while (true) {
- pthread_mutex_lock(&mutex_httpd_starting);
- starting = httpd_starting;
- pthread_mutex_unlock(&mutex_httpd_starting);
-
- if (starting)
- break;
-
- if (++count > 100) {
- fprintf(stderr, "blogc-make: error: failed to start httpd thread: "
- "too many retries\n");
- // rv will leak, but it is not safe to free here
- return 1;
- }
- usleep(100000);
- }
-
- return bm_reloader_run(ctx, rule_exec, outputs, args);
-}