int stratcon_realtime_http_postresolve(eventer_t e, int mask, void *closure, struct timeval *now) { noit_http_session_ctx *ctx = closure; realtime_context *rc = noit_http_session_dispatcher_closure(ctx); struct realtime_tracker *node; for(node = rc->checklist; node; node = node->next) { if(node->noit) { realtime_recv_ctx_t *rrctx; rrctx = calloc(1, sizeof(*rrctx)); rrctx->ctx = ctx; rrctx->rt = node; stratcon_streamer_connection(NULL, node->noit, "noit", stratcon_realtime_recv_handler, NULL, rrctx, free_realtime_recv_ctx); } else noit_http_session_ref_dec(ctx); } if(noit_http_session_ref_cnt(ctx) == 1) { noit_http_response_end(ctx); clear_realtime_context(rc); noit_http_session_trigger(ctx, EVENTER_WRITE); } return 0; }
static void free_realtime_recv_ctx(void *vctx) { realtime_recv_ctx_t *rrctx = vctx; noit_http_session_ctx *ctx = rrctx->ctx; realtime_context *rc = noit_http_session_dispatcher_closure(ctx); if(noit_http_session_ref_dec(ctx) == 1) { noit_http_response_end(ctx); clear_realtime_context(rc); noit_http_session_trigger(ctx, EVENTER_WRITE | EVENTER_EXCEPTION); } free(rrctx); }
static void free_realtime_recv_ctx(void *vctx) { realtime_recv_ctx_t *rrctx = vctx; noit_http_session_ctx *ctx = rrctx->ctx; realtime_context *rc = ctx->dispatcher_closure; if(noit_atomic_dec32(&ctx->ref_cnt) == 1) { noit_http_response_end(ctx); clear_realtime_context(rc); if(ctx->conn.e) eventer_trigger(ctx->conn.e, EVENTER_WRITE | EVENTER_EXCEPTION); } free(rrctx); }