aboutsummaryrefslogtreecommitdiffstats
path: root/src/common
diff options
context:
space:
mode:
authorRafael G. Martins <rafael@rafaelmartins.eng.br>2016-12-23 02:01:39 +0100
committerRafael G. Martins <rafael@rafaelmartins.eng.br>2018-01-28 17:06:02 +0100
commite01115702ad73c32efdf11b97d84a81f59300e1d (patch)
treead59f6e47978e3873cc0f1229d6aaac5aae221e8 /src/common
parentab6e81997cf8c5bcf7d1778bb32d8e01425b13f1 (diff)
downloadblogc-e01115702ad73c32efdf11b97d84a81f59300e1d.tar.gz
blogc-e01115702ad73c32efdf11b97d84a81f59300e1d.tar.bz2
blogc-e01115702ad73c32efdf11b97d84a81f59300e1d.zip
common: thread-pool: initial work
Diffstat (limited to 'src/common')
-rw-r--r--src/common/error.c3
-rw-r--r--src/common/error.h1
-rw-r--r--src/common/thread-pool.c70
-rw-r--r--src/common/thread-pool.h27
4 files changed, 101 insertions, 0 deletions
diff --git a/src/common/error.c b/src/common/error.c
index 19f369c..38c7fdb 100644
--- a/src/common/error.c
+++ b/src/common/error.c
@@ -118,6 +118,9 @@ bc_error_print(bc_error_t *err, const char *prefix)
case BC_ERROR_FILE:
fprintf(stderr, "error: file: %s\n", err->msg);
break;
+ case BC_ERROR_THREADPOOL:
+ fprintf(stderr, "error: thread-pool: %s\n", err->msg);
+ break;
case BLOGC_ERROR_SOURCE_PARSER:
fprintf(stderr, "error: source: %s\n", err->msg);
break;
diff --git a/src/common/error.h b/src/common/error.h
index 34aab74..c10868c 100644
--- a/src/common/error.h
+++ b/src/common/error.h
@@ -17,6 +17,7 @@ typedef enum {
// errors for src/common
BC_ERROR_CONFIG_PARSER = 1,
BC_ERROR_FILE,
+ BC_ERROR_THREADPOOL,
// errors for src/blogc
BLOGC_ERROR_SOURCE_PARSER = 100,
diff --git a/src/common/thread-pool.c b/src/common/thread-pool.c
new file mode 100644
index 0000000..ad345bb
--- /dev/null
+++ b/src/common/thread-pool.c
@@ -0,0 +1,70 @@
+/*
+ * blogc: A blog compiler.
+ * Copyright (C) 2016 Rafael G. Martins <rafael@rafaelmartins.eng.br>
+ *
+ * This program can be distributed under the terms of the BSD License.
+ * See the file LICENSE.
+ */
+
+#include <errno.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <string.h>
+#include "error.h"
+#include "utils.h"
+#include "thread-pool.h"
+
+pthread_mutex_t jobs_mutex;
+
+typedef struct {
+ bc_threadpool_t *pool;
+ pthread_t thread;
+ size_t id;
+} thread_info_t;
+
+
+static void*
+worker(void *arg)
+{
+ thread_info_t *info = arg;
+
+
+ return NULL;
+}
+
+
+bc_threadpool_t*
+bc_threadpool_new(bc_threadpool_func_t func, size_t max_threads,
+ void *user_data, bc_error_t **err)
+{
+ if (err != NULL && *err != NULL)
+ return NULL;
+
+ bc_threadpool_t *rv = bc_malloc(sizeof(bc_threadpool_t));
+ rv->jobs = NULL;
+ rv->threads = NULL;
+ rv->func = func;
+ rv->max_threads = max_threads;
+ rv->user_data = user_data;
+
+ int e;
+
+ for (size_t i = 0; i < rv->max_threads; i++) {
+ thread_info_t *info = bc_malloc(sizeof(thread_info_t));
+ info->pool = rv;
+ info->id = i+1;
+ if (0 != (e = pthread_create(&(info->thread), NULL, worker, info))) {
+ *err = bc_error_new_printf(BC_ERROR_THREADPOOL,
+ "Failed to create pool: %s", strerror(e));
+ // FIXME: kill any existing threads. currently leaking.
+ free(info);
+ return NULL;
+ }
+ rv->threads = bc_slist_append(rv->threads, info);
+ }
+
+ return rv;
+}
+
+
+
diff --git a/src/common/thread-pool.h b/src/common/thread-pool.h
new file mode 100644
index 0000000..4c14691
--- /dev/null
+++ b/src/common/thread-pool.h
@@ -0,0 +1,27 @@
+/*
+ * blogc: A blog compiler.
+ * Copyright (C) 2016 Rafael G. Martins <rafael@rafaelmartins.eng.br>
+ *
+ * This program can be distributed under the terms of the BSD License.
+ * See the file LICENSE.
+ */
+
+#ifndef _THREAD_POOL_H
+#define _THREAD_POOL_H
+
+#include "utils.h"
+
+typedef void (*bc_threadpool_func_t) (void *job, void *user_data);
+
+typedef struct {
+ bc_slist_t *jobs;
+ bc_slist_t *threads;
+ size_t max_threads;
+ bc_threadpool_func_t func;
+ void *user_data;
+} bc_threadpool_t;
+
+bc_threadpool_t* bc_threadpool_new(bc_threadpool_func_t func,
+ size_t max_threads, void *user_data, bc_error_t **err);
+
+#endif /* _THREAD_POOL_H */