src/lib/ctx.c
author Tero Marttila <terom@fixme.fi>
Thu, 31 Dec 2009 17:01:22 +0200
changeset 21 47f15166e25a
parent 20 f0d1011e8874
child 33 0ed40e11b0e8
permissions -rw-r--r--
misc
19
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include "ctx.h"
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include "error.h"
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
#include <stdlib.h>
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
#include <signal.h>
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
#include <assert.h>
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
#include <stdio.h> // for perror
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
21
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
     9
/**
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    10
 * Wrapper around pthread_mutex_unlock for use with pthread_cleanup_push
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    11
 */
20
f0d1011e8874 cleanup mutex when cancel'd in pthread_cond_wait
Tero Marttila <terom@fixme.fi>
parents: 19
diff changeset
    12
static void pt_mutex_unlock (void *arg)
f0d1011e8874 cleanup mutex when cancel'd in pthread_cond_wait
Tero Marttila <terom@fixme.fi>
parents: 19
diff changeset
    13
{
f0d1011e8874 cleanup mutex when cancel'd in pthread_cond_wait
Tero Marttila <terom@fixme.fi>
parents: 19
diff changeset
    14
    pthread_mutex_t *mutex = arg;
f0d1011e8874 cleanup mutex when cancel'd in pthread_cond_wait
Tero Marttila <terom@fixme.fi>
parents: 19
diff changeset
    15
f0d1011e8874 cleanup mutex when cancel'd in pthread_cond_wait
Tero Marttila <terom@fixme.fi>
parents: 19
diff changeset
    16
    assert(!pthread_mutex_unlock(mutex));
f0d1011e8874 cleanup mutex when cancel'd in pthread_cond_wait
Tero Marttila <terom@fixme.fi>
parents: 19
diff changeset
    17
}
f0d1011e8874 cleanup mutex when cancel'd in pthread_cond_wait
Tero Marttila <terom@fixme.fi>
parents: 19
diff changeset
    18
