aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael G. Martins <rafael@rafaelmartins.eng.br>2017-02-27 01:41:08 +0100
committerRafael G. Martins <rafael@rafaelmartins.eng.br>2017-02-27 01:41:08 +0100
commit4850ccea251fe5e0f0c458f9bd6574d8b8d034c0 (patch)
treeb1bf624e4b579a14d3bff255ed92d3565b868f0f
parent57bcec6cac7535c4cb06814c95a92ffd23fddc06 (diff)
downloadblogc-4850ccea251fe5e0f0c458f9bd6574d8b8d034c0.tar.gz
blogc-4850ccea251fe5e0f0c458f9bd6574d8b8d034c0.tar.bz2
blogc-4850ccea251fe5e0f0c458f9bd6574d8b8d034c0.zip
make: improved runserver thread handling
-rw-r--r--src/blogc-make/rules.c51
1 files changed, 27 insertions, 24 deletions
diff --git a/src/blogc-make/rules.c b/src/blogc-make/rules.c
index 73b03fe..8a3bfc4 100644
--- a/src/blogc-make/rules.c
+++ b/src/blogc-make/rules.c
@@ -560,24 +560,14 @@ static int all_exec(bm_ctx_t *ctx, bc_slist_t *outputs, bc_trie_t *args,
typedef struct {
bm_ctx_t *ctx;
bool verbose;
+ bool running;
} runserver_args_t;
-static runserver_args_t *args = NULL;
-
-static void
-runserver_sig_handler(int sig)
-{
- free(args);
- args = NULL;
-}
-
static void*
runserver_thread(void *arg)
{
- signal(SIGINT, runserver_sig_handler);
- signal(SIGTERM, runserver_sig_handler);
- args = arg;
- while (true) {
+ runserver_args_t *args = arg;
+ while (args->running) {
bm_ctx_reload(args->ctx);
if (args->ctx == NULL) {
fprintf(stderr, "blogc-make: error: failed to reload context. "
@@ -594,8 +584,6 @@ runserver_thread(void *arg)
runserver_cleanup:
free(args);
- args = NULL;
-
return NULL;
}
@@ -610,24 +598,39 @@ runserver_exec(bm_ctx_t *ctx, bc_slist_t *outputs, bc_trie_t *args, bool verbose
runserver_args_t *r_args = bc_malloc(sizeof(runserver_args_t));
r_args->ctx = ctx;
r_args->verbose = verbose;
+ r_args->running = true;
- pthread_t thread;
+ int err;
+ pthread_attr_t attr;
+
+ if (0 != (err = pthread_attr_init(&attr))) {
+ fprintf(stderr, "blogc-make: error: failed to initialize reloader "
+ "thread attributes: %s\n", strerror(err));
+ return 3;
+ }
- if (0 != pthread_create(&thread, NULL, runserver_thread, r_args)) {
- fprintf(stderr, "blogc-make: error: failed to create blogc-runserver "
- "thread!\n");
+ // 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 reloader thread as "
+ "detached: %s\n", strerror(err));
return 3;
}
- if (0 != pthread_detach(thread)) {
- fprintf(stderr, "blogc-make: error: failed to detach blogc-runserver "
- "thread!\n");
+ pthread_t thread;
+
+ if (0 != (err = pthread_create(&thread, &attr, runserver_thread, r_args))) {
+ fprintf(stderr, "blogc-make: error: failed to create reloader "
+ "thread: %s\n", strerror(err));
return 3;
}
- bm_exec_blogc_runserver(ctx->output_dir, bc_trie_lookup(args, "host"),
+ rv = bm_exec_blogc_runserver(ctx->output_dir, bc_trie_lookup(args, "host"),
bc_trie_lookup(args, "port"), bc_trie_lookup(args, "threads"), verbose);
- return 0;
+
+ r_args->running = false;
+
+ return rv;
}