web_main.c
author Tero Marttila <terom@fixme.fi>
Fri, 06 Jun 2008 03:24:22 +0300
changeset 8 4d38ccbeb93e
parent 6 4252c27f2b72
child 10 9daa832ab9c4
permissions -rw-r--r--
* fix Makefile to build in a (more) sensible way (still not really perfect)
* a parse_hostport in common
* fix warnings in render_file
* commandline argument parsing for render_node
* render_remote takes a struct remote_node, maintains its current_load, and actually close the socket after use now
* web_main uses a remote_pool, accepts nodes on the command line, and picks nodes from there for render_remote
* improve _http_render_execute error handling, sends back an error reply now
* ignore SIGPIPE. This hadn't shown up before (probably read-EOF instead), but it uncovered a bug in evhttp that caused an infinite bufferevent_write loop -> oom_killer -> DoS attack
* yes, this commit is missing four new files, those will be included in the next one

committer: Tero Marttila <terom@fixme.fi>
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include <sys/types.h>
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include <sys/queue.h>
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
     3
#include <sys/socket.h>
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
#include <stdlib.h>
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
#include <stdio.h>
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
#include <string.h>
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
     7
#include <netinet/ip.h>
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
     8
#include <arpa/inet.h>
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
     9
#include <signal.h>
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    10
#include <unistd.h>
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
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
    12
#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
    13
#include <event2/event_compat.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
    14
#include <event2/http.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
    15
#include <event2/event_struct.h>
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    17
#include "render.h"
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    18
#include "render_remote.h"
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    19
#include "remote_node.h"
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    20
#include "remote_pool.h"
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
#include "common.h"
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    23
#define MIN_CHUNK_SIZE 4096
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
    24
#define OVERFLOW_BUFFER 4096
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
    25
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    26
// do not do any userland socket output buffering
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    27
#define HTTP_BUFFER 0
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
    28
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
    29
// what event_base we're using
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
    30
static struct event_base *ev_base;
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
    31
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    32
// our render node pool
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    33
static struct remote_pool remote_pool;
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    35
// info on a render request
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    36
struct render_request {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    37
    struct evhttp_request *http_request;
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    39
    int headers_sent;
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
    40
    
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
    41
    struct remote_render_ctx *remote_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
    42
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
    43
    size_t bytes_sent;
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    44
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    45
    int paused;
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    46
};
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    48
// cb func prototypes
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    49
void _render_http_written (struct evhttp_request *request, void *arg);
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    50
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
    51
