render_remote.c
changeset 11 082bfaf38cf0
parent 8 4d38ccbeb93e
child 13 ee426f453cf5
--- a/render_remote.c	Fri Jun 06 16:05:26 2008 +0300
+++ b/render_remote.c	Fri Jun 06 18:35:46 2008 +0300
@@ -7,6 +7,7 @@
 #include <event2/event.h>
 #include <event2/bufferevent.h>
 
+#include "render_internal.h"    // for render_cmd_build
 #include "render_remote.h"
 #include "common.h"
 
@@ -14,8 +15,6 @@
     struct event *ev_conn;
     struct bufferevent *data_bev;
 
-    struct remote_node *remote_node;
-
     #pragma pack(push)
     #pragma pack(1)
 
@@ -41,33 +40,27 @@
     void *cb_arg;
 };
 
-void _remote_render_ctx_free (struct remote_render_ctx *ctx) {
-    // close the socket (ctx->ev_conn remains valid even after we're done with it...)
-    close(event_get_fd(ctx->ev_conn));
-    
-    // free the connect event
-    event_free(ctx->ev_conn);
-
+void _remote_render_ctx_free (struct remote_render_ctx **ctx) {
     // free the data_bev
-    if (ctx->data_bev) {
-        bufferevent_free(ctx->data_bev);
-        ctx->data_bev = NULL;
+    if ((*ctx)->data_bev) {
+        bufferevent_free((*ctx)->data_bev);
+        (*ctx)->data_bev = NULL;
     }
 
-    // update remote_node load
-    ctx->remote_node->current_load--;
+    // and the event
+    event_free((*ctx)->ev_conn);
     
     // free the context structure
-    free(ctx);
+    free(*ctx);
     
-    ctx = NULL;
+    *ctx = NULL;
 }
 
 #define RENDER_FAILED(ctx, desc) \
     do {                                        \
         perror(desc);                           \
         ctx->cb_fail(ctx->cb_arg);              \
-        _remote_render_ctx_free(ctx);          \
+        _remote_render_ctx_free(&ctx);          \
         return;                                 \
     } while (0)
 
@@ -125,7 +118,7 @@
     }
 
     // free resources
-    _remote_render_ctx_free(ctx);
+    _remote_render_ctx_free(&ctx);
 }
 
 void _remote_connected (int fd, short event, void *arg) {
@@ -144,19 +137,19 @@
         RENDER_FAILED(ctx, "render_remote: bufferevent_enable");
 }
 
-void render_cmd_build (render_t *rctx, struct remote_render_ctx *rrctx) {
+void render_cmd_build (struct render *render, struct remote_render_ctx *ctx) {
     // just copy over the render params to the render_cmd
-    rrctx->render_cmd.mode = rctx->mode;
-    rrctx->render_cmd.img_w = htonl(rctx->img_w);
-    rrctx->render_cmd.img_h = htonl(rctx->img_h);
-    rrctx->render_cmd.x1 = rctx->x1;
-    rrctx->render_cmd.y1 = rctx->y1;
-    rrctx->render_cmd.x2 = rctx->x2;
-    rrctx->render_cmd.y2 = rctx->y2;
+    ctx->render_cmd.mode = render->mode;
+    ctx->render_cmd.img_w = htonl(render->img_w);
+    ctx->render_cmd.img_h = htonl(render->img_h);
+    ctx->render_cmd.x1 = render->x1;
+    ctx->render_cmd.y1 = render->y1;
+    ctx->render_cmd.x2 = render->x2;
+    ctx->render_cmd.y2 = render->y2;
 }
 
 struct remote_render_ctx *render_remote (
-        render_t *render_ctx,
+        struct render *render,
         struct remote_node *remote_node,
         void (*cb_sent)(void *arg),
         void (*cb_data)(struct evbuffer *buf, void *arg),
@@ -164,15 +157,14 @@
         void (*cb_fail)(void *arg),
         void *cb_arg
 ) {    
-    printf("render_remote: remote render load: %d/%d\n", remote_node->current_load, remote_node->parallel_renders);
+    struct remote_render_ctx *ctx;
+    int sock;
+
+    printf("remote_node render load: %d/%d\n", remote_node->current_load, remote_node->parallel_renders);
 
     // alloc the remote render ctx
-    struct remote_render_ctx *ctx = malloc(sizeof(struct remote_render_ctx));
-
-    if (!ctx) {
-        error("render_remote: malloc");
-        return NULL;
-    }
+    if (!(ctx = calloc(1, sizeof(struct remote_render_ctx))))
+        ERROR("calloc");
     
     // store the provided callback functions
     ctx->cb_sent = cb_sent;
@@ -180,50 +172,30 @@
     ctx->cb_done = cb_done;
     ctx->cb_fail = cb_fail;
     ctx->cb_arg = cb_arg;
-
-    // keep a reference to remote_node so we can decr it's load
-    ctx->remote_node = remote_node;
     
     // copy the relevant stuff from the render_ctx
-    render_cmd_build(render_ctx, ctx);
+    render_cmd_build(render, ctx);
     
     // create the socket
-    int sock = socket(remote_node->addr.ss_family, SOCK_STREAM, 0);
-
-    if (sock < 0) {
-        perror("render_remote: socket");
-        goto error;
-    }
+    if ((sock = socket(remote_node->addr.ss_family, SOCK_STREAM, 0)) < 0)
+        PERROR("socket");
 
     // mark it as nonblocking
-    if (fcntl(sock, F_SETFL, O_NONBLOCK) == -1) {
-        perror("render_remote: fcntl");
-        goto error;
-    }
+    if (fcntl(sock, F_SETFL, O_NONBLOCK) == -1)
+        PERROR("fcntl");
     
     // initiate the connect
     int err = connect(sock, (struct sockaddr *) &remote_node->addr, sizeof(remote_node->addr));
 
-    if (err != -1 || errno != EINPROGRESS) {
-        perror("render_remote: connect");
-        goto error;
-    }
+    if (err != -1 || errno != EINPROGRESS)
+        PERROR("connect");
 
     // do the libevent dance
-    ctx->ev_conn = event_new(NULL, sock, EV_WRITE, &_remote_connected, ctx);
-
-    if (!ctx->ev_conn) {
-        error("render_remote: event_new");
-        goto error;
-    }
+    if (!(ctx->ev_conn = event_new(NULL, sock, EV_WRITE, &_remote_connected, ctx)))
+        ERROR("event_new");
 
-    if (event_add(ctx->ev_conn, NULL)) {
-        error("render_remote: event_add");
-        goto error;
-    }
-
-    // update remote_node load
-    remote_node->current_load++;
+    if (event_add(ctx->ev_conn, NULL))
+        ERROR("event_add");
     
     // success
     return ctx;
@@ -259,9 +231,13 @@
     // if it's still just connecting, cancel that
     if (event_pending(ctx->ev_conn, EV_WRITE, NULL)) {
         event_del(ctx->ev_conn);
+
     }
     
+    // close the socket (ctx->ev_conn remains valid even after we're done with it...)
+    close(event_get_fd(ctx->ev_conn));
+    
     // this takes care of the rest
-    _remote_render_ctx_free (ctx);
+    _remote_render_ctx_free (&ctx);
 }