render_remote.c
author Tero Marttila <terom@fixme.fi>
Fri, 06 Jun 2008 03:24:55 +0300
changeset 9 fb6632e6c1bb
parent 8 4d38ccbeb93e
child 11 082bfaf38cf0
permissions -rw-r--r--
two new modules, remote_node and remote_pool

committer: Tero Marttila <terom@fixme.fi>
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include <stdlib.h>
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include <arpa/inet.h>
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include <unistd.h>
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
#include <fcntl.h>
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
#include <errno.h>
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
4
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
     7
#include <event2/event.h>
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
     8
#include <event2/bufferevent.h>
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
     9
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
#include "render_remote.h"
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
#include "common.h"
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
struct remote_render_ctx {
4
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    14
    struct event *ev_conn;
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    struct bufferevent *data_bev;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    17
    struct remote_node *remote_node;
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    18
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
    #pragma pack(push)
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    #pragma pack(1)
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
    struct {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
        u_int8_t    mode;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
        u_int32_t   img_w;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
        u_int32_t   img_h;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
        double      x1;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
        double      y1;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
        double      x2;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
        double      y2;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
    } render_cmd;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
    #pragma pack(pop)
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
    void (*cb_sent)(void *arg);
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
    void (*cb_data)(struct evbuffer *buf, void *arg);
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
    void (*cb_done)(void *arg);
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
    void (*cb_fail)(void *arg);
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
    void *cb_arg;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
};
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    44
void _remote_render_ctx_free (struct remote_render_ctx *ctx) {
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    45
    // close the socket (ctx->ev_conn remains valid even after we're done with it...)
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    46
    close(event_get_fd(ctx->ev_conn));
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    47
    
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    48
    // free the connect event
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    49
    event_free(ctx->ev_conn);
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    50
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
    // free the data_bev
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    52
    if (ctx->data_bev) {
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    53
        bufferevent_free(ctx->data_bev);
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    54
        ctx->data_bev = NULL;
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
    }
4
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    56
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    57
    // update remote_node load
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    58
    ctx->remote_node->current_load--;
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
    
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
    // free the context structure
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    61
    free(ctx);
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
    
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    63
    ctx = NULL;
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
}
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
#define RENDER_FAILED(ctx, desc) \
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
    do {                                        \
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
        perror(desc);                           \
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
        ctx->cb_fail(ctx->cb_arg);              \
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    70
        _remote_render_ctx_free(ctx);          \
3
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    71
        return;                                 \
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
    } while (0)
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
void _remote_write (struct bufferevent *bev, void *arg) {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
    struct remote_render_ctx *ctx = arg;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
    // the write buffer was drained, so the render command was sent
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
    ctx->cb_sent(ctx->cb_arg);
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
    
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
    // we don't care about EV_WRITE anymore
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
    if (bufferevent_disable(ctx->data_bev, EV_WRITE))
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
        RENDER_FAILED(ctx, "render_remote: bufferevent_disable");
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
    // start receiving data
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
    if (bufferevent_enable(ctx->data_bev, EV_READ))
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
        RENDER_FAILED(ctx, "render_remote: bufferevent_enable");
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
}
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
void _remote_read (struct bufferevent *bev, void *arg) {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
    struct remote_render_ctx *ctx = arg;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
    
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
    // pass the bufferevent's input buffer to our callback - libevent doesn't provide any function to access this, but hopefully this works correctly
3
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    93
    ctx->cb_data(EVBUFFER_INPUT(bev), ctx->cb_arg);
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
}
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
void _remote_error (struct bufferevent *bev, short what, void *arg) {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
    struct remote_render_ctx *ctx = arg;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
    // OH NOES; WHAT DO WE DO!?
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
    
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
    if (what & EVBUFFER_EOF) {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
        // great!
3
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   103
        
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   104
        // send any remaining-chunk data
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   105
        if (EVBUFFER_LENGTH(EVBUFFER_INPUT(bev)) > 0)
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   106
            ctx->cb_data(EVBUFFER_INPUT(bev), ctx->cb_arg);
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   107
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   108
        // signal completion
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
        ctx->cb_done(ctx->cb_arg);
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
    } else if (what & EVBUFFER_ERROR) {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
        // crap.
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
        perr("render_remote");
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
        ctx->cb_fail(ctx->cb_arg);
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
    } else if (what & EVBUFFER_TIMEOUT) {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
        // ah well
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
        error("render_remote: timeout");
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
        ctx->cb_fail(ctx->cb_arg);
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
    } else {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
        err_exit("weird bufferevent error code: 0x%02X", what);
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
    }
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
    // free resources
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   128
    _remote_render_ctx_free(ctx);
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
}
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
void _remote_connected (int fd, short event, void *arg) {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
    struct remote_render_ctx *ctx = arg;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
    // set up the read/write bufferevent
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
    if ((ctx->data_bev = bufferevent_new(fd, &_remote_read, &_remote_write, &_remote_error, ctx)) == NULL)
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
        RENDER_FAILED(ctx, "render_remote: bufferevent_new");
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
    // write the render command
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
    if (bufferevent_write(ctx->data_bev, &ctx->render_cmd, sizeof(ctx->render_cmd)))
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
        RENDER_FAILED(ctx, "render_remote: bufferevent_write");
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
    // wait for it to be written out
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
    if (bufferevent_enable(ctx->data_bev, EV_WRITE))
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
        RENDER_FAILED(ctx, "render_remote: bufferevent_enable");
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
}
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
void render_cmd_build (render_t *rctx, struct remote_render_ctx *rrctx) {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
    // just copy over the render params to the render_cmd
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
    rrctx->render_cmd.mode = rctx->mode;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
    rrctx->render_cmd.img_w = htonl(rctx->img_w);
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
    rrctx->render_cmd.img_h = htonl(rctx->img_h);
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
    rrctx->render_cmd.x1 = rctx->x1;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
    rrctx->render_cmd.y1 = rctx->y1;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
    rrctx->render_cmd.x2 = rctx->x2;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
    rrctx->render_cmd.y2 = rctx->y2;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
}
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
3
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   158
struct remote_render_ctx *render_remote (
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
        render_t *render_ctx,
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   160
        struct remote_node *remote_node,
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
        void (*cb_sent)(void *arg),
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
        void (*cb_data)(struct evbuffer *buf, void *arg),
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
        void (*cb_done)(void *arg),
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
        void (*cb_fail)(void *arg),
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
        void *cb_arg
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
) {    
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   167
    printf("render_remote: remote render load: %d/%d\n", remote_node->current_load, remote_node->parallel_renders);
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   168
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
    // alloc the remote render ctx
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
    struct remote_render_ctx *ctx = malloc(sizeof(struct remote_render_ctx));
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
    if (!ctx) {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
        error("render_remote: malloc");
3
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   174
        return NULL;
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
    }
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
    
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
    // store the provided callback functions
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
    ctx->cb_sent = cb_sent;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
    ctx->cb_data = cb_data;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
    ctx->cb_done = cb_done;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
    ctx->cb_fail = cb_fail;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
    ctx->cb_arg = cb_arg;
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   183
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   184
    // keep a reference to remote_node so we can decr it's load
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   185
    ctx->remote_node = remote_node;
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
    
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
    // copy the relevant stuff from the render_ctx
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
    render_cmd_build(render_ctx, ctx);
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
    
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
    // create the socket
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   191
    int sock = socket(remote_node->addr.ss_family, SOCK_STREAM, 0);
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
    if (sock < 0) {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
        perror("render_remote: socket");
4
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   195
        goto error;
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
    }
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
    // mark it as nonblocking
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
    if (fcntl(sock, F_SETFL, O_NONBLOCK) == -1) {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
        perror("render_remote: fcntl");
4
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   201
        goto error;
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
    }
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
    
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
    // initiate the connect
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   205
    int err = connect(sock, (struct sockaddr *) &remote_node->addr, sizeof(remote_node->addr));
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
    if (err != -1 || errno != EINPROGRESS) {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
        perror("render_remote: connect");
4
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   209
        goto error;
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   210
    }
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
    // do the libevent dance
4
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   213
    ctx->ev_conn = event_new(NULL, sock, EV_WRITE, &_remote_connected, ctx);
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
4
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   215
    if (!ctx->ev_conn) {
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   216
        error("render_remote: event_new");
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   217
        goto error;
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   218
    }
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   219
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   220
    if (event_add(ctx->ev_conn, NULL)) {
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
        error("render_remote: event_add");
4
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   222
        goto error;
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
    }
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   224
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   225
    // update remote_node load
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   226
    remote_node->current_load++;
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
    
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
    // success
3
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   229
    return ctx;
4
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   230
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   231
error:
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   232
    free(ctx);
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   233
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   234
    if (sock > 0)
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   235
        close(sock);
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   236
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   237
    return NULL;
3
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   238
}
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   239
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   240
int render_remote_set_recv (struct remote_render_ctx *ctx, size_t recv_threshold, size_t unread_buffer) {
3
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   241
    if (ctx->data_bev == NULL)
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   242
        return -1;
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   243
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   244
    bufferevent_setwatermark(ctx->data_bev, EV_READ, recv_threshold, recv_threshold + unread_buffer);
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   245
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   246
    return 0;
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   247
}
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   248
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   249
int render_remote_shake (struct remote_render_ctx *ctx) {
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   250
    if (ctx->data_bev == NULL)
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   251
        return -1;
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   252
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   253
    ctx->cb_data(EVBUFFER_INPUT(ctx->data_bev), ctx->cb_arg);
3
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   254
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   255
    return 0;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   256
}
3
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   257
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   258
void render_remote_cancel (struct remote_render_ctx *ctx) {
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   259
    // if it's still just connecting, cancel that
4
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   260
    if (event_pending(ctx->ev_conn, EV_WRITE, NULL)) {
49edbdf9ebe7 updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   261
        event_del(ctx->ev_conn);
3
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   262
    }
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   263
    
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   264
    // this takes care of the rest
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   265
    _remote_render_ctx_free (ctx);
3
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   266
}
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   267