mirror of
https://github.com/clearlinux/uwsgi.git
synced 2026-10-07 17:38:52 +00:00
Compare commits
9
Commits
0.9.9-beta1
...
0.9.9-rc1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
43a21d32cb | ||
|
|
9f9eb5ef17 | ||
|
|
0116c62980 | ||
|
|
fae446e495 | ||
|
|
6f7054df18 | ||
|
|
0f31c21f4a | ||
|
|
bd3e234703 | ||
|
|
71bfd63623 | ||
|
|
98b89dc83c |
@@ -28,3 +28,4 @@ e91bc724325e14c13b8f548c0b6a315c48a1c32a 0.9.8-rc2
|
||||
fd8477b6348faf16588106055ca59df1c488f76a 0.9.8.1
|
||||
7169ef1d68d3dab4737bcc3f9e082839e5a06cc1 0.9.8.2
|
||||
f4d3c4dcd7a63e21fcc9d8d567374c69935178bd 0.9.8.3
|
||||
6945ee03c7ea95eb19217ef1e1fb17d9ae26adbc 0.9.9-beta1
|
||||
|
||||
+12
-23
@@ -161,6 +161,7 @@ static void *uwsgi_server_config(apr_pool_t *p, server_rec *s) {
|
||||
c->modifier2 = 0 ;
|
||||
c->cgi_mode = 0 ;
|
||||
c->max_vars = 128;
|
||||
c->script_name[0] = 0;
|
||||
|
||||
return c;
|
||||
}
|
||||
@@ -176,6 +177,12 @@ static void *uwsgi_dir_config(apr_pool_t *p, char *dir) {
|
||||
c->modifier2 = 0 ;
|
||||
c->cgi_mode = 0 ;
|
||||
c->max_vars = 128;
|
||||
c->script_name[0] = 0;
|
||||
if (dir) {
|
||||
if (strcmp(dir, "/")) {
|
||||
strncpy(c->script_name, dir, 255);
|
||||
}
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
@@ -347,31 +354,13 @@ static int uwsgi_handler(request_rec *r) {
|
||||
vecptr = uwsgi_add_var(uwsgi_vars, vecptr, r, "UWSGI_SCHEME", c->scheme, &pkt_size) ;
|
||||
}
|
||||
|
||||
if (c->script_name[0] == '/') {
|
||||
if (c->script_name[1] == 0) {
|
||||
vecptr = uwsgi_add_var(uwsgi_vars, vecptr, r, "SCRIPT_NAME", "", &pkt_size) ;
|
||||
vecptr = uwsgi_add_var(uwsgi_vars, vecptr, r, "PATH_INFO", r->uri, &pkt_size) ;
|
||||
}
|
||||
else {
|
||||
vecptr = uwsgi_add_var(uwsgi_vars, vecptr, r, "SCRIPT_NAME", c->script_name, &pkt_size) ;
|
||||
vecptr = uwsgi_add_var(uwsgi_vars, vecptr, r, "PATH_INFO", r->uri+strlen(c->script_name), &pkt_size) ;
|
||||
}
|
||||
if (c->script_name[0] != 0) {
|
||||
vecptr = uwsgi_add_var(uwsgi_vars, vecptr, r, "SCRIPT_NAME", c->script_name, &pkt_size) ;
|
||||
vecptr = uwsgi_add_var(uwsgi_vars, vecptr, r, "PATH_INFO", r->uri+strlen(c->script_name), &pkt_size) ;
|
||||
}
|
||||
else {
|
||||
if (r->path_info) {
|
||||
if (strlen(r->path_info) <= 0) {
|
||||
vecptr = uwsgi_add_var(uwsgi_vars, vecptr, r, "SCRIPT_NAME", "", &pkt_size) ;
|
||||
vecptr = uwsgi_add_var(uwsgi_vars, vecptr, r, "PATH_INFO", r->uri, &pkt_size) ;
|
||||
}
|
||||
else {
|
||||
vecptr = uwsgi_add_var(uwsgi_vars, vecptr, r, "SCRIPT_NAME", apr_pstrndup(r->pool, r->uri, (strlen(r->uri) - strlen(r->path_info) )) , &pkt_size) ;
|
||||
vecptr = uwsgi_add_var(uwsgi_vars, vecptr, r, "PATH_INFO", r->path_info, &pkt_size) ;
|
||||
}
|
||||
}
|
||||
else {
|
||||
vecptr = uwsgi_add_var(uwsgi_vars, vecptr, r, "SCRIPT_NAME", "", &pkt_size) ;
|
||||
vecptr = uwsgi_add_var(uwsgi_vars, vecptr, r, "PATH_INFO", r->uri, &pkt_size) ;
|
||||
}
|
||||
vecptr = uwsgi_add_var(uwsgi_vars, vecptr, r, "SCRIPT_NAME", "", &pkt_size) ;
|
||||
vecptr = uwsgi_add_var(uwsgi_vars, vecptr, r, "PATH_INFO", r->uri, &pkt_size) ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ void uwsgi_init_cache() {
|
||||
if (!uwsgi.cache_blocksize)
|
||||
uwsgi.cache_blocksize = UMAX16;
|
||||
|
||||
if (uwsgi.cache_blocksize % uwsgi.page_size != 0) {
|
||||
if ((uwsgi.cache_blocksize * uwsgi.cache_max_items) % uwsgi.page_size != 0) {
|
||||
uwsgi_log("invalid cache blocksize %llu: must be a multiple of memory page size (%d bytes)\n", (unsigned long long) uwsgi.cache_blocksize, uwsgi.page_size);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -476,7 +476,7 @@ void master_loop(char **argv, char **environ) {
|
||||
}
|
||||
|
||||
if (uwsgi.queue_store && uwsgi.queue_filesize) {
|
||||
if (msync(uwsgi.queue, uwsgi.queue_filesize, MS_ASYNC)) {
|
||||
if (msync(uwsgi.queue_header, uwsgi.queue_filesize, MS_ASYNC)) {
|
||||
uwsgi_error("msync()");
|
||||
}
|
||||
}
|
||||
@@ -1194,7 +1194,7 @@ void master_loop(char **argv, char **environ) {
|
||||
}
|
||||
|
||||
if (uwsgi.queue_store && uwsgi.queue_filesize && uwsgi.queue_store_sync && ((uwsgi.master_cycles % uwsgi.queue_store_sync) == 0)) {
|
||||
if (msync(uwsgi.queue, uwsgi.queue_filesize, MS_ASYNC)) {
|
||||
if (msync(uwsgi.queue_header, uwsgi.queue_filesize, MS_ASYNC)) {
|
||||
uwsgi_error("msync()");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -308,7 +308,7 @@ int init_uwsgi_app(int loader, void *arg1, struct wsgi_request *wsgi_req, PyThre
|
||||
uwsgi_log( "Pump application %d (mountpoint=%.*s) ready on interpreter %p pid: %d", id, wi->mountpoint_len, wi->mountpoint, wi->interpreter, (int) getpid());
|
||||
}
|
||||
|
||||
if (!wsgi_req->appid_len) {
|
||||
if ((wsgi_req->appid_len == 0 || (wsgi_req->appid_len = 1 && wsgi_req->appid[0] == '/')) && uwsgi.default_app == -1) {
|
||||
uwsgi_rawlog(" (default app)");
|
||||
uwsgi.default_app = id;
|
||||
}
|
||||
|
||||
@@ -456,6 +456,8 @@ void init_uwsgi_embedded_module() {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
Py_INCREF((PyObject *) &uwsgi_InputType);
|
||||
|
||||
up.embedded_dict = PyModule_GetDict(new_uwsgi_module);
|
||||
if (!up.embedded_dict) {
|
||||
uwsgi_log("could not get uwsgi module __dict__\n");
|
||||
|
||||
@@ -717,6 +717,7 @@ int uwsgi_init_symbol_import() {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
Py_INCREF((PyObject *)&SymImporter_Type);
|
||||
if (PyModule_AddObject(uwsgi_em, "SymbolsImporter",
|
||||
(PyObject *)&SymImporter_Type) < 0) {
|
||||
PyErr_Print();
|
||||
@@ -724,6 +725,7 @@ int uwsgi_init_symbol_import() {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
Py_INCREF((PyObject *)&ZipImporter_Type);
|
||||
if (PyModule_AddObject(uwsgi_em, "ZipImporter",
|
||||
(PyObject *)&ZipImporter_Type) < 0) {
|
||||
PyErr_Print();
|
||||
@@ -731,6 +733,7 @@ int uwsgi_init_symbol_import() {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
Py_INCREF((PyObject *)&SymZipImporter_Type);
|
||||
if (PyModule_AddObject(uwsgi_em, "SymbolsZipImporter",
|
||||
(PyObject *)&SymZipImporter_Type) < 0) {
|
||||
PyErr_Print();
|
||||
|
||||
@@ -2808,25 +2808,58 @@ PyObject *py_uwsgi_queue_push(PyObject * self, PyObject * args) {
|
||||
|
||||
}
|
||||
|
||||
PyObject *py_uwsgi_queue_set(PyObject * self, PyObject * args) {
|
||||
|
||||
Py_ssize_t msglen = 0;
|
||||
uint64_t pos = 0;
|
||||
char *message ;
|
||||
PyObject *res;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "ls#:queue_set", &pos, &message, &msglen)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (uwsgi.queue_size) {
|
||||
uwsgi_wlock(uwsgi.queue_lock);
|
||||
if (uwsgi_queue_set(pos, message, msglen)) {
|
||||
Py_INCREF(Py_True);
|
||||
res = Py_True;
|
||||
}
|
||||
else {
|
||||
Py_INCREF(Py_None);
|
||||
res = Py_None;
|
||||
}
|
||||
uwsgi_rwunlock(uwsgi.queue_lock);
|
||||
return res;
|
||||
}
|
||||
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
|
||||
}
|
||||
|
||||
|
||||
PyObject *py_uwsgi_queue_slot(PyObject * self, PyObject * args) {
|
||||
|
||||
return PyInt_FromLong(uwsgi.shared->queue_pos);
|
||||
return PyInt_FromLong(uwsgi.queue_header->pos);
|
||||
}
|
||||
|
||||
PyObject *py_uwsgi_queue_pull_slot(PyObject * self, PyObject * args) {
|
||||
|
||||
return PyInt_FromLong(uwsgi.queue_header->pull_pos);
|
||||
}
|
||||
|
||||
|
||||
PyObject *py_uwsgi_queue_pull(PyObject * self, PyObject * args) {
|
||||
|
||||
char *message;
|
||||
uint64_t size;
|
||||
PyObject *res;
|
||||
|
||||
if (!PyArg_ParseTuple(args, ":queue_pull")) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (uwsgi.queue_size) {
|
||||
uwsgi_wlock(uwsgi.queue_lock);
|
||||
message = uwsgi_queue_pull(&size);
|
||||
if (message) {
|
||||
if (message && size > 0) {
|
||||
res = PyString_FromStringAndSize(message, size);
|
||||
}
|
||||
else {
|
||||
@@ -2842,6 +2875,32 @@ PyObject *py_uwsgi_queue_pull(PyObject * self, PyObject * args) {
|
||||
|
||||
}
|
||||
|
||||
PyObject *py_uwsgi_queue_pop(PyObject * self, PyObject * args) {
|
||||
|
||||
char *message;
|
||||
uint64_t size;
|
||||
PyObject *res;
|
||||
|
||||
if (uwsgi.queue_size) {
|
||||
uwsgi_wlock(uwsgi.queue_lock);
|
||||
message = uwsgi_queue_pop(&size);
|
||||
if (message && size > 0) {
|
||||
res = PyString_FromStringAndSize(message, size);
|
||||
}
|
||||
else {
|
||||
Py_INCREF(Py_None);
|
||||
res = Py_None;
|
||||
}
|
||||
uwsgi_rwunlock(uwsgi.queue_lock);
|
||||
return res;
|
||||
}
|
||||
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
|
||||
}
|
||||
|
||||
|
||||
PyObject *py_uwsgi_queue_get(PyObject * self, PyObject * args) {
|
||||
|
||||
long index = 0;
|
||||
@@ -2856,7 +2915,7 @@ PyObject *py_uwsgi_queue_get(PyObject * self, PyObject * args) {
|
||||
if (uwsgi.queue_size) {
|
||||
uwsgi_rlock(uwsgi.queue_lock);
|
||||
message = uwsgi_queue_get(index, &size);
|
||||
if (message) {
|
||||
if (message && size > 0) {
|
||||
res = PyString_FromStringAndSize(message, size);
|
||||
}
|
||||
else {
|
||||
@@ -2886,8 +2945,8 @@ PyObject *py_uwsgi_queue_last(PyObject * self, PyObject * args) {
|
||||
if (uwsgi.queue_size) {
|
||||
res = PyList_New(0);
|
||||
uwsgi_rlock(uwsgi.queue_lock);
|
||||
if (uwsgi.shared->queue_pos > 0) {
|
||||
base = uwsgi.shared->queue_pos-1;
|
||||
if (uwsgi.queue_header->pos > 0) {
|
||||
base = uwsgi.queue_header->pos-1;
|
||||
}
|
||||
else {
|
||||
base = uwsgi.queue_size-1;
|
||||
@@ -2988,10 +3047,13 @@ static PyMethodDef uwsgi_cache_methods[] = {
|
||||
|
||||
static PyMethodDef uwsgi_queue_methods[] = {
|
||||
{"queue_get", py_uwsgi_queue_get, METH_VARARGS, ""},
|
||||
{"queue_set", py_uwsgi_queue_set, METH_VARARGS, ""},
|
||||
{"queue_last", py_uwsgi_queue_last, METH_VARARGS, ""},
|
||||
{"queue_push", py_uwsgi_queue_push, METH_VARARGS, ""},
|
||||
{"queue_pull", py_uwsgi_queue_pull, METH_VARARGS, ""},
|
||||
{"queue_pop", py_uwsgi_queue_pop, METH_VARARGS, ""},
|
||||
{"queue_slot", py_uwsgi_queue_slot, METH_VARARGS, ""},
|
||||
{"queue_pull_slot", py_uwsgi_queue_pull_slot, METH_VARARGS, ""},
|
||||
{NULL, NULL},
|
||||
};
|
||||
|
||||
@@ -3072,6 +3134,8 @@ void init_uwsgi_module_queue(PyObject * current_uwsgi_module) {
|
||||
PyDict_SetItemString(uwsgi_module_dict, uwsgi_function->ml_name, func);
|
||||
Py_DECREF(func);
|
||||
}
|
||||
|
||||
PyDict_SetItemString(uwsgi_module_dict, "queue_size", PyInt_FromLong(uwsgi.queue_size));
|
||||
}
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -717,7 +717,7 @@ next:
|
||||
}
|
||||
// on tiny post use memory
|
||||
else {
|
||||
if (!uwsgi_read_whole_body_in_mem(wsgi_req, uwsgi.mem_post_buf[wsgi_req->async_id], uwsgi.post_buffering)) {
|
||||
if (!uwsgi_read_whole_body_in_mem(wsgi_req, wsgi_req->post_buffering_buf)) {
|
||||
wsgi_req->status = -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -6,17 +6,15 @@ void uwsgi_init_queue() {
|
||||
if (!uwsgi.queue_blocksize)
|
||||
uwsgi.queue_blocksize = 8192;
|
||||
|
||||
if (uwsgi.queue_blocksize % uwsgi.page_size != 0) {
|
||||
uwsgi_log("invalid queue blocksize %llu: must be a multiple of memory page size (%d bytes)\n", (unsigned long long) uwsgi.queue_blocksize, uwsgi.page_size);
|
||||
if ((uwsgi.queue_blocksize * uwsgi.queue_size) % uwsgi.page_size != 0) {
|
||||
uwsgi_log("invalid queue size/blocksize %llu: must be a multiple of memory page size (%d bytes)\n", (unsigned long long) uwsgi.queue_blocksize, uwsgi.page_size);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
uwsgi.shared->queue_pos = 0;
|
||||
uwsgi.shared->queue_pull_pos = 0;
|
||||
|
||||
if (uwsgi.queue_store) {
|
||||
uwsgi.queue_filesize = uwsgi.queue_blocksize * uwsgi.queue_size;
|
||||
uwsgi.queue_filesize = uwsgi.queue_blocksize * uwsgi.queue_size + 16;
|
||||
int queue_fd;
|
||||
struct stat qst;
|
||||
|
||||
@@ -45,16 +43,26 @@ void uwsgi_init_queue() {
|
||||
exit(1);
|
||||
}
|
||||
uwsgi.queue = mmap(NULL, uwsgi.queue_filesize, PROT_READ | PROT_WRITE, MAP_SHARED, queue_fd, 0);
|
||||
uwsgi_queue_fix();
|
||||
|
||||
// fix header
|
||||
uwsgi.queue_header = uwsgi.queue;
|
||||
uwsgi.queue+=16;
|
||||
}
|
||||
else {
|
||||
uwsgi.queue = mmap(NULL, uwsgi.queue_blocksize * uwsgi.queue_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
|
||||
uwsgi.queue = mmap(NULL, (uwsgi.queue_blocksize * uwsgi.queue_size)+16, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
|
||||
// fix header
|
||||
uwsgi.queue_header = uwsgi.queue;
|
||||
uwsgi.queue+=16;
|
||||
uwsgi.queue_header->pos = 0;
|
||||
uwsgi.queue_header->pull_pos = 0;
|
||||
}
|
||||
if (!uwsgi.queue) {
|
||||
uwsgi_error("mmap()");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
uwsgi.queue_lock = uwsgi_mmap_shared_rwlock();
|
||||
uwsgi_rwlock_init(uwsgi.queue_lock);
|
||||
|
||||
@@ -78,33 +86,20 @@ char *uwsgi_queue_get(uint64_t index, uint64_t *size) {
|
||||
|
||||
}
|
||||
|
||||
void uwsgi_queue_fix() {
|
||||
|
||||
uint64_t i;
|
||||
char *value;
|
||||
uint64_t size;
|
||||
|
||||
for(i=0;i< uwsgi.queue_size;i++) {
|
||||
// valid record ?
|
||||
value = uwsgi_queue_get(i, &size);
|
||||
if (value && size) {
|
||||
uwsgi.shared->queue_pos++;
|
||||
}
|
||||
else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
char *uwsgi_queue_pop(uint64_t *size) {
|
||||
|
||||
struct uwsgi_queue_item *uqi;
|
||||
char *ptr = (char *) uwsgi.queue;
|
||||
|
||||
if (uwsgi.shared->queue_pos > 0) uwsgi.shared->queue_pos--;
|
||||
if (uwsgi.queue_header->pos == 0) {
|
||||
uwsgi.queue_header->pos = uwsgi.queue_size-1;
|
||||
}
|
||||
else {
|
||||
uwsgi.queue_header->pos--;
|
||||
}
|
||||
|
||||
ptr = ptr + (uwsgi.queue_blocksize*uwsgi.shared->queue_pos);
|
||||
ptr = ptr + (uwsgi.queue_blocksize*uwsgi.queue_header->pos);
|
||||
uqi = (struct uwsgi_queue_item *) ptr;
|
||||
|
||||
if (!uqi->size) return NULL;
|
||||
@@ -122,16 +117,16 @@ char *uwsgi_queue_pull(uint64_t *size) {
|
||||
struct uwsgi_queue_item *uqi;
|
||||
char *ptr = (char *) uwsgi.queue;
|
||||
|
||||
ptr = ptr + (uwsgi.queue_blocksize*uwsgi.shared->queue_pull_pos);
|
||||
ptr = ptr + (uwsgi.queue_blocksize*uwsgi.queue_header->pull_pos);
|
||||
uqi = (struct uwsgi_queue_item *) ptr;
|
||||
|
||||
if (!uqi->size) return NULL;
|
||||
|
||||
*size = uqi->size;
|
||||
|
||||
uwsgi.shared->queue_pull_pos++;
|
||||
uwsgi.queue_header->pull_pos++;
|
||||
|
||||
if (uwsgi.shared->queue_pull_pos >= uwsgi.queue_size) uwsgi.shared->queue_pull_pos = 0;
|
||||
if (uwsgi.queue_header->pull_pos >= uwsgi.queue_size) uwsgi.queue_header->pull_pos = 0;
|
||||
|
||||
// remove item
|
||||
uqi->size = 0;
|
||||
@@ -150,7 +145,7 @@ int uwsgi_queue_push(char *message, uint64_t size) {
|
||||
|
||||
if (!size) return 0;
|
||||
|
||||
ptr = ptr + (uwsgi.queue_blocksize*uwsgi.shared->queue_pos);
|
||||
ptr = ptr + (uwsgi.queue_blocksize*uwsgi.queue_header->pos);
|
||||
uqi = (struct uwsgi_queue_item *) ptr;
|
||||
|
||||
ptr += sizeof(struct uwsgi_queue_item);
|
||||
@@ -159,9 +154,34 @@ int uwsgi_queue_push(char *message, uint64_t size) {
|
||||
uqi->ts = time(NULL);
|
||||
memcpy(ptr, message, size);
|
||||
|
||||
uwsgi.shared->queue_pos++;
|
||||
uwsgi.queue_header->pos++;
|
||||
|
||||
if (uwsgi.shared->queue_pos >= uwsgi.queue_size) uwsgi.shared->queue_pos = 0;
|
||||
if (uwsgi.queue_header->pos >= uwsgi.queue_size) uwsgi.queue_header->pos = 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int uwsgi_queue_set(uint64_t pos, char *message, uint64_t size) {
|
||||
|
||||
struct uwsgi_queue_item *uqi;
|
||||
char *ptr = (char *) uwsgi.queue;
|
||||
|
||||
if (size > uwsgi.queue_blocksize + sizeof(struct uwsgi_queue_item))
|
||||
return 0;
|
||||
|
||||
if (!size) return 0;
|
||||
|
||||
if (pos >= uwsgi.queue_size) return 0;
|
||||
|
||||
ptr = ptr + (uwsgi.queue_blocksize*pos);
|
||||
uqi = (struct uwsgi_queue_item *) ptr;
|
||||
|
||||
ptr += sizeof(struct uwsgi_queue_item);
|
||||
|
||||
uqi->size = size;
|
||||
uqi->ts = time(NULL);
|
||||
memcpy(ptr, message, size);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
# uwsgi --queue 10 --queue-store test.queue --master --module tests.queue --socket :3031
|
||||
|
||||
import uwsgi
|
||||
import os
|
||||
from flask import Flask,render_template,request,redirect,flash
|
||||
|
||||
app = Flask(__name__)
|
||||
app.debug = True
|
||||
app.secret_key = os.urandom(24)
|
||||
|
||||
@app.route('/')
|
||||
def index():
|
||||
|
||||
return render_template('queue.html', uwsgi=uwsgi)
|
||||
|
||||
@app.route('/push', methods=['POST'])
|
||||
def push_item():
|
||||
if uwsgi.queue_push(request.form['body']):
|
||||
flash('item enqueued')
|
||||
return redirect('/')
|
||||
else:
|
||||
flash('unable to enqueue item')
|
||||
return render_template('queue.html', uwsgi=uwsgi)
|
||||
|
||||
@app.route('/get', methods=['POST'])
|
||||
def get_item():
|
||||
flash( "slot %s value = %s" % (request.form['slot'], uwsgi.queue_get( int(request.form['slot']) )))
|
||||
return redirect('/')
|
||||
|
||||
@app.route('/pop', methods=['POST'])
|
||||
def pop_item():
|
||||
flash( "popped value = %s" % uwsgi.queue_pop() )
|
||||
return redirect('/')
|
||||
|
||||
@app.route('/pull', methods=['POST'])
|
||||
def pull_item():
|
||||
flash( "pulled value = %s" % uwsgi.queue_pull() )
|
||||
return redirect('/')
|
||||
|
||||
|
||||
@app.route('/set', methods=['POST'])
|
||||
def set_item():
|
||||
if uwsgi.queue_set(int(request.form['pos']), request.form['body']):
|
||||
flash('item set')
|
||||
return redirect('/')
|
||||
else:
|
||||
flash('unable to set item')
|
||||
return render_template('queue.html', uwsgi=uwsgi)
|
||||
@@ -0,0 +1,50 @@
|
||||
<head>
|
||||
<style>
|
||||
.flash {
|
||||
color: red;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
{% with messages = get_flashed_messages() %}
|
||||
{% if messages %}
|
||||
<div class="flash">
|
||||
<ul>
|
||||
{% for message in messages %}
|
||||
<li>{{ message }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
<h1>next available slot: {{uwsgi.queue_slot()}}</h1>
|
||||
<h1>next available pull slot: {{uwsgi.queue_pull_slot()}}</h1>
|
||||
{% for item in range(0, uwsgi.queue_size) %}
|
||||
|
||||
slot {{item}} = {{uwsgi.queue_get(item)}}<br/>
|
||||
|
||||
{% endfor %}
|
||||
|
||||
<br/>
|
||||
|
||||
<form method="POST" action="/push">
|
||||
<input type="text" name="body"><input type="submit" value="push value" /><br/>
|
||||
</form>
|
||||
|
||||
<form method="POST" action="/get">
|
||||
<input type="text" name="slot" size="9"><input type="submit" value="get value" /><br/>
|
||||
</form>
|
||||
|
||||
<form method="POST" action="/pop">
|
||||
<input type="submit" value="pop value" /><br/>
|
||||
</form>
|
||||
|
||||
<form method="POST" action="/pull">
|
||||
<input type="submit" value="pull value" /><br/>
|
||||
</form>
|
||||
|
||||
<form method="POST" action="/set">
|
||||
<input type="text" name="pos" size="5" /> <input type="text" name="body"><input type="submit" value="set value" /><br/>
|
||||
</form>
|
||||
|
||||
</body>
|
||||
@@ -1391,14 +1391,14 @@ int count_options(struct option *lopt) {
|
||||
return count;
|
||||
}
|
||||
|
||||
int uwsgi_read_whole_body_in_mem(struct wsgi_request *wsgi_req, char *buf, size_t limit) {
|
||||
int uwsgi_read_whole_body_in_mem(struct wsgi_request *wsgi_req, char *buf) {
|
||||
|
||||
size_t post_remains = wsgi_req->post_cl;
|
||||
int ret;
|
||||
ssize_t len;
|
||||
char *ptr = buf;
|
||||
|
||||
while (post_remains) {
|
||||
while (post_remains > 0) {
|
||||
if (uwsgi.shared->options[UWSGI_OPTION_HARAKIRI] > 0) {
|
||||
inc_harakiri(uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT]);
|
||||
}
|
||||
@@ -1413,12 +1413,8 @@ int uwsgi_read_whole_body_in_mem(struct wsgi_request *wsgi_req, char *buf, size_
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (limit) {
|
||||
len = read(wsgi_req->poll.fd, ptr, UMIN(post_remains, limit) );
|
||||
}
|
||||
else {
|
||||
len = read(wsgi_req->poll.fd, ptr, post_remains);
|
||||
}
|
||||
len = read(wsgi_req->poll.fd, ptr, post_remains);
|
||||
|
||||
if (len <= 0) {
|
||||
uwsgi_error("read()");
|
||||
return 0;
|
||||
@@ -1427,6 +1423,8 @@ int uwsgi_read_whole_body_in_mem(struct wsgi_request *wsgi_req, char *buf, size_
|
||||
post_remains -= len;
|
||||
}
|
||||
|
||||
uwsgi_log("%.*s\n", wsgi_req->post_cl, buf);
|
||||
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
@@ -1578,15 +1578,14 @@ int uwsgi_start(void *v_argv) {
|
||||
|
||||
if (uwsgi.post_buffering > 0) {
|
||||
uwsgi.async_post_buf = uwsgi_malloc(sizeof(char *) * uwsgi.cores);
|
||||
uwsgi.mem_post_buf = uwsgi_malloc(sizeof(char *) * uwsgi.cores);
|
||||
if (!uwsgi.post_buffering_bufsize) {
|
||||
uwsgi.post_buffering_bufsize = 8192;
|
||||
if (uwsgi.post_buffering_bufsize < uwsgi.post_buffering) {
|
||||
uwsgi.post_buffering_bufsize = uwsgi.post_buffering;
|
||||
uwsgi_log("setting request body buffering size to %d bytes\n", uwsgi.post_buffering_bufsize);
|
||||
}
|
||||
}
|
||||
for (i = 0; i < uwsgi.cores; i++) {
|
||||
uwsgi.async_buf[i] = uwsgi_malloc(uwsgi.buffer_size);
|
||||
if (uwsgi.post_buffering > 0) {
|
||||
uwsgi.mem_post_buf[i] = uwsgi_malloc(uwsgi.post_buffering);
|
||||
uwsgi.async_post_buf[i] = uwsgi_malloc(uwsgi.post_buffering_bufsize);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -323,6 +323,11 @@ struct uwsgi_daemon {
|
||||
//int pipe[2];
|
||||
};
|
||||
|
||||
struct uwsgi_queue_header {
|
||||
uint64_t pos;
|
||||
uint64_t pull_pos;
|
||||
};
|
||||
|
||||
struct uwsgi_queue_item {
|
||||
uint64_t size;
|
||||
time_t ts;
|
||||
@@ -1015,7 +1020,6 @@ struct uwsgi_server {
|
||||
struct iovec **async_hvec;
|
||||
char **async_buf;
|
||||
char **async_post_buf;
|
||||
char **mem_post_buf;
|
||||
|
||||
struct wsgi_request **async_waiting_fd_table;
|
||||
struct wsgi_request **async_proto_fd_table;
|
||||
@@ -1300,6 +1304,7 @@ struct uwsgi_server {
|
||||
uint64_t queue_size;
|
||||
uint64_t queue_blocksize;
|
||||
void *queue;
|
||||
struct uwsgi_queue_header *queue_header;
|
||||
char *queue_store;
|
||||
size_t queue_filesize;
|
||||
int queue_store_sync;
|
||||
@@ -1440,8 +1445,6 @@ struct uwsgi_shared {
|
||||
uint64_t cache_first_available_item;
|
||||
uint64_t cache_unused_stack_ptr;
|
||||
|
||||
uint64_t queue_pos;
|
||||
uint64_t queue_pull_pos;
|
||||
|
||||
int worker_signal_pipe[2];
|
||||
#ifdef UWSGI_SPOOLER
|
||||
@@ -1720,7 +1723,7 @@ struct wsgi_request *threaded_current_wsgi_req(void);
|
||||
void build_options(void);
|
||||
|
||||
int uwsgi_read_whole_body(struct wsgi_request *, char *, size_t);
|
||||
int uwsgi_read_whole_body_in_mem(struct wsgi_request *, char *, size_t);
|
||||
int uwsgi_read_whole_body_in_mem(struct wsgi_request *, char *);
|
||||
|
||||
ssize_t uwsgi_sendfile(struct wsgi_request *);
|
||||
|
||||
@@ -1867,6 +1870,8 @@ void uwsgi_init_cache(void);
|
||||
char *uwsgi_queue_get(uint64_t, uint64_t *);
|
||||
char *uwsgi_queue_pull(uint64_t *);
|
||||
int uwsgi_queue_push(char *, uint64_t);
|
||||
char *uwsgi_queue_pop(uint64_t *);
|
||||
int uwsgi_queue_set(uint64_t, char *, uint64_t);
|
||||
|
||||
// maintain alignment here !!!
|
||||
struct uwsgi_dict_item {
|
||||
@@ -1993,8 +1998,6 @@ inline int event_queue_write(void);
|
||||
|
||||
void uwsgi_help(void);
|
||||
|
||||
void uwsgi_queue_fix(void);
|
||||
|
||||
int uwsgi_str2_num(char *);
|
||||
int uwsgi_str3_num(char *);
|
||||
int uwsgi_str4_num(char *);
|
||||
|
||||
+4
-1
@@ -342,7 +342,10 @@ class uConf(object):
|
||||
k_all = uwsgi_os_k.split('.')
|
||||
k_base = k_all[0]
|
||||
k_major = k_all[1]
|
||||
k_minor = k_all[2]
|
||||
if len(k_all) > 2:
|
||||
k_minor = k_all[2]
|
||||
else:
|
||||
k_minor = 0
|
||||
if int(k_base) > 2:
|
||||
timer_mode = 'timerfd'
|
||||
elif int(k_minor) >= 25:
|
||||
|
||||
@@ -141,12 +141,12 @@ void uwsgi_xml_config(char *filename, struct wsgi_request *wsgi_req, int app_tag
|
||||
if (node->type == XML_ELEMENT_NODE) {
|
||||
|
||||
if (!strcmp((char *) node->name, "app")) {
|
||||
wsgi_req->script_name_len = 0;
|
||||
wsgi_req->appid_len = 0;
|
||||
wsgi_req->host_len = 0;
|
||||
xml_uwsgi_mountpoint = xmlGetProp(node, (const xmlChar *) "mountpoint");
|
||||
if (xml_uwsgi_mountpoint) {
|
||||
wsgi_req->script_name = (char *) xml_uwsgi_mountpoint;
|
||||
wsgi_req->script_name_len = strlen(wsgi_req->script_name);
|
||||
wsgi_req->appid = (char *) xml_uwsgi_mountpoint;
|
||||
wsgi_req->appid_len = strlen(wsgi_req->appid);
|
||||
}
|
||||
|
||||
xml_uwsgi_domain = xmlGetProp(node, (const xmlChar *) "domain");
|
||||
|
||||
Reference in New Issue
Block a user