# HG changeset patch # User Tero Marttila # Date 1212285833 -10800 # Node ID 49edbdf9ebe7dc76389258e5e392a97d711abc40 # Parent 675be0a451570a63fd3a7e84b51f3b3d4aa01ecf updated code to use libevent svn (with custom modifications, need to create a git repo for that) committer: Tero Marttila diff -r 675be0a45157 -r 49edbdf9ebe7 Makefile --- a/Makefile Sun Jun 01 01:48:09 2008 +0300 +++ b/Makefile Sun Jun 01 05:03:53 2008 +0300 @@ -1,5 +1,5 @@ -LDFLAGS = -L/usr/local/lib -levent -lpng -CFLAGS = -Wall -g +LDFLAGS = -Llib/libevent-dev/lib -levent -lpng +CFLAGS = -Wall -g -Ilib/libevent-dev/include OBJS = common.o mandelbrot.o render.o render_remote.o HEADERS = common.h mandelbrot.h render.h diff -r 675be0a45157 -r 49edbdf9ebe7 render_remote.c --- a/render_remote.c Sun Jun 01 01:48:09 2008 +0300 +++ b/render_remote.c Sun Jun 01 05:03:53 2008 +0300 @@ -4,11 +4,14 @@ #include #include +#include +#include + #include "render_remote.h" #include "common.h" struct remote_render_ctx { - struct event ev_conn; + struct event *ev_conn; struct bufferevent *data_bev; #pragma pack(push) @@ -42,6 +45,9 @@ bufferevent_free((*ctx)->data_bev); (*ctx)->data_bev = NULL; } + + // and the event + event_free((*ctx)->ev_conn); // free the context structure free(*ctx); @@ -172,41 +178,47 @@ int sock = socket(remote->ss_family, SOCK_STREAM, 0); if (sock < 0) { - free(ctx); perror("render_remote: socket"); - return NULL; + goto error; } // mark it as nonblocking if (fcntl(sock, F_SETFL, O_NONBLOCK) == -1) { - free(ctx); - close(sock); perror("render_remote: fcntl"); - return NULL; + goto error; } // initiate the connect int err = connect(sock, (struct sockaddr *) remote, sizeof(*remote)); if (err != -1 || errno != EINPROGRESS) { - free(ctx); - close(sock); perror("render_remote: connect"); - return NULL; + goto error; } // do the libevent dance - event_set(&ctx->ev_conn, sock, EV_WRITE, &_remote_connected, ctx); + ctx->ev_conn = event_new(NULL, sock, EV_WRITE, &_remote_connected, ctx); - if (event_add(&ctx->ev_conn, NULL)) { - free(ctx); - close(sock); + if (!ctx->ev_conn) { + error("render_remote: event_new"); + goto error; + } + + if (event_add(ctx->ev_conn, NULL)) { error("render_remote: event_add"); - return NULL; + goto error; } // success return ctx; + +error: + free(ctx); + + if (sock > 0) + close(sock); + + return NULL; } int render_remote_set_chunk_size (struct remote_render_ctx *ctx, size_t chunk_size, size_t overflow_buffer) { @@ -220,13 +232,13 @@ void render_remote_cancel (struct remote_render_ctx *ctx) { // if it's still just connecting, cancel that - if (event_pending(&ctx->ev_conn, EV_WRITE, NULL)) { - event_del(&ctx->ev_conn); + 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_FD(&ctx->ev_conn)); + close(event_get_fd(ctx->ev_conn)); // this takes care of the rest _remote_render_ctx_free (&ctx); diff -r 675be0a45157 -r 49edbdf9ebe7 render_remote.h --- a/render_remote.h Sun Jun 01 01:48:09 2008 +0300 +++ b/render_remote.h Sun Jun 01 05:03:53 2008 +0300 @@ -1,7 +1,8 @@ #ifndef RENDER_REMOTE_H #define RENDER_REMOTE_H -#include +#include +#include #include "render.h" @@ -25,6 +26,7 @@ * cb_fail is called when an error is encountered. This can (and will) happen at any time! */ struct remote_render_ctx *render_remote ( + struct event_base *evbase, render_t *render_ctx, // what to render struct sockaddr_storage *remote, // what render node to use void (*cb_sent)(void *arg), diff -r 675be0a45157 -r 49edbdf9ebe7 web_main.c --- a/web_main.c Sun Jun 01 01:48:09 2008 +0300 +++ b/web_main.c Sun Jun 01 05:03:53 2008 +0300 @@ -8,8 +8,10 @@ #include #include -#include -#include +#include +#include +#include +#include #include "render.h" #include "render_remote.h" @@ -18,6 +20,10 @@ #define CHUNK_SIZE 4096 #define OVERFLOW_BUFFER 4096 + +// what event_base we're using +static struct event_base *ev_base; + // what render node to use static struct sockaddr_storage render_node; @@ -33,9 +39,6 @@ }; void _render_cleanup (struct render_request *ctx) { - // not interested anymore - evhttp_connection_set_closecb(ctx->http_request->evcon, NULL, NULL); - // clean up free(ctx); } @@ -47,7 +50,7 @@ render_remote_set_chunk_size(ctx->remote_ctx, CHUNK_SIZE, OVERFLOW_BUFFER); // send headers - evhttp_add_header(ctx->http_request->output_headers, "Content-Type", "image/png"); + 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"); ctx->headers_sent = 1; @@ -94,7 +97,7 @@ _render_cleanup(ctx); } -void _render_http_lost (struct evhttp_connection *connection, void *arg) { +void _render_http_lost (struct evhttp_request *req, void *arg) { struct render_request *ctx = arg; printf("render [%p]: lost http connection\n", ctx); @@ -133,7 +136,7 @@ } // set close cb - evhttp_connection_set_closecb(request->evcon, &_render_http_lost, req_ctx); + evhttp_set_reply_abortcb(request, &_render_http_lost, req_ctx); printf("render [%p]: started\n", req_ctx); } @@ -143,17 +146,34 @@ */ void http_render (struct evhttp_request *request, void *arg) { // gather some info about the request - const char *uri = evhttp_request_uri(request); + const char *uri = evhttp_request_get_uri(request); char *peer_address; u_short peer_port; - evhttp_connection_get_peer(request->evcon, &peer_address, &peer_port); + evhttp_request_get_peer(request, &peer_address, &peer_port); // request arguments u_int32_t img_w = 256, img_h = 256; struct evkeyval *qarg; struct evkeyvalq qargs; +/* + enum query_arg_type { + QARG_END, + QARG_INT, + }; + + struct query_arg { + const char *qa_key; + enum query_arg_type qa_type; + void *qa_addr; + } arg_def[] = { + { "w", QARG_INT, &img_w }, + { "h", QARG_INT, &img_h }, + { NULL, QARG_END, NULL } + }; +*/ + evhttp_parse_query(uri, &qargs); TAILQ_FOREACH(qarg, &qargs, next) { @@ -167,7 +187,7 @@ evhttp_clear_headers(&qargs); // request log - printf("REQ: [%s:%d] method=%d, uri=%s, img_w=%d, img_h=%d\n", peer_address, peer_port, request->type, uri, img_w, img_h); + printf("REQ: [%s:%d] method=%d, uri=%s, img_w=%d, img_h=%d\n", peer_address, peer_port, evhttp_request_get_type(request), uri, img_w, img_h); // do it _http_render_execute(request, img_w, img_h); @@ -178,7 +198,7 @@ void sigint_handler (int signal, short event, void *arg) { printf("SIGINT: shutting down\n"); - if (event_loopexit(NULL)) + if (event_base_loopexit(ev_base, NULL)) err_exit("event_loopexit"); } @@ -193,7 +213,7 @@ int main (void) { // libevent init - struct event_base *ev_base = event_init(); + ev_base = event_init(); if (!ev_base) die("event_init"); @@ -225,7 +245,7 @@ printf("RUN 0.0.0.0:8117\n"); // run the libevent mainloop - if (event_dispatch()) + if (event_base_dispatch(ev_base)) die("event_dispatch"); printf("SHUTDOWN\n");