static ngx_int_t
ngx_http_lua_subrequest_resume(ngx_http_request_t *r)
{
lua_State *vm;
ngx_int_t rc;
ngx_connection_t *c;
ngx_http_lua_ctx_t *ctx;
ngx_http_lua_co_ctx_t *coctx;
ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);
if (ctx == NULL) {
return NGX_ERROR;
}
ctx->resume_handler = ngx_http_lua_wev_handler;
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"lua run subrequests done, resuming lua thread");
coctx = ctx->cur_co_ctx;
dd("nsubreqs: %d", (int) coctx->nsubreqs);
ngx_http_lua_handle_subreq_responses(r, ctx);
dd("free sr_statues/headers/bodies memory ASAP");
#if 1
ngx_pfree(r->pool, coctx->sr_statuses);
coctx->sr_statuses = NULL;
coctx->sr_headers = NULL;
coctx->sr_bodies = NULL;
coctx->sr_flags = NULL;
#endif
c = r->connection;
vm = ngx_http_lua_get_lua_vm(r, ctx);
rc = ngx_http_lua_run_thread(vm, r, ctx, coctx->nsubreqs);
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"lua run thread returned %d", rc);
if (rc == NGX_AGAIN) {
return ngx_http_lua_run_posted_threads(c, vm, r, ctx);
}
if (rc == NGX_DONE) {
ngx_http_lua_finalize_request(r, NGX_DONE);
// core在此处
return ngx_http_lua_run_posted_threads(c, vm, r, ctx);
}
/* rc == NGX_ERROR || rc >= NGX_OK */
if (ctx->entered_content_phase) {
ngx_http_lua_finalize_request(r, rc);
return NGX_DONE;
}
return rc;
}