Skip to content
Snippets Groups Projects
threadpool.c 1.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • Max Barrett's avatar
    Max Barrett committed
    #include "threadpool.h"
    #include "list.h"
    #include <stdlib.h>
    #include <stdio.h>
    #include <assert.h>
    
    Max Barrett's avatar
    Max Barrett committed
    
    struct thread_pool {
    
        pthread_mutex_t lock;
        pthread_cond_t cond;
    
    Max Barrett's avatar
    Max Barrett committed
        struct list global_queue;
        bool shutdown;
    
    Max Barrett's avatar
    Max Barrett committed
    };
    
    struct future {
        fork_join_task_t task;
        void* args;
        void* result;
    
        struct list_elem elem;
    };
    
    struct worker {
        struct thread_pool* pool;
        pthread_t internal;
    
    Max Barrett's avatar
    Max Barrett committed
    };
    
    
    static __thread struct worker* current_worker = NULL;
    
    
    Max Barrett's avatar
    Max Barrett committed
    struct thread_pool * thread_pool_new(int nthreads) {
    
        struct thread_pool *threadpool = malloc(sizeof(struct thread_pool));
        threadpool->threads = nthreads;
        pthread_cond_init(&threadpool->cond, NULL);
        pthread_mutex_init(&threadpool->lock, NULL);
        list_init(&threadpool->global_queue);
        for (int i = 0; i < nthreads; i++) {
            pool->workers[i].pool = pool;
            pool->workers[i].index = i;
            list_init(&pool->workers[i].deque);
            pthread_create(&pool->workers[i].internal, NULL, start_routine, &pool->workers[i]);
        }
        return threadpool;
    
    Max Barrett's avatar
    Max Barrett committed
    }
    
    void thread_pool_shutdown_and_destroy(struct thread_pool *threadpool) {
    
        threadpool->shutdown = true;
    
    Max Barrett's avatar
    Max Barrett committed
        return;
    }
    
    void * future_get(struct future *future) {
    
        pthread_mutex_unlock(&pool->lock);
        future->result = future->task(pool, future->args);
        pthread_mutex_lock(&pool->lock);
    
    Max Barrett's avatar
    Max Barrett committed
        return future;
    }
    
    void future_free(struct future *future) {
    
    Max Barrett's avatar
    Max Barrett committed
    }
    
    struct future * thread_pool_submit(struct thread_pool *pool, fork_join_task_t task, void * data) {
        struct future *future = malloc(sizeof(struct future));
    
        future->args = data;
        future->task = task;
        list_push_back(&pool->global_queue, &future->elem);
        pthread_cond_signal(&pool->cond);
        pthread_mutex_unlock(&pool->lock);
        free(pool);
    
    Max Barrett's avatar
    Max Barrett committed
        return future;
    }