src/lib/ctx.h
author Tero Marttila <terom@fixme.fi>
Tue, 26 Jan 2010 21:22:43 +0200
changeset 123 81d1cad8b588
parent 19 ebcc49de97d0
permissions -rw-r--r--
docfix README for new Makefile
#ifndef PNGTILE_CTX_H
#define PNGTILE_CTX_H

/**
 * Shared context between images, used to provide a threadpool for parralelizing tile operations
 */
#include "pngtile.h"

#include <pthread.h>
#include <sys/queue.h>
#include <stdbool.h>

/**
 * Worker thread
 */
struct pt_thread {
    /** Shared context */
    struct pt_ctx *ctx;

    /** Thread handle */
    pthread_t tid;

    /** @see pt_ctx::threads */
    TAILQ_ENTRY(pt_thread) ctx_threads;
};

/**
 * Work function
 */
typedef void (*pt_work_func) (void *arg);

/**
 * Work that needs to be done
 */
struct pt_work {
    /** Work func */
    pt_work_func func;

    /** Work info */
    void *arg;
    
    /** @see pt_ctx::work */
    TAILQ_ENTRY(pt_work) ctx_work;
};

/**
 * Shared context
 */
struct pt_ctx {
    /** Accepting new work */
    bool running;

    /** Threadpool */
    TAILQ_HEAD(pt_ctx_threads, pt_thread) threads;

    /** Pending work */
    TAILQ_HEAD(pt_ctx_work, pt_work) work;

    /** Control access to ::work */
    pthread_mutex_t work_mutex;

    /** Wait for work to become available */
    pthread_cond_t work_cond;

    /** Thread is idle */
    pthread_cond_t idle_cond;
};

/**
 * Enqueue a work unit
 */
int pt_ctx_work (struct pt_ctx *ctx, pt_work_func func, void *arg);


#endif