static void greenlet_schedule_to_req() { int id = uwsgi.wsgi_req->async_id; uint8_t modifier1 = uwsgi.wsgi_req->uh->modifier1; // ensure gil UWSGI_GET_GIL if (!uwsgi.wsgi_req->suspended) { ugl.gl[id] = PyGreenlet_New(ugl.callable, NULL); PyObject_SetAttrString((PyObject *)ugl.gl[id], "uwsgi_wsgi_req", PyLong_FromLong((long) uwsgi.wsgi_req)); uwsgi.wsgi_req->suspended = 1; } // call it in the main core if (is_not_python(modifier1) && uwsgi.p[modifier1]->suspend) { uwsgi.p[modifier1]->suspend(NULL); } PyObject *ret = PyGreenlet_Switch(ugl.gl[id], NULL, NULL); if (!ret) { PyErr_Print(); uwsgi_log_verbose("[BUG] unable to switch greenlet !!!\n"); exit(1); } Py_DECREF(ret); if (is_not_python(modifier1) && uwsgi.p[modifier1]->resume) { uwsgi.p[modifier1]->resume(NULL); } }
static inline int process_wsgi_app(client_t *cli) { PyObject *args = NULL, *start = NULL, *res = NULL; PyGreenlet *greenlet; ClientObject *pyclient; start = create_start_response(cli); if(!start){ return -1; } args = Py_BuildValue("(OO)", cli->environ, start); current_client = PyDict_GetItem(cli->environ, client_key); pyclient = (ClientObject *)current_client; #ifdef DEBUG printf("start client %p \n", cli); printf("start environ %p \n", cli->environ); #endif //new greenlet greenlet = PyGreenlet_New(wsgi_app, NULL); // set_greenlet pyclient->greenlet = greenlet; Py_INCREF(pyclient->greenlet); res = PyGreenlet_Switch(greenlet, args, NULL); //res = PyObject_CallObject(wsgi_app, args); Py_DECREF(args); Py_DECREF(greenlet); //check response & PyErr_Occurred if(res && res == Py_None){ PyErr_SetString(PyExc_Exception, "response must be a iter or sequence object"); } if (PyErr_Occurred()){ write_error_log(__FILE__, __LINE__); return -1; } if(PyInt_Check(res)){ if(PyInt_AS_LONG(res) == -1){ // suspend process return 0; } } //next send response cli->response = res; return 1; }
inline static void greenlet_schedule_to_req() { int id = uwsgi.wsgi_req->async_id; if (!uwsgi.wsgi_req->suspended) { ugl.gl[id] = PyGreenlet_New(ugl.callable, NULL); uwsgi.wsgi_req->suspended = 1; } PyGreenlet_Switch(ugl.gl[id], NULL, NULL); if (uwsgi.wsgi_req->suspended) { uwsgi.wsgi_req->async_status = UWSGI_AGAIN; } }