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-- |
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 | 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 | 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 | 26 |
// do not do any userland socket output buffering |
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 | 44 |
|
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 | 48 |
// cb func prototypes |
49 |
void _render_http_written (struct evhttp_request *request, void *arg); |
|
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 | 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 | 65 |
|
66 |
// setup flow-control |
|
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 | 79 |
// ignore empty buffers, a result of render_remote_shake() |
80 |
if (buf_size == 0) { |
|
81 |
printf("render [%p]: remote buffer is empty\n", ctx); |
|
82 |
||
83 |
return; |
|
84 |
} |
|
85 |
||
86 |
// check if we are paused |
|
87 |
if (ctx->paused) { |
|
88 |
// we are waiting for the HTTP send buffer to clear, so keep the data in the render buffer |
|
89 |
printf("render [%p]: delaying data: %zu:%zu bytes\n", ctx, buf_size, ctx->bytes_sent); |
|
90 |
||
91 |
return; |
|
92 |
} |
|
93 |
||
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 | 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 | 99 |
// mark ourself as paused until httpd tells us to continue |
100 |
ctx->paused = 1; |
|
101 |
||
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 | 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 |
110 |
if (ctx->paused) { |
|
111 |
printf("render [%p]: done: flushing the rest of our data\n", ctx); |
|
112 |
ctx->paused = 0; |
|
113 |
||
114 |
render_remote_shake(ctx->remote_ctx); |
|
115 |
} |
|
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 | 121 |
|
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 | 152 |
void _render_http_written (struct evhttp_request *request, void *arg) { |
153 |
struct render_request *ctx = arg; |
|
154 |
||
155 |
printf("render [%p]: http available for write\n", ctx); |
|
156 |
||
157 |
// unpause ourself |
|
158 |
ctx->paused = 0; |
|
159 |
||
160 |
// shake out the buffers |
|
161 |
render_remote_shake(ctx->remote_ctx); |
|
162 |
} |
|
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 | 303 |
void log_null (int severity, const char *msg) { |
304 |
// ignore |
|
305 |
} |
|
306 |
||
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 | 318 |
int opt; |
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 | 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 | 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 | 341 |
case 'd': |
342 |
// enable libevent debugging |
|
343 |
enable_debug = 1; |
|
344 |
break; |
|
345 |
||
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 | 348 |
|
349 |
} |
|
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 | 359 |
|
360 |
// per default it is enabled |
|
361 |
if (!enable_debug) |
|
362 |
event_set_log_callback(&log_null); |
|
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 | 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 |
} |