web_main.c
changeset 19 d18606bb6f20
parent 18 86f2e5b7191b
child 24 8307d28329ae
equal deleted inserted replaced
18:86f2e5b7191b 19:d18606bb6f20
    42 struct render_request {
    42 struct render_request {
    43     struct evhttp_request *http_request;
    43     struct evhttp_request *http_request;
    44 
    44 
    45     int headers_sent;
    45     int headers_sent;
    46     
    46     
    47     struct render_multi *render_info;
    47     struct render_remote *render_info;
    48 
    48 
    49     size_t bytes_sent;
    49     size_t bytes_sent;
    50 
    50 
    51     int paused;
    51     int paused;
    52 };
    52 };
    54 // cb func prototypes
    54 // cb func prototypes
    55 static void _render_http_written (struct evhttp_request *request, void *arg);
    55 static void _render_http_written (struct evhttp_request *request, void *arg);
    56 
    56 
    57 static void _render_cleanup (struct render_request *ctx) {
    57 static void _render_cleanup (struct render_request *ctx) {
    58     if (ctx->render_info)
    58     if (ctx->render_info)
    59         render_multi_free(ctx->render_info);
    59         render_remote_free(ctx->render_info);
    60 
    60 
    61     free(ctx);
    61     free(ctx);
    62 }
    62 }
    63 
    63 
    64 static void _render_sent (void *arg) {
    64 static void _render_sent (void *arg) {
    79 static void _render_data (struct evbuffer *buf, void *arg) {
    79 static void _render_data (struct evbuffer *buf, void *arg) {
    80     struct render_request *ctx = arg;
    80     struct render_request *ctx = arg;
    81 
    81 
    82     size_t buf_size = EVBUFFER_LENGTH(buf);
    82     size_t buf_size = EVBUFFER_LENGTH(buf);
    83 
    83 
    84     assert(buf_size > 0);   // shouldn't happen anymore with the new render_multi
    84     assert(buf_size > 0);   // shouldn't happen anymore with the new render_remote
    85     
    85     
    86     // check if we are paused
    86     // check if we are paused
    87     if (ctx->paused) {
    87     if (ctx->paused) {
    88         // we are waiting for the HTTP send buffer to clear, so keep the data in the render buffer
    88         // we are waiting for the HTTP send buffer to clear, so keep the data in the render buffer
    89         printf("render [%p]: delaying data: %zu:%zu bytes\n", ctx, buf_size, ctx->bytes_sent);
    89         printf("render [%p]: delaying data: %zu:%zu bytes\n", ctx, buf_size, ctx->bytes_sent);
   135     struct render_request *ctx = arg;
   135     struct render_request *ctx = arg;
   136 
   136 
   137     printf("render [%p]: lost http connection\n", ctx);
   137     printf("render [%p]: lost http connection\n", ctx);
   138 
   138 
   139     // cancel
   139     // cancel
   140     render_multi_cancel(ctx->render_info);
   140     render_remote_cancel(ctx->render_info);
   141     ctx->render_info = NULL;
   141     ctx->render_info = NULL;
   142 
   142 
   143     _render_cleanup(ctx);
   143     _render_cleanup(ctx);
   144 }
   144 }
   145 
   145 
   150     
   150     
   151     // unpause ourself
   151     // unpause ourself
   152     ctx->paused = 0;
   152     ctx->paused = 0;
   153 
   153 
   154     // any data waiting in the buffer?
   154     // any data waiting in the buffer?
   155     render_multi_flush(ctx->render_info);
   155     render_remote_flush(ctx->render_info);
   156 }
   156 }
   157 
   157 
   158 static void _http_render_execute (struct evhttp_request *request, u_int32_t img_w, u_int32_t img_h) {
   158 static void _http_render_execute (struct evhttp_request *request, u_int32_t img_w, u_int32_t img_h) {
   159     // render request context
   159     // render request context
   160     struct render_request *ctx = calloc(1, sizeof(struct render_request));
   160     struct render_request *ctx = calloc(1, sizeof(struct render_request));
   177 
   177 
   178     if (render_region_full(&render))
   178     if (render_region_full(&render))
   179         ERROR("render_region_full");
   179         ERROR("render_region_full");
   180 
   180 
   181     // initiate the remote render operation
   181     // initiate the remote render operation
   182     if ((ctx->render_info = render_multi(&render, &remote_pool,
   182     if ((ctx->render_info = render_remote(&render, &remote_pool,
   183         &_render_sent,
   183         &_render_sent,
   184         &_render_data,
   184         &_render_data,
   185         &_render_done,
   185         &_render_done,
   186         &_render_fail,
   186         &_render_fail,
   187         ctx
   187         ctx
   188     )) == NULL)
   188     )) == NULL)
   189         ERROR("render_multi");
   189         ERROR("render_remote");
   190     
   190     
   191     // set chunk size
   191     // set chunk size
   192     render_multi_set_recv(ctx->render_info, MIN_CHUNK_SIZE, OVERFLOW_BUFFER);
   192     render_remote_set_recv(ctx->render_info, MIN_CHUNK_SIZE, OVERFLOW_BUFFER);
   193 
   193 
   194     // set close cb
   194     // set close cb
   195     evhttp_set_reply_abortcb(request, &_render_http_lost, ctx);
   195     evhttp_set_reply_abortcb(request, &_render_http_lost, ctx);
   196     
   196     
   197     printf("render [%p]: started\n", ctx);
   197     printf("render [%p]: started\n", ctx);