mirror of
https://github.com/clearlinux/uwsgi.git
synced 2026-10-03 15:38:36 +00:00
uGreen configurable stack size
This commit is contained in:
@@ -6,14 +6,13 @@
|
||||
|
||||
TODO
|
||||
|
||||
configurable stack size
|
||||
io and sleep management
|
||||
|
||||
*/
|
||||
|
||||
#include "uwsgi.h"
|
||||
|
||||
#define GREEN_STACK_SIZE 128 * 1024
|
||||
#define UGREEN_DEFAULT_STACKSIZE 128*1024
|
||||
|
||||
extern struct uwsgi_server uwsgi;
|
||||
|
||||
@@ -137,11 +136,16 @@ void u_green_init(struct uwsgi_server *uwsgi) {
|
||||
struct wsgi_request *wsgi_req = uwsgi->wsgi_requests ;
|
||||
|
||||
int i;
|
||||
size_t u_stack_size = UGREEN_DEFAULT_STACKSIZE ;
|
||||
|
||||
|
||||
PyMethodDef *uwsgi_function;
|
||||
|
||||
fprintf(stderr,"initializing %d uGreen threads with stack size of %lu (%lu KB)\n", uwsgi->async, (unsigned long) GREEN_STACK_SIZE, (unsigned long) GREEN_STACK_SIZE/1024);
|
||||
if (uwsgi->ugreen_stackpages > 0) {
|
||||
u_stack_size = uwsgi->ugreen_stackpages * uwsgi->page_size ;
|
||||
}
|
||||
|
||||
fprintf(stderr,"initializing %d uGreen threads with stack size of %lu (%lu KB)\n", uwsgi->async, (unsigned long) u_stack_size, (unsigned long) u_stack_size/1024);
|
||||
|
||||
|
||||
uwsgi->ugreen_contexts = malloc( sizeof(ucontext_t*) * uwsgi->async);
|
||||
@@ -158,7 +162,7 @@ void u_green_init(struct uwsgi_server *uwsgi) {
|
||||
exit(1);
|
||||
}
|
||||
getcontext(uwsgi->ugreen_contexts[i]);
|
||||
uwsgi->ugreen_contexts[i]->uc_stack.ss_sp = mmap(NULL, GREEN_STACK_SIZE + uwsgi->page_size*2 , PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0) + uwsgi->page_size;
|
||||
uwsgi->ugreen_contexts[i]->uc_stack.ss_sp = mmap(NULL, u_stack_size + (uwsgi->page_size*2) , PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0) + uwsgi->page_size;
|
||||
if (!uwsgi->ugreen_contexts[i]->uc_stack.ss_sp) {
|
||||
perror("mmap()");
|
||||
exit(1);
|
||||
@@ -168,11 +172,11 @@ void u_green_init(struct uwsgi_server *uwsgi) {
|
||||
perror("mprotect()");
|
||||
exit(1);
|
||||
}
|
||||
if (mprotect(uwsgi->ugreen_contexts[i]->uc_stack.ss_sp + GREEN_STACK_SIZE, uwsgi->page_size, PROT_NONE)) {
|
||||
if (mprotect(uwsgi->ugreen_contexts[i]->uc_stack.ss_sp + u_stack_size, uwsgi->page_size, PROT_NONE)) {
|
||||
perror("mprotect()");
|
||||
exit(1);
|
||||
}
|
||||
uwsgi->ugreen_contexts[i]->uc_stack.ss_size = GREEN_STACK_SIZE ;
|
||||
uwsgi->ugreen_contexts[i]->uc_stack.ss_size = u_stack_size ;
|
||||
uwsgi->ugreen_contexts[i]->uc_link = NULL;
|
||||
makecontext(uwsgi->ugreen_contexts[i], (void (*) (void)) &u_green_request, 3, uwsgi, wsgi_req, i);
|
||||
wsgi_req->async_status = UWSGI_ACCEPTING;
|
||||
|
||||
@@ -357,6 +357,7 @@ int main(int argc, char *argv[], char *envp[]) {
|
||||
#endif
|
||||
#ifdef UWSGI_UGREEN
|
||||
{"ugreen", no_argument, &uwsgi.ugreen, 1},
|
||||
{"ugreen-stacksize", required_argument, 0, LONG_ARGS_UGREEN_PAGES},
|
||||
#endif
|
||||
{"version", no_argument, 0, LONG_ARGS_VERSION},
|
||||
{0, 0, 0, 0}
|
||||
@@ -2277,6 +2278,11 @@ void manage_opt(int i, char *optarg) {
|
||||
case LONG_ARGS_ASYNC:
|
||||
uwsgi.async = atoi(optarg);
|
||||
break;
|
||||
#ifdef UWSGI_UGREEN
|
||||
case LONG_ARGS_UGREEN_PAGES:
|
||||
uwsgi.ugreen_stackpages = atoi(optarg);
|
||||
break;
|
||||
#endif
|
||||
#ifndef UNBIT
|
||||
case LONG_ARGS_VERSION:
|
||||
fprintf(stdout, "uWSGI %s\n", UWSGI_VERSION);
|
||||
|
||||
@@ -125,6 +125,7 @@ PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromString(char *, Py_ssize_t);
|
||||
#define LONG_ARGS_SNMP 17019
|
||||
#define LONG_ARGS_SNMP_COMMUNITY 17020
|
||||
#define LONG_ARGS_ASYNC 17021
|
||||
#define LONG_ARGS_UGREEN_PAGES 17022
|
||||
|
||||
#define UWSGI_OK 0
|
||||
#define UWSGI_AGAIN 1
|
||||
@@ -409,6 +410,7 @@ struct uwsgi_server {
|
||||
|
||||
#ifdef UWSGI_UGREEN
|
||||
int ugreen;
|
||||
int ugreen_stackpages;
|
||||
ucontext_t ugreenmain;
|
||||
ucontext_t **ugreen_contexts;
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user