render_remote.c
changeset 8 4d38ccbeb93e
parent 6 4252c27f2b72
child 11 082bfaf38cf0
--- a/render_remote.c	Thu Jun 05 23:04:28 2008 +0300
+++ b/render_remote.c	Fri Jun 06 03:24:22 2008 +0300
@@ -14,6 +14,8 @@
     struct event *ev_conn;
     struct bufferevent *data_bev;
 
+    struct remote_node *remote_node;
+
     #pragma pack(push)
     #pragma pack(1)
 
@@ -39,27 +41,33 @@
     void *cb_arg;
 };
 
-void _remote_render_ctx_free (struct remote_render_ctx **ctx) {
+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);
+
     // 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;
     }
 
-    // and the event
-    event_free((*ctx)->ev_conn);
+    // update remote_node load
+    ctx->remote_node->current_load--;
     
     // 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)
 
@@ -117,7 +125,7 @@
     }
 
     // free resources
-    _remote_render_ctx_free(&ctx);
+    _remote_render_ctx_free(ctx);
 }
 
 void _remote_connected (int fd, short event, void *arg) {
@@ -149,13 +157,15 @@
 
 struct remote_render_ctx *render_remote (
         render_t *render_ctx,
-        struct sockaddr_storage *remote,
+        struct remote_node *remote_node,
         void (*cb_sent)(void *arg),
         void (*cb_data)(struct evbuffer *buf, void *arg),
         void (*cb_done)(void *arg),
         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);
+
     // alloc the remote render ctx
     struct remote_render_ctx *ctx = malloc(sizeof(struct remote_render_ctx));
 
@@ -170,12 +180,15 @@
     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);
     
     // create the socket
-    int sock = socket(remote->ss_family, SOCK_STREAM, 0);
+    int sock = socket(remote_node->addr.ss_family, SOCK_STREAM, 0);
 
     if (sock < 0) {
         perror("render_remote: socket");
@@ -189,7 +202,7 @@
     }
     
     // initiate the connect
-    int err = connect(sock, (struct sockaddr *) remote, sizeof(*remote));
+    int err = connect(sock, (struct sockaddr *) &remote_node->addr, sizeof(remote_node->addr));
 
     if (err != -1 || errno != EINPROGRESS) {
         perror("render_remote: connect");
@@ -208,6 +221,9 @@
         error("render_remote: event_add");
         goto error;
     }
+
+    // update remote_node load
+    remote_node->current_load++;
     
     // success
     return ctx;
@@ -243,13 +259,9 @@
     // 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);
 }