示例#1
0
static int
cnt_deliver(struct worker *wrk, struct req *req)
{
	struct busyobj *bo;

	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
	CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
	bo = req->busyobj;
	CHECK_OBJ_ORNULL(bo, BUSYOBJ_MAGIC);

	if (bo != NULL) {
		while (bo->state < BOS_FAILED)
			(void)usleep(10000);
		assert(bo->state >= BOS_FAILED);

		if (bo->state == BOS_FAILED) {
			HSH_Deref(&wrk->stats, NULL, &req->obj);
			VBO_DerefBusyObj(wrk, &req->busyobj);
			req->err_code = 503;
			req->req_step = R_STP_ERROR;
			return (0);
		}
		VBO_DerefBusyObj(wrk, &req->busyobj);
	}

	AZ(req->busyobj);
	req->director = NULL;
	req->restarts = 0;

	RES_WriteObj(req);

	/* No point in saving the body if it is hit-for-pass */
	if (req->obj->objcore->flags & OC_F_PASS)
		STV_Freestore(req->obj);

	assert(WRW_IsReleased(wrk));
	(void)HSH_Deref(&wrk->stats, NULL, &req->obj);
	http_Teardown(req->resp);
	return (1);
}
static int
cnt_deliver(struct sess *sp)
{

    CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
    CHECK_OBJ_NOTNULL(sp->obj, OBJECT_MAGIC);
    CHECK_OBJ_NOTNULL(sp->vcl, VCL_CONF_MAGIC);

    sp->t_resp = TIM_real();
    if (sp->obj->objhead != NULL) {
        if ((sp->t_resp - sp->obj->last_lru) > params->lru_timeout &&
                EXP_Touch(sp->obj))
            sp->obj->last_lru = sp->t_resp;	/* XXX: locking ? */
        sp->obj->last_use = sp->t_resp;	/* XXX: locking ? */
    }
    sp->wrk->resp = &sp->wrk->http[2];
    http_Setup(sp->wrk->resp, sp->wrk->ws);
    RES_BuildHttp(sp);
    VCL_deliver_method(sp);
    switch (sp->handling) {
    case VCL_RET_DELIVER:
        break;
    case VCL_RET_RESTART:
        INCOMPL();
        break;
    default:
        WRONG("Illegal action in vcl_deliver{}");
    }

    sp->director = NULL;
    sp->restarts = 0;

    RES_WriteObj(sp);
    AZ(sp->wrk->wfd);
    HSH_Deref(sp->wrk, &sp->obj);
    sp->wrk->resp = NULL;
    sp->step = STP_DONE;
    return (0);
}
示例#3
0
static int
cnt_deliver(struct sess *sp)
{
    struct worker *wrk;

    CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
    wrk = sp->wrk;
    CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);

    AZ(sp->wrk->busyobj);
    sp->director = NULL;
    sp->restarts = 0;

    RES_WriteObj(sp);

    assert(WRW_IsReleased(wrk));
    assert(wrk->wrw.ciov == wrk->wrw.siov);
    (void)HSH_Deref(wrk, NULL, &wrk->obj);
    http_Setup(wrk->resp, NULL);
    sp->step = STP_DONE;
    return (0);
}