uGreen configurable stack size

This commit is contained in:
roberto@sirius
2010-03-30 20:07:50 +02:00
parent 919501e92c
commit 474860cd39
3 changed files with 18 additions and 6 deletions
+10 -6
View File
@@ -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;
+6
View File
@@ -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);
+2
View File
@@ -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