author | Tero Marttila <terom@fixme.fi> |
Fri, 06 Jun 2008 23:37:45 +0300 | |
changeset 12 | 43297144f196 |
parent 10 | 9daa832ab9c4 |
child 13 | ee426f453cf5 |
permissions | -rw-r--r-- |
12
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
1 |
#include <sys/types.h> |
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
2 |
#include <sys/queue.h> |
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
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> |
12
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
5 |
#include <stdio.h> |
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
6 |
#include <string.h> |
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
7 |
#include <netinet/ip.h> |
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
8 |
#include <arpa/inet.h> |
10
9daa832ab9c4
separate http query argument parsing into a new http module, and clean up unused headers from web_main.c
Tero Marttila <terom@fixme.fi>
parents:
8
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> |
12
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
14 |
#include <event2/http.h> |
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
|
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 |
|
12
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
17 |
#include "common.h" |
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
18 |
#include "http.h" |
2
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
19 |
#include "render.h" |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
20 |
#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
|
21 |
#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
|
22 |
#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
|
23 |
|
6 | 24 |
#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
|
25 |
#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
|
26 |
|
6 | 27 |
// do not do any userland socket output buffering |
28 |
#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
|
29 |
|
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 |
// 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
|
31 |
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
|
32 |
|
8
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
33 |
// 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
|
34 |
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
|
35 |
|
2
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
36 |
// info on a render request |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
37 |
struct render_request { |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
38 |
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
|
39 |
|
2
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
40 |
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
|
41 |
|
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 |
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
|
43 |
|
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
|
44 |
size_t bytes_sent; |
6 | 45 |
|
46 |
int paused; |
|
2
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
47 |
}; |
0
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
48 |
|
6 | 49 |
// cb func prototypes |
50 |
void _render_http_written (struct evhttp_request *request, void *arg); |
|
51 |
||
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
|
52 |
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
|
53 |
// 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
|
54 |
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
|
55 |
} |
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
|
56 |
|
2
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
57 |
void _render_sent (void *arg) { |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
58 |
struct render_request *ctx = arg; |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
59 |
|
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
|
60 |
// set chunk size |
6 | 61 |
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
|
62 |
|
2
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
63 |
// 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
|
64 |
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
|
65 |
evhttp_send_reply_start(ctx->http_request, HTTP_OK, "OK"); |
6 | 66 |
|
67 |
// setup flow-control |
|
68 |
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
|
69 |
|
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
70 |
ctx->headers_sent = 1; |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
71 |
|
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
72 |
printf("render [%p]: sent headers\n", ctx); |
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 |
|
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
75 |
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
|
76 |
struct render_request *ctx = arg; |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
77 |
|
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
|
78 |
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
|
79 |
|
6 | 80 |
// ignore empty buffers, a result of render_remote_shake() |
81 |
if (buf_size == 0) { |
|
82 |
printf("render [%p]: remote buffer is empty\n", ctx); |
|
83 |
||
84 |
return; |
|
85 |
} |
|
86 |
||
87 |
// check if we are paused |
|
88 |
if (ctx->paused) { |
|
89 |
// we are waiting for the HTTP send buffer to clear, so keep the data in the render buffer |
|
90 |
printf("render [%p]: delaying data: %zu:%zu bytes\n", ctx, buf_size, ctx->bytes_sent); |
|
91 |
||
92 |
return; |
|
93 |
} |
|
94 |
||
95 |
// move chunk to http buffers |
|
2
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
96 |
evhttp_send_reply_chunk(ctx->http_request, buf); |
6 | 97 |
|
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
|
98 |
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
|
99 |
|
6 | 100 |
// mark ourself as paused until httpd tells us to continue |
101 |
ctx->paused = 1; |
|
102 |
||
103 |
// 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
|
104 |
ctx->bytes_sent += buf_size; |
2
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 |
|
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
107 |
void _render_done (void *arg) { |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
108 |
struct render_request *ctx = arg; |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
109 |
|
6 | 110 |
// 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 |
111 |
if (ctx->paused) { |
|
112 |
printf("render [%p]: done: flushing the rest of our data\n", ctx); |
|
113 |
ctx->paused = 0; |
|
114 |
||
115 |
render_remote_shake(ctx->remote_ctx); |
|
116 |
} |
|
117 |
||
2
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
118 |
// send end |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
119 |
evhttp_send_reply_end(ctx->http_request); |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
120 |
|
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
|
121 |
printf("render [%p]: done: %zu bytes\n", ctx, ctx->bytes_sent); |
6 | 122 |
|
123 |
// 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
|
124 |
_render_cleanup(ctx); |
2
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 |
|
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
127 |
void _render_fail (void *arg) { |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
128 |
struct render_request *ctx = arg; |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
129 |
|
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
130 |
if (ctx->headers_sent) { |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
131 |
// 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
|
132 |
evhttp_send_reply_end(ctx->http_request); |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
133 |
} else { |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
134 |
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
|
135 |
} |
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
136 |
|
2
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
137 |
printf("render [%p]: failed\n", ctx); |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
138 |
|
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
|
139 |
_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
|
140 |
} |
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
|
141 |
|
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
|
142 |
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
|
143 |
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
|
144 |
|
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 |
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
|
146 |
|
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 |
// 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
|
148 |
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
|
149 |
|
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
|
150 |
_render_cleanup(ctx); |
2
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
151 |
} |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
152 |
|
6 | 153 |
void _render_http_written (struct evhttp_request *request, void *arg) { |
154 |
struct render_request *ctx = arg; |
|
155 |
||
156 |
printf("render [%p]: http available for write\n", ctx); |
|
157 |
||
158 |
// unpause ourself |
|
159 |
ctx->paused = 0; |
|
160 |
||
161 |
// shake out the buffers |
|
162 |
render_remote_shake(ctx->remote_ctx); |
|
163 |
} |
|
164 |
||
2
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
165 |
void _http_render_execute (struct evhttp_request *request, u_int32_t img_w, u_int32_t img_h) { |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
166 |
// render request context |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
167 |
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
|
168 |
|
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
169 |
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
|
170 |
ERROR("calloc"); |
2
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
171 |
|
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
172 |
req_ctx->http_request = request; |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
173 |
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
|
174 |
req_ctx->bytes_sent = 0; |
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 |
// render context |
12
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
177 |
struct render *render; |
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
178 |
|
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
179 |
if (!(render = render_alloc())) |
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
180 |
ERROR("render_alloc"); |
8
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
181 |
|
12
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
182 |
if (render_set_mode(render, RENDER_PNG)) |
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
183 |
ERROR("render_set_mode"); |
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
184 |
|
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
185 |
if (render_set_size(render, img_w, 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
|
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 |
|
12
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
188 |
if (render_region_full(render)) |
8
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 |
12
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
198 |
if ((req_ctx->remote_ctx = render_remote(render, 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 |
|
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
|
207 |
// 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
|
208 |
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
|
209 |
|
2
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
210 |
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
|
211 |
|
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
212 |
return; |
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 |
error: |
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
215 |
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
|
216 |
|
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
217 |
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
|
218 |
|
0
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
219 |
} |
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
220 |
|
2
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
221 |
/* |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
222 |
* HTTP request handler |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
223 |
*/ |
0
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
224 |
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
|
225 |
// 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
|
226 |
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
|
227 |
char *peer_address; |
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
228 |
u_short peer_port; |
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
229 |
|
4
49edbdf9ebe7
updated code to use libevent svn (with custom modifications, need to create a git repo for that)
Tero Marttila <terom@fixme.fi>
parents:
3
diff
changeset
|
230 |
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
|
231 |
|
12
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
232 |
u_int32_t img_w = 256, img_h = 256; |
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
233 |
|
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
234 |
// parse request arguments |
10
9daa832ab9c4
separate http query argument parsing into a new http module, and clean up unused headers from web_main.c
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
235 |
struct http_qarg qarg_spec[] = { |
9daa832ab9c4
separate http query argument parsing into a new http module, and clean up unused headers from web_main.c
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
236 |
{ "w", QARG_UINT, &img_w }, |
9daa832ab9c4
separate http query argument parsing into a new http module, and clean up unused headers from web_main.c
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
237 |
{ "h", QARG_UINT, &img_h }, |
9daa832ab9c4
separate http query argument parsing into a new http module, and clean up unused headers from web_main.c
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
238 |
{ NULL, QARG_END, NULL } |
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
|
239 |
}; |
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 |
|
10
9daa832ab9c4
separate http query argument parsing into a new http module, and clean up unused headers from web_main.c
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
241 |
http_qarg_parse(request, qarg_spec); |
0
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
242 |
|
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
243 |
// request log |
12
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
244 |
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
|
245 |
|
2
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
246 |
// do it |
69f8c0acaac7
working web_main that uses render_remote
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
247 |
_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
|
248 |
} |
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
249 |
|
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
|
250 |
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
|
251 |
|
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
|
252 |
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
|
253 |
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
|
254 |
|
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
|
255 |
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
|
256 |
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
|
257 |
} |
675be0a45157
working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents:
2
diff
changeset
|
258 |
|
675be0a45157
working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents:
2
diff
changeset
|
259 |
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
|
260 |
// 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
|
261 |
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
|
262 |
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
|
263 |
|
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
264 |
// 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
|
265 |
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
|
266 |
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
|
267 |
|
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
268 |
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
|
269 |
|
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
270 |
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
|
271 |
} |
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
|
272 |
|
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
|
273 |
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
|
274 |
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
|
275 |
} |
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 |
|
6 | 277 |
void log_null (int severity, const char *msg) { |
278 |
// ignore |
|
279 |
} |
|
280 |
||
281 |
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
|
282 |
// 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
|
283 |
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
|
284 |
|
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
285 |
if (!ev_base) |
12
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
286 |
FATAL("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
|
287 |
|
8
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
288 |
// 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
|
289 |
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
|
290 |
|
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
291 |
// process arguments |
6 | 292 |
int opt; |
293 |
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
|
294 |
char *host, *port; |
6 | 295 |
|
8
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
296 |
while ((opt = getopt(argc, argv, "dp:r:")) != -1) { |
6 | 297 |
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
|
298 |
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
|
299 |
// 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
|
300 |
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
|
301 |
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
|
302 |
|
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
303 |
break; |
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
304 |
|
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
305 |
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
|
306 |
// 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
|
307 |
if ( |
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
308 |
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
|
309 |
|| 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
|
310 |
) |
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
311 |
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
|
312 |
|
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
313 |
break; |
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
314 |
|
6 | 315 |
case 'd': |
316 |
// enable libevent debugging |
|
317 |
enable_debug = 1; |
|
318 |
break; |
|
319 |
||
320 |
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
|
321 |
err_exit("Usage: %s [-d] (-p pool_file | -r hostname[:port] | ...)", argv[0]); |
6 | 322 |
|
323 |
} |
|
324 |
} |
|
8
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
325 |
|
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
326 |
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
|
327 |
|
12
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
328 |
if (!pool_size) |
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
329 |
FATAL("No remote render nodes given"); |
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
330 |
|
8
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
331 |
|
4d38ccbeb93e
* fix Makefile to build in a (more) sensible way (still not really perfect)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
332 |
printf("Registered %d render nodes in our pool\n", pool_size); |
6 | 333 |
|
334 |
// per default it is enabled |
|
335 |
if (!enable_debug) |
|
336 |
event_set_log_callback(&log_null); |
|
337 |
||
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
|
338 |
// 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
|
339 |
signals_init(); |
6 | 340 |
|
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
|
341 |
// evhttp init |
0
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
342 |
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
|
343 |
|
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
344 |
if (!http_server) |
12
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
345 |
FATAL("evhttp_new"); |
0
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
346 |
|
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
347 |
// 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
|
348 |
if (evhttp_bind_socket(http_server, "0.0.0.0", 8117)) |
12
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
349 |
FATAL("evhttp_bind_socket"); |
0
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
350 |
|
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
351 |
// 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
|
352 |
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
|
353 |
|
0
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
354 |
// we shall now run |
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
355 |
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
|
356 |
|
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
357 |
// 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
|
358 |
if (event_base_dispatch(ev_base)) |
12
43297144f196
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
359 |
WARNING("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
|
360 |
|
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
|
361 |
printf("SHUTDOWN\n"); |
0
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
362 |
|
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
363 |
// 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
|
364 |
signals_deinit(); |
0
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
365 |
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
|
366 |
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
|
367 |
|
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
368 |
// successfull exit |
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
369 |
return 0; |
5b010627d7ed
initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
370 |
} |