render_thread.c
author Tero Marttila <terom@fixme.fi>
Wed, 27 Aug 2008 21:30:32 +0300
changeset 41 540737bf6bac
parent 24 8307d28329ae
permissions -rw-r--r--
sending requests, and partial support for receiving -- incomplete, not tested
23
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include <unistd.h>
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include <errno.h>
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include <string.h>
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
#include <assert.h>
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
#include <stdlib.h>
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
#include <pthread.h>
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
#include <event2/event.h>
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
#include "common.h"
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
#include "render_thread.h"
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
#include "render_thread_struct.h"
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
#include "render_local.h"
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
static void *_render_thread_func (void *arg) {
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
    struct render_thread *ctx = arg;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    // measure how long it takes
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
    double duration;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    21
    struct render_local local_ctx;
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    22
    
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    23
    // initialize it...
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    24
    if (!(ctx->err = render_local_init(&local_ctx, &ctx->render_info))) {
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    25
        // setup the cancel exit handlers
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    26
        pthread_cleanup_push( (void (*)(void *)) render_local_deinit, &local_ctx);
23
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    28
        // render it...
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    29
        ctx->err = render_local_run(&local_ctx, &duration);
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    30
        
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    31
        if (!ctx->err) {
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    32
#if INFO_ENABLED
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    33
            u_int32_t img_w, img_h;
23
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    35
            render_get_size(&ctx->render_info, &img_w, &img_h);
23
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    37
            // report the duration
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    38
            INFO("rendered [%ux%u] in %f seconds", img_w, img_h, duration);
23
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
#endif
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    40
        }
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    41
        
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    42
        // cleanup
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    43
        pthread_cleanup_pop(1);
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    44
    }
23
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
    // notify completion, writeall()
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
    ssize_t ret;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    char *buf = (void *) &ctx;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    size_t len = sizeof(ctx);
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
    do {
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        ret = write(ctx->notify_fd, buf, len);
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
        if (ret > 0) {
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
            buf += ret;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
            len -= ret;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
        }
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
    } while ((ret == -1 && errno == EINTR) || len > 0);
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
    
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
    if (ret == -1)
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
        PERROR("write");
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
    
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
    // done...
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
    return NULL;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
error:
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    67
    // if notifying of completion failed...
23
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
    return ctx;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
}
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
static void _render_thread_done (evutil_socket_t fd, short what, void *arg) {
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
    struct render_thread *ctx = arg;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
    void *thread_return;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    75
    // join the thread and check the return value
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    76
    if (pthread_join(ctx->thread_id, &thread_return))
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    77
        PWARNING("pthread_join");
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    78
    else if (thread_return == PTHREAD_CANCELED)
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    79
        PWARNING("PTHREAD_CANCELED");
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    80
    else if (thread_return != NULL)
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    81
        PWARNING("thread_return != NULL");
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    82
23
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
    // make a lazy effort to read the contents of the pipe
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
    struct render_thread *ctx2;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
    char *buf = (void *) &ctx2;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    size_t len = sizeof(ctx);
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
    ssize_t ret;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
    
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
    if ((ret = read(fd, buf, len)) == -1)
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
        PWARNING("read");
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
    else if (ret != len)
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
        WARNING("short read");
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
    else if (ctx2 != ctx)
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
        FATAL("wrong ctx: %p <> %p", ctx, ctx2);
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
    
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
    // close the pipe
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
    if (close(fd))
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
        PWARNING("close(pipe-read)");
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
    if (close(ctx->notify_fd))
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
        PWARNING("close(pipe-write)");
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
    // mark it as done
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
    ctx->is_active = 0;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
    // call our callback
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   110
    ctx->cb_func(ctx, ctx->err, ctx->cb_arg);
23
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
}
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
int render_thread_init (struct render_thread *ctx, struct render *render_info, render_thread_done_cb cb_func, void *cb_arg) {
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
    // we need to copy over the render info, as it will probably be invalidated before the thread finishes
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
    memcpy(&ctx->render_info, render_info, sizeof(ctx->render_info));
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
    
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
    // the cb stuff
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
    ctx->cb_func = cb_func;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
    ctx->cb_arg = cb_arg;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
    // the notify pipe
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
    int pipefds[2];
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
    
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
    if (pipe(pipefds))
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
        PERROR("pipe");
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
    
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
    // the write end...
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
    ctx->notify_fd = pipefds[1];
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
    // the read end...
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
    event_set(&ctx->ev, pipefds[0], EV_READ, &_render_thread_done, ctx);
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
    if (event_add(&ctx->ev, NULL))
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
        PERROR("event_add");
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
    // spawn the render thread
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
    if (pthread_create(&ctx->thread_id, NULL, &_render_thread_func, ctx))
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
        PERROR("pthread_create(manager_func)");
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
    
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
    // mark it as active
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
    ctx->is_active = 1;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
    
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
    return 0;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
error:
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
    render_thread_deinit(ctx);
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
    return -1;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
}
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
void render_thread_cancel (struct render_thread *ctx) {
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
    assert(ctx->is_active);
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
  
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
    // we don't care about joining the thread, detach
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
    // XXX if already detached, it won't get canceled here
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
    if (pthread_detach(ctx->thread_id))
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
        PWARNING("pthread_detach");
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
    // cancel it
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
    else if (pthread_cancel(ctx->thread_id))
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
        PWARNING("pthread_cancel");
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
    
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
    // XXX: should we actually join it before continuing?
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
    // slam the pipe shut in front of its face
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
    if (close(event_get_fd(&ctx->ev)))
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
        PWARNING("close");
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
    if (close(ctx->notify_fd))
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
        PWARNING("close");
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
    // pipe's closed, and don't call _render_thread_func
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
    event_del(&ctx->ev);
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
    
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
    // we are now ready for deinit
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
    ctx->is_active = 0;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
}
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
void render_thread_deinit (struct render_thread *ctx) {
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
    assert(!ctx->is_active);
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
    // nothing to do
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
}
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
struct render_thread *render_thread_alloc (struct render *render_info, render_thread_done_cb cb_func, void *cb_arg) {
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
    struct render_thread *ctx = NULL;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
    if (!(ctx = calloc(1, sizeof(*ctx))))
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
        ERROR("calloc");
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
    
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
    // flag it for free()ing
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
    ctx->owned_by_me = 1;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
    
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
    // init with silent fall-through
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
    if (render_thread_init(ctx, render_info, cb_func, cb_arg))
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
        goto error;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
    
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
    // success
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
    return ctx;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
error:
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
    // XXX: do other modules do this?
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
    free(ctx);
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
    return NULL;
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
}
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
void render_thread_free (struct render_thread *ctx) {
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
    render_thread_deinit(ctx);
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   210
    if (ctx->owned_by_me)
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
        free(ctx);
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
}
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213