web_main.c
changeset 15 e7f0697814dc
parent 13 ee426f453cf5
child 16 50995bbe442a
--- 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);
 }
 
 /*