From a61d48a451c9fdcc361a2687e8b1ea82438ddafc Mon Sep 17 00:00:00 2001 From: "roberto@mrspurr" Date: Fri, 18 Mar 2011 08:14:12 +0100 Subject: [PATCH] fixed stackless support --- async.c | 1 + plugins/python/pyutils.c | 1 - plugins/python/wsgi_handlers.c | 6 +++++- plugins/rack/fiber.c | 3 --- plugins/stackless/stackless.c | 12 +----------- 5 files changed, 7 insertions(+), 16 deletions(-) diff --git a/async.c b/async.c index b4503080..38ad3fa1 100644 --- a/async.c +++ b/async.c @@ -320,6 +320,7 @@ void *async_loop(void *arg1) { uwsgi.wsgi_req = current_request->wsgi_req; uwsgi.schedule_to_req(); + uwsgi.wsgi_req->switches++; next_async_request = current_request->next; // request ended ? diff --git a/plugins/python/pyutils.c b/plugins/python/pyutils.c index c1fb2e17..9a8ff1e7 100644 --- a/plugins/python/pyutils.c +++ b/plugins/python/pyutils.c @@ -5,7 +5,6 @@ extern struct uwsgi_python up; int manage_python_response(struct wsgi_request *wsgi_req) { // use standard WSGI response parse - wsgi_req->switches++; return uwsgi_response_subhandler_wsgi(wsgi_req); } diff --git a/plugins/python/wsgi_handlers.c b/plugins/python/wsgi_handlers.c index bfe29ced..204772a1 100644 --- a/plugins/python/wsgi_handlers.c +++ b/plugins/python/wsgi_handlers.c @@ -472,11 +472,15 @@ int uwsgi_request_wsgi(struct wsgi_request *wsgi_req) { while (wi->response_subhandler(wsgi_req) != UWSGI_OK) { - wsgi_req->switches++; #ifdef UWSGI_ASYNC if (uwsgi.async > 1) { return UWSGI_AGAIN; } + else { +#endif + wsgi_req->switches++; +#ifdef UWSGI_ASYNC + } #endif } diff --git a/plugins/rack/fiber.c b/plugins/rack/fiber.c index 3b754492..5ebac72c 100644 --- a/plugins/rack/fiber.c +++ b/plugins/rack/fiber.c @@ -94,14 +94,12 @@ VALUE protected_fiber_loop() { if (!wsgi_req) goto cycle; uwsgi_log("request passed to fiber core %d\n", wsgi_req->async_id); uwsgi.wsgi_req = wsgi_req; - uwsgi.wsgi_req->switches++; rb_fiber_resume(fiber_list[wsgi_req->async_id], 0, NULL); } else { wsgi_req = find_wsgi_req_by_fd((int)uwsgi.async_events[i].ASYNC_FD, -1); if (wsgi_req) { uwsgi.wsgi_req = wsgi_req; - uwsgi.wsgi_req->switches++; rb_fiber_resume(fiber_list[wsgi_req->async_id], 0, NULL); } else { @@ -116,7 +114,6 @@ cycle: //uwsgi_log("resuming fiber %d %p\n", current, fiber_list[current]); uwsgi.wsgi_req = uwsgi.wsgi_requests[current]; - uwsgi.wsgi_req->switches++; if (uwsgi.wsgi_req->async_status != UWSGI_ACCEPTING) { uwsgi_log("passing control to fiber %d\n", current); rb_fiber_resume(fiber_list[current], 0, NULL); diff --git a/plugins/stackless/stackless.c b/plugins/stackless/stackless.c index 52965f9f..d5c9a140 100644 --- a/plugins/stackless/stackless.c +++ b/plugins/stackless/stackless.c @@ -6,7 +6,6 @@ extern struct uwsgi_server uwsgi; struct ustackless { int enabled; PyObject *callable; - PyTaskletObject *main; PyTaskletObject **sl; } usl; @@ -40,9 +39,7 @@ inline static void stackless_schedule_to_req() { uwsgi.wsgi_req->suspended = 1; } - uwsgi_log("running tasklet\n"); PyTasklet_Run(usl.sl[id]); - uwsgi_log("running tasklet 2\n"); if (uwsgi.wsgi_req->suspended) { uwsgi.wsgi_req->async_status = UWSGI_AGAIN; @@ -52,9 +49,7 @@ inline static void stackless_schedule_to_req() { inline static void stackless_schedule_to_main(struct wsgi_request *wsgi_req) { - uwsgi_log("suspending tasklet\n"); - PyTasklet_Run(usl.main); - uwsgi_log("tasklet suspended\n"); + PyStackless_Schedule(Py_None, 1); uwsgi.wsgi_req = wsgi_req; } @@ -71,13 +66,8 @@ void stackless_init_apps(void) { usl.sl = uwsgi_malloc( sizeof(PyTaskletObject *) * uwsgi.async ); - PyThreadState *ts = PyThreadState_GET(); - usl.main = ts->st.current; - uwsgi_log("%p\n", usl.main); - Py_INCREF(ts); usl.callable = PyCFunction_New(uwsgi_stackless_request_method, NULL); uwsgi_log("enabled stackless engine\n"); - uwsgi.schedule_to_main = stackless_schedule_to_main; uwsgi.schedule_to_req = stackless_schedule_to_req;