diff options
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/error.c | 3 | ||||
-rw-r--r-- | src/common/error.h | 1 | ||||
-rw-r--r-- | src/common/thread-pool.c | 70 | ||||
-rw-r--r-- | src/common/thread-pool.h | 27 |
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 */ |