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