--- a/web_main.c Sat Jun 07 05:18:06 2008 +0300
+++ b/web_main.c Sun Jun 08 21:03:23 2008 +0300
@@ -8,6 +8,7 @@
#include <arpa/inet.h>
#include <signal.h>
#include <unistd.h>
+#include <assert.h>
#include <event2/event.h>
#include <event2/event_compat.h>
@@ -43,7 +44,7 @@
int headers_sent;
- struct render_multi *render_info;
+ struct render_remote *render_info;
size_t bytes_sent;
@@ -54,16 +55,15 @@
static void _render_http_written (struct evhttp_request *request, void *arg);
static void _render_cleanup (struct render_request *ctx) {
- // clean up
+ if (ctx->render_info)
+ render_remote_free(ctx->render_info);
+
free(ctx);
}
static void _render_sent (void *arg) {
struct render_request *ctx = arg;
- // set chunk size
- render_multi_set_recv(ctx->render_info, MIN_CHUNK_SIZE, OVERFLOW_BUFFER);
-
// send headers
evhttp_add_header(evhttp_request_get_output_headers(ctx->http_request), "Content-Type", "image/png");
evhttp_send_reply_start(ctx->http_request, HTTP_OK, "OK");
@@ -81,12 +81,7 @@
size_t buf_size = EVBUFFER_LENGTH(buf);
- // ignore empty buffers, a result of render_remote_shake()
- if (buf_size == 0) {
- printf("render [%p]: remote buffer is empty\n", ctx);
-
- return;
- }
+ assert(buf_size > 0); // shouldn't happen anymore with the new render_remote
// check if we are paused
if (ctx->paused) {
@@ -111,14 +106,6 @@
static void _render_done (void *arg) {
struct render_request *ctx = arg;
- // 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
- if (ctx->paused) {
- printf("render [%p]: done: flushing the rest of our data\n", ctx);
- ctx->paused = 0;
-
- render_multi_shake(ctx->render_info);
- }
-
// send end
evhttp_send_reply_end(ctx->http_request);
@@ -134,6 +121,7 @@
if (ctx->headers_sent) {
// just terminate the PNG stream where it is
evhttp_send_reply_end(ctx->http_request);
+
} else {
evhttp_send_error(ctx->http_request, 500, "Internal Server Error");
}
@@ -149,7 +137,8 @@
printf("render [%p]: lost http connection\n", ctx);
// cancel
- render_multi_cancel(ctx->render_info);
+ render_remote_cancel(ctx->render_info);
+ ctx->render_info = NULL;
_render_cleanup(ctx);
}
@@ -162,20 +151,20 @@
// unpause ourself
ctx->paused = 0;
- // shake out the buffers
- render_multi_shake(ctx->render_info);
+ // any data waiting in the buffer?
+ render_remote_flush(ctx->render_info);
}
static void _http_render_execute (struct evhttp_request *request, u_int32_t img_w, u_int32_t img_h) {
// render request context
- struct render_request *req_ctx = calloc(1, sizeof(struct render_request));
+ struct render_request *ctx = calloc(1, sizeof(struct render_request));
- if (!req_ctx)
+ if (!ctx)
ERROR("calloc");
- req_ctx->http_request = request;
- req_ctx->headers_sent = 0;
- req_ctx->bytes_sent = 0;
+ ctx->http_request = request;
+ ctx->headers_sent = 0;
+ ctx->bytes_sent = 0;
// render context
struct render render;
@@ -189,36 +178,36 @@
if (render_region_full(&render))
ERROR("render_region_full");
-/*
// pick a render_node
struct remote_node *node_info;
if ((node_info = remote_pool_get(&remote_pool)) == NULL)
ERROR("remote_pool_get");
-*/
// initiate the remote render operation
- if ((req_ctx->render_info = render_multi(&render, &remote_pool,
+ if ((ctx->render_info = render_remote(&render, node_info,
&_render_sent,
&_render_data,
&_render_done,
&_render_fail,
- req_ctx
+ ctx
)) == NULL)
ERROR("render_multi");
+
+ // set chunk size
+ render_remote_set_recv(ctx->render_info, MIN_CHUNK_SIZE, OVERFLOW_BUFFER);
// set close cb
- evhttp_set_reply_abortcb(request, &_render_http_lost, req_ctx);
+ evhttp_set_reply_abortcb(request, &_render_http_lost, ctx);
- printf("render [%p]: started\n", req_ctx);
+ printf("render [%p]: started\n", ctx);
return;
error:
evhttp_send_error(request, 500, "Internal Server Error");
- free(req_ctx);
-
+ _render_cleanup(ctx);
}
/*