--- 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);
}