struct uwsgi_spooler *uwsgi_new_spooler(char *dir) { struct uwsgi_spooler *uspool = uwsgi.spoolers; if (!uspool) { uwsgi.spoolers = uwsgi_calloc_shared(sizeof(struct uwsgi_spooler)); uspool = uwsgi.spoolers; } else { while(uspool) { if (uspool->next == NULL) { uspool->next = uwsgi_calloc_shared(sizeof(struct uwsgi_spooler)); uspool = uspool->next; break; } uspool = uspool->next; } } if (!realpath(dir, uspool->dir)) { uwsgi_error("[spooler] realpath()"); exit(1); } uspool->next = NULL; return uspool; }
void uwsgi_setup_workers() { int i, j; // allocate shared memory for workers + master uwsgi.workers = (struct uwsgi_worker *) uwsgi_calloc_shared(sizeof(struct uwsgi_worker) * (uwsgi.numproc + 1 + uwsgi.grunt)); for (i = 0; i <= uwsgi.numproc; i++) { // allocate memory for apps uwsgi.workers[i].apps = (struct uwsgi_app *) uwsgi_calloc_shared(sizeof(struct uwsgi_app) * uwsgi.max_apps); // allocate memory for cores uwsgi.workers[i].cores = (struct uwsgi_core *) uwsgi_calloc_shared(sizeof(struct uwsgi_core) * uwsgi.cores); // this is a trick for avoiding too much memory areas void *ts = uwsgi_calloc_shared(sizeof(void *) * uwsgi.max_apps * uwsgi.cores); // add 4 bytes for uwsgi header void *buffers = uwsgi_malloc_shared((uwsgi.buffer_size+4) * uwsgi.cores); void *hvec = uwsgi_malloc_shared(sizeof(struct iovec) * uwsgi.vec_size * uwsgi.cores); void *post_buf = NULL; if (uwsgi.post_buffering > 0) post_buf = uwsgi_malloc_shared(uwsgi.post_buffering_bufsize * uwsgi.cores); for (j = 0; j < uwsgi.cores; j++) { // allocate shared memory for thread states (required for some language, like python) uwsgi.workers[i].cores[j].ts = ts + ((sizeof(void *) * uwsgi.max_apps) * j); // raw per-request buffer (+4 bytes for uwsgi header) uwsgi.workers[i].cores[j].buffer = buffers + ((uwsgi.buffer_size+4) * j); // iovec for uwsgi vars uwsgi.workers[i].cores[j].hvec = hvec + ((sizeof(struct iovec) * uwsgi.vec_size) * j); if (post_buf) uwsgi.workers[i].cores[j].post_buf = post_buf + (uwsgi.post_buffering_bufsize * j); } // master does not need to following steps... if (i == 0) continue; uwsgi.workers[i].signal_pipe[0] = -1; uwsgi.workers[i].signal_pipe[1] = -1; snprintf(uwsgi.workers[i].name, 0xff, "uWSGI worker %d", i); snprintf(uwsgi.workers[i].snapshot_name, 0xff, "uWSGI snapshot %d", i); } uint64_t total_memory = (sizeof(struct uwsgi_app) * uwsgi.max_apps) + (sizeof(struct uwsgi_core) * uwsgi.cores) + (sizeof(void *) * uwsgi.max_apps * uwsgi.cores) + (uwsgi.buffer_size * uwsgi.cores) + (sizeof(struct iovec) * uwsgi.vec_size * uwsgi.cores); if (uwsgi.post_buffering > 0) { total_memory += (uwsgi.post_buffering_bufsize * uwsgi.cores); } total_memory *= (uwsgi.numproc + uwsgi.master_process); if (uwsgi.numproc > 0) uwsgi_log("mapped %llu bytes (%llu KB) for %d cores\n", (unsigned long long) total_memory, (unsigned long long) (total_memory / 1024), uwsgi.cores * uwsgi.numproc); }
void uwsgi_setup_mules_and_farms() { int i; if (uwsgi.mules_cnt > 0) { uwsgi.mules = (struct uwsgi_mule *) uwsgi_calloc_shared(sizeof(struct uwsgi_mule) * uwsgi.mules_cnt); create_signal_pipe(uwsgi.shared->mule_signal_pipe); create_signal_pipe(uwsgi.shared->mule_queue_pipe); for (i = 0; i < uwsgi.mules_cnt; i++) { // create the socket pipe create_signal_pipe(uwsgi.mules[i].signal_pipe); create_signal_pipe(uwsgi.mules[i].queue_pipe); uwsgi.mules[i].id = i + 1; snprintf(uwsgi.mules[i].name, 0xff, "uWSGI mule %d", i + 1); } } if (uwsgi.farms_cnt > 0) { uwsgi.farms = (struct uwsgi_farm *) uwsgi_calloc_shared(sizeof(struct uwsgi_farm) * uwsgi.farms_cnt); struct uwsgi_string_list *farm_name = uwsgi.farms_list; for (i = 0; i < uwsgi.farms_cnt; i++) { char *farm_value = uwsgi_str(farm_name->value); char *mules_list = strchr(farm_value, ':'); if (!mules_list) { uwsgi_log("invalid farm value (%s) must be in the form name:mule[,muleN].\n", farm_value); exit(1); } mules_list[0] = 0; mules_list++; strncpy(uwsgi.farms[i].name, farm_value, 0xff); // create the socket pipe create_signal_pipe(uwsgi.farms[i].signal_pipe); create_signal_pipe(uwsgi.farms[i].queue_pipe); char *p = strtok(mules_list, ","); while (p != NULL) { struct uwsgi_mule *um = get_mule_by_id(atoi(p)); if (!um) { uwsgi_log("invalid mule id: %s\n", p); exit(1); } uwsgi_mule_farm_new(&uwsgi.farms[i].mules, um); p = strtok(NULL, ","); } uwsgi_log("created farm %d name: %s mules:%s\n", i + 1, uwsgi.farms[i].name, strchr(farm_name->value, ':') + 1); farm_name = farm_name->next; } } }