void _render_cleanup (struct render_request *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
    52
    // clean up
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
    53
    free(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
    54
}
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
    55
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    56
void _render_sent (void *arg) {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    57
    struct render_request *ctx = arg;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    58
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
    59
    // set chunk size
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    60
    render_remote_set_recv(ctx->remote_ctx, MIN_CHUNK_SIZE, OVERFLOW_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
    61
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    62
    // send headers
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
    63
    evhttp_add_header(evhttp_request_get_output_headers(ctx->http_request), "Content-Type", "image/png");
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    64
    evhttp_send_reply_start(ctx->http_request, HTTP_OK, "OK");
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    65
    
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    66
    // setup flow-control
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    67
    evhttp_set_reply_notify(ctx->http_request, HTTP_BUFFER, &_render_http_written, ctx);
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    68
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    69
    ctx->headers_sent = 1;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    70
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    71
    printf("render [%p]: sent headers\n", ctx);
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    72
}
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    73
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    74
void _render_data (struct evbuffer *buf, void *arg) {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    75
    struct render_request *ctx = arg;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    76
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
    77
    size_t buf_size = EVBUFFER_LENGTH(buf);
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
    78
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    79
    // ignore empty buffers, a result of render_remote_shake()
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    80
    if (buf_size == 0) {
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    81
        printf("render [%p]: remote buffer is empty\n", ctx);
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    82
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    83
        return;
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    84
    }
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    85
    
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    86
    // check if we are paused
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    87
    if (ctx->paused) {
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    88
        // we are waiting for the HTTP send buffer to clear, so keep the data in the render buffer
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    89
        printf("render [%p]: delaying data: %zu:%zu bytes\n", ctx, buf_size, ctx->bytes_sent);
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    90
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    91
        return;
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    92
    }
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    93
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    94
    // move chunk to http buffers
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    95
    evhttp_send_reply_chunk(ctx->http_request, buf);
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    96
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
    97
    printf("render [%p]: enqueued chunk: %zu/%zu bytes\n", ctx, buf_size, ctx->bytes_sent);
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
    98
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    99
    // mark ourself as paused until httpd tells us to continue
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   100
    ctx->paused = 1;
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   101
    
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   102
    // keep a tally of total sent bytes
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
    ctx->bytes_sent += buf_size;
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   104
}
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   105
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   106
void _render_done (void *arg) {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   107
    struct render_request *ctx = arg;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   108
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   109
    // if we are paused, just shove the data into the http buffers, they might become larger than they should be, but it's easier to just move the data there and let render_remote complete
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   110
    if (ctx->paused) {
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   111
        printf("render [%p]: done: flushing the rest of our data\n", ctx);
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   112
        ctx->paused = 0;
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   113
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   114
        render_remote_shake(ctx->remote_ctx);
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   115
    }
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   116
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   117
    // send end
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   118
    evhttp_send_reply_end(ctx->http_request);
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   119
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
   120
    printf("render [%p]: done: %zu bytes\n", ctx, ctx->bytes_sent);
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   121
        
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   122
    // the request is now done, clean up
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
   123
    _render_cleanup(ctx);
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   124
}
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   125
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   126
void _render_fail (void *arg) {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   127
    struct render_request *ctx = arg;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   128
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   129
    if (ctx->headers_sent) {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   130
        // just terminate the PNG stream where it is
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   131
        evhttp_send_reply_end(ctx->http_request);
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   132
    } else {
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   133
        evhttp_send_error(ctx->http_request, 500, "Internal Server Error");
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
    }
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
    
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   136
    printf("render [%p]: failed\n", ctx);
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   137
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
   138
    _render_cleanup(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
   139
}
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
   140
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
   141
void _render_http_lost (struct evhttp_request *req, void *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
   142
    struct render_request *ctx = 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
   143
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
   144
    printf("render [%p]: lost http connection\n", 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
   145
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
   146
    // cancel
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
   147
    render_remote_cancel(ctx->remote_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
   148
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
   149
    _render_cleanup(ctx);
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   150
}
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   151
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   152
void _render_http_written (struct evhttp_request *request, void *arg) {
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   153
    struct render_request *ctx = arg;
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   154
    
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   155
    printf("render [%p]: http available for write\n", ctx);
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   156
    
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   157
    // unpause ourself
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   158
    ctx->paused = 0;
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   159
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   160
    // shake out the buffers
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   161
    render_remote_shake(ctx->remote_ctx);
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   162
}
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   163
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   164
void _http_render_execute (struct evhttp_request *request, u_int32_t img_w, u_int32_t img_h) {
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   165
    // error message
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   166
    const char *errmsg = NULL;
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   167
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   168
#define ERROR(msg) do { errmsg = msg; goto error; } while (0)
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   169
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   170
    // render request context
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   171
    struct render_request *req_ctx = calloc(1, sizeof(struct render_request));
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   172
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   173
    if (!req_ctx)
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   174
        ERROR("calloc");
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   175
    
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   176
    req_ctx->http_request = request;
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   177
    req_ctx->headers_sent = 0;
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
   178
    req_ctx->bytes_sent = 0;
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   179
    
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   180
    // render context
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   181
    render_t rend_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
   182
    if (render_init(&rend_ctx, RENDER_PNG))
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   183
        ERROR("render_init");
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   184
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   185
    if (render_set_size(&rend_ctx, img_w, img_h))
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   186
        ERROR("render_set_size");
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   187
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   188
    if (render_region_full(&rend_ctx))
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   189
        ERROR("render_region_full");
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   190
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   191
    // pick a render_node
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   192
    struct remote_node *node_info;
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   193
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   194
    if ((node_info = remote_pool_get(&remote_pool)) == NULL)
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   195
        ERROR("remote_pool_get");
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   196
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   197
    // initiate the remote render operation
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   198
    if ((req_ctx->remote_ctx = render_remote(&rend_ctx, node_info,
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   199
        &_render_sent,
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   200
        &_render_data,
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   201
        &_render_done,
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   202
        &_render_fail,
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   203
        req_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
   204
    )) == NULL)
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   205
        ERROR("render_remote");
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   206
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   207
#undef ERROR    /* can't be used after request has been sent */
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
   208
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
   209
    // set close cb
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
   210
    evhttp_set_reply_abortcb(request, &_render_http_lost, req_ctx);
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
    
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   212
    printf("render [%p]: started\n", req_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
   213
    
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   214
    return;
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   215
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   216
error:
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   217
    error("ERR: %s", errmsg);
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   218
    evhttp_send_error(request, 500, "Internal Server Error");
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   219
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   220
    free(req_ctx);
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   221
        
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
}
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   224
/*
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   225
 * HTTP request handler
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   226
 */
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
void http_render (struct evhttp_request *request, void *arg) {
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
    // gather some info about the request
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
   229
    const char *uri = evhttp_request_get_uri(request);
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
    char *peer_address;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
    u_short peer_port;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   232
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
   233
    evhttp_request_get_peer(request, &peer_address, &peer_port);
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   234
    
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
    // request arguments
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   236
    u_int32_t img_w = 256, img_h = 256;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   237
    struct evkeyval *qarg;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   238
    struct evkeyvalq qargs;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   239
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
   240
/*
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
   241
    enum query_arg_type {
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
   242
        QARG_END,
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
   243
        QARG_INT,
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
   244
    };
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
   245
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
   246
    struct query_arg {
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
   247
        const char          *qa_key;
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
   248
        enum query_arg_type  qa_type;
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
   249
        void                *qa_addr;
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
   250
    } arg_def[] = {
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
   251
        { "w",      QARG_INT,   &img_w  },
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
   252
        { "h",      QARG_INT,   &img_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
   253
        { NULL,     QARG_END,   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
   254
    };
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
   255
*/
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
   256
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   257
    evhttp_parse_query(uri, &qargs);
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   258
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   259
    TAILQ_FOREACH(qarg, &qargs, next) {
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   260
        if (strcmp(qarg->key, "w") == 0)
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   261
            img_w = strtol(qarg->value, NULL, 10);
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
        else if (strcmp(qarg->key, "h") == 0)
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   263
            img_h = strtol(qarg->value, NULL, 10);
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   264
    }
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   265
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   266
    // clean up the qargs (badly named functions :< )
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   267
    evhttp_clear_headers(&qargs);
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   268
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   269
    // request log
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
   270
    printf("REQ: [%s:%d] method=%d, uri=%s, img_w=%d, img_h=%d\n", peer_address, peer_port, evhttp_request_get_type(request), uri, img_w, img_h);
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
    
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   272
    // do it
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   273
    _http_render_execute(request, img_w, img_h);
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   274
}
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   275
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
   276
struct event ev_sigint;
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
   277
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
   278
void sigint_handler (int signal, short event, void *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
   279
    printf("SIGINT: shutting down\n");
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
   280
    
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
   281
    if (event_base_loopexit(ev_base, 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
   282
        err_exit("event_loopexit");
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
   283
}
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
   284
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
   285
void signals_init () {
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   286
    // handle SIGINT
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
   287
    signal_set(&ev_sigint, SIGINT, &sigint_handler, 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
   288
    signal_add(&ev_sigint, NULL);
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   289
    
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   290
    // ignore SIGPIPE
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   291
    struct sigaction sigpipe;
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   292
    memset(&sigpipe, 0, sizeof(sigpipe));
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   293
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   294
    sigpipe.sa_handler = SIG_IGN;
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   295
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   296
    sigaction(SIGPIPE, &sigpipe, 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
   297
}
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
   298
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
   299
void signals_deinit () {
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
   300
    signal_del(&ev_sigint);
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
   301
}
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
   302
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   303
void log_null (int severity, const char *msg) {
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   304
    // ignore
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   305
}
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   306
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   307
int main (int argc, char **argv) {
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
   308
    // libevent init
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
   309
    ev_base = event_init();
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   310
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   311
    if (!ev_base)
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   312
        die("event_init");
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
   313
    
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   314
    // set up our render node pool
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   315
    remote_pool_init(&remote_pool);
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   316
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   317
    // process arguments
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   318
    int opt;
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   319
    int enable_debug = 0;
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   320
    char *host, *port;
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   321
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   322
    while ((opt = getopt(argc, argv, "dp:r:")) != -1) {
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   323
        switch (opt) {
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   324
            case 'p':
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   325
                // populate the pool from a file
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   326
                if (remote_pool_load(&remote_pool, optarg))
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   327
                    return 1;
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   328
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   329
                break;
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   330
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   331
            case 'r':
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   332
                // add the given render node to the pool
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   333
                if (
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   334
                        parse_hostport(optarg, &host, &port)
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   335
                     || remote_pool_add(&remote_pool, host, port)
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   336
                )
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   337
                    return 1;
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   338
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   339
                break;
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   340
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   341
            case 'd':
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   342
                // enable libevent debugging
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   343
                enable_debug = 1;
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   344
                break;
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   345
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   346
            default:
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   347
                err_exit("Usage: %s [-d] (-p pool_file | -r hostname[:port] | ...)", argv[0]);
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   348
        
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   349
        }
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   350
    }
8
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   351
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   352
    int pool_size = remote_pool_size(&remote_pool);
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   353
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   354
    if (!pool_size) {
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   355
        err_exit("No remote render nodes given");
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   356
    }
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   357
4d38ccbeb93e * fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   358
    printf("Registered %d render nodes in our pool\n", pool_size);
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   359
    
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   360
    // per default it is enabled
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   361
    if (!enable_debug)
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   362
        event_set_log_callback(&log_null);
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   363
    
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
   364
    // handle signals
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
   365
    signals_init();
6
4252c27f2b72 flow control for web_main.c
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   366
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
   367
    // evhttp init
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   368
    struct evhttp *http_server = evhttp_new(ev_base);
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   369
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   370
    if (!http_server)
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   371
        die("evhttp_new");
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   372
    
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   373
    // bind to the correct interface/port
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   374
    if (evhttp_bind_socket(http_server, "0.0.0.0", 8117))
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   375
        die("evhttp_bind_socket");
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   376
    
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   377
    // add our http request handler
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   378
    evhttp_set_cb(http_server, "/render", &http_render, NULL);
2
69f8c0acaac7 working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   379
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   380
    // we shall now run
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   381
    printf("RUN 0.0.0.0:8117\n");
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   382
    
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   383
    // run the libevent mainloop
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
   384
    if (event_base_dispatch(ev_base))
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   385
        die("event_dispatch");
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
   386
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
   387
    printf("SHUTDOWN\n");
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   388
    
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   389
    // clean up
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
   390
    signals_deinit();
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   391
    evhttp_free(http_server);
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
   392
    event_base_free(ev_base);
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   393
    
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   394
    // successfull exit
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   395
    return 0;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   396
}