19
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
/**
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
 * Enqueue the given piece of work
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
 *
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
 * This function always succeeds.
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
 */
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
static void pt_work_enqueue (struct pt_ctx *ctx, struct pt_work *work)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
{
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
    // acquire
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
    assert(!pthread_mutex_lock(&ctx->work_mutex));
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
    // enqueue work
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
    TAILQ_INSERT_TAIL(&ctx->work, work, ctx_work);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
    // if there's a thread waiting, wake one up. Otherwise, some thread will find it once it finishes its current work
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
    assert(!pthread_cond_signal(&ctx->work_cond));
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
    // release 
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
    assert(!pthread_mutex_unlock(&ctx->work_mutex));
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
}
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
/**
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
 * Dequeue a piece of work
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
 */
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
static void pt_work_dequeue (struct pt_ctx *ctx, struct pt_work **work_ptr)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
{
20
f0d1011e8874 cleanup mutex when cancel'd in pthread_cond_wait
Tero Marttila <terom@fixme.fi>
parents: 19
diff changeset
    44
    // acquire, cancel-safe
f0d1011e8874 cleanup mutex when cancel'd in pthread_cond_wait
Tero Marttila <terom@fixme.fi>
parents: 19
diff changeset
    45
    pthread_cleanup_push(pt_mutex_unlock, &ctx->work_mutex);
19
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
    assert(!pthread_mutex_lock(&ctx->work_mutex));
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    // idle?
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    if (TAILQ_EMPTY(&ctx->work))
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
        assert(!pthread_cond_signal(&ctx->idle_cond));
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    // wait for work
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
    while (TAILQ_EMPTY(&ctx->work))
20
f0d1011e8874 cleanup mutex when cancel'd in pthread_cond_wait
Tero Marttila <terom@fixme.fi>
parents: 19
diff changeset
    54
        // we can expect to get pthread_cancel'd here
19
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        assert(!pthread_cond_wait(&ctx->work_cond, &ctx->work_mutex));
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
    // pop work
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
    *work_ptr = TAILQ_FIRST(&ctx->work);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
    TAILQ_REMOVE(&ctx->work, *work_ptr, ctx_work);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
    // release
20
f0d1011e8874 cleanup mutex when cancel'd in pthread_cond_wait
Tero Marttila <terom@fixme.fi>
parents: 19
diff changeset
    62
    pthread_cleanup_pop(true);
19
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
}
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
/**
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
 * Wait for work queue to become empty
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
 */
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
static void pt_work_wait_idle (struct pt_ctx *ctx)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
{
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
    // acquire
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
    assert(!pthread_mutex_lock(&ctx->work_mutex));
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
    
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
    // wait for it to drain...
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
    while (!TAILQ_EMPTY(&ctx->work))
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
        assert(!pthread_cond_wait(&ctx->idle_cond, &ctx->work_mutex));
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
    // release
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
    assert(!pthread_mutex_unlock(&ctx->work_mutex));
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
}
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
/**
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
 * Execute a piece of work
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
 */
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
static void pt_work_execute (struct pt_work *work)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
{
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    work->func(work->arg);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
}
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
/**
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
 * Release work state once done
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
 */
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
static void pt_work_release (struct pt_work *work)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
{
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
    free(work);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
}
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
/**
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
 * Worker thread entry point
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
 */
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
static void* pt_thread_main (void *arg)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
{
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
    struct pt_thread *thread = arg;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
    struct pt_work *work;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
    // if only life were so simple...
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
    while (true) {
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
        pt_work_dequeue(thread->ctx, &work);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
        pt_work_execute(work);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
        pt_work_release(work);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
    }
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
    return NULL;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
}
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
/**
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
 * Shut down a pt_thread, waiting for it to finish.
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
 *
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
 * Does not remove the thread from the pool or release the pt_thread.
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
 */
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
static void pt_thread_shutdown (struct pt_thread *thread)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
{
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
    // signal it to stop at next cancel point (i.e. when waiting for work)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
    if (pthread_cancel(thread->tid))
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
        perror("pthread_cancel");
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
    // reap
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
    if (pthread_join(thread->tid, NULL))
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
        perror("pthread_join");
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
    // mark
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
    thread->tid = 0;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
}
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
/**
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
 * Release pt_thread state, aborting thread if running.
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
 *
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
 * This is guaranteed to remove the thread from the ctx_threads if it was added.
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
 */
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
static void pt_thread_destroy (struct pt_thread *thread)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
{
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
    if (thread->tid) {
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
        // detach
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
        if (pthread_detach(thread->tid))
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
            perror("pthread_detach");
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
        // abort thread
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
        if (pthread_kill(thread->tid, SIGTERM))
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
            perror("pthread_detach");
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
    }
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
        
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
    // remove from pool
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
    TAILQ_REMOVE(&thread->ctx->threads, thread, ctx_threads);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
    
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
    free(thread);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
}
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
/**
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
 * Start a new thread and add it to the thread pool
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
 */
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
static int pt_ctx_add_thread (struct pt_ctx *ctx)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
{
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
    struct pt_thread *thread;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
    int err;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
    // alloc
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
    if ((thread = calloc(1, sizeof(*thread))) == NULL)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
        return -PT_ERR_MEM;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
    // init
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
    thread->ctx = ctx;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
    // start thread, default attrs
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
    if (pthread_create(&thread->tid, NULL, pt_thread_main, thread))
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
        JUMP_SET_ERROR(err, PT_ERR_PTHREAD_CREATE);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
    // add to pool
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
    TAILQ_INSERT_TAIL(&ctx->threads, thread, ctx_threads);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
    // ok
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
    return 0;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
error:
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
    // drop, don't try and remove from tailq...
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
    free(thread);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
    return err;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
}
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
int pt_ctx_new (struct pt_ctx **ctx_ptr, int threads)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
{
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
    struct pt_ctx *ctx;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
    int err;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
    // alloc
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
    if ((ctx = calloc(1, sizeof(*ctx))) == NULL)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
        return -PT_ERR_MEM;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
    // init
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
    TAILQ_INIT(&ctx->threads);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
    TAILQ_INIT(&ctx->work);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
    pthread_mutex_init(&ctx->work_mutex, NULL);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
    pthread_cond_init(&ctx->work_cond, NULL);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
    pthread_cond_init(&ctx->idle_cond, NULL);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
    // start threadpool
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
    for (int i = 0; i < threads; i++) {
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
        if ((err = pt_ctx_add_thread(ctx)))
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   210
            JUMP_ERROR(err);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
    }
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
    
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
    ctx->running = true;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
    // ok
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   216
    *ctx_ptr = ctx;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
    return 0;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
        
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   220
error:
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
    // cleanup
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
    pt_ctx_destroy(ctx);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   224
    return err;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
}
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   226
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
int pt_ctx_work (struct pt_ctx *ctx, pt_work_func func, void *arg)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
{
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
    struct pt_work *work;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
    // check state
21
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   232
    // XXX: this is kind of retarded, because pt_ctx_shutdown/work should only be called from the same thread...
19
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   233
    if (!ctx->running)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   234
        RETURN_ERROR(PT_ERR_CTX_SHUTDOWN);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
21
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   236
    // alloc
19
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   237
    if ((work = calloc(1, sizeof(*work))) == NULL)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   238
        RETURN_ERROR(PT_ERR_MEM);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   239
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
    // init
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241
    work->func = func;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242
    work->arg = arg;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   243
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   244
    // enqueue
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   245
    pt_work_enqueue(ctx, work);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   246
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   247
    // ok
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   248
    return 0;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   249
}
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   250
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
int pt_ctx_shutdown (struct pt_ctx *ctx)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   252
{
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   253
    struct pt_thread *thread;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   254
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   255
    // stop accepting new work
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   256
    ctx->running = false;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   257
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   258
    // wait for work queue to empty
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   259
    pt_work_wait_idle(ctx);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   260
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   261
    // shut down each thread
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
    TAILQ_FOREACH(thread, &ctx->threads, ctx_threads)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   263
        // XXX: handle errors of some kind?
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   264
        pt_thread_shutdown(thread);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   265
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   266
    // then drop
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   267
    pt_ctx_destroy(ctx);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   268
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   269
    return 0;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   270
}
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   272
void pt_ctx_destroy (struct pt_ctx *ctx)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   273
{
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   274
    struct pt_thread *thread;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   275
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   276
    // kill threads
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   277
    while ((thread = TAILQ_FIRST(&ctx->threads)))
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   278
        pt_thread_destroy(thread);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   279
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   280
    // destroy mutex/conds
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   281
    if (pthread_cond_destroy(&ctx->idle_cond))
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   282
        perror("pthread_cond_destroy(idle_cond)");
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   283
    
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   284
    if (pthread_cond_destroy(&ctx->work_cond))
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   285
        perror("pthread_cond_destroy(work_cond)");
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   286
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   287
    if (pthread_mutex_destroy(&ctx->work_mutex))
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   288
        perror("pthread_mutex_destroy(work_mutex)");
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   289
   
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   290
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   291
    free(ctx);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   292
}
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   293