From 7ef921356f76cc964daa10d29043c85e95b8b584 Mon Sep 17 00:00:00 2001 From: "roberto@debian32" Date: Fri, 19 Aug 2011 15:22:20 +0200 Subject: [PATCH] updated sharedarea --- plugins/python/uwsgi_pymodule.c | 115 ++++++++++++++++++++++---------- tests/sharedarea.py | 16 +++++ uwsgi.c | 4 +- uwsgi.h | 4 +- 4 files changed, 100 insertions(+), 39 deletions(-) create mode 100644 tests/sharedarea.py diff --git a/plugins/python/uwsgi_pymodule.c b/plugins/python/uwsgi_pymodule.c index c1935cda..6c3e381c 100644 --- a/plugins/python/uwsgi_pymodule.c +++ b/plugins/python/uwsgi_pymodule.c @@ -1019,81 +1019,102 @@ PyObject *py_uwsgi_embedded_data(PyObject * self, PyObject * args) { } PyObject *py_uwsgi_sharedarea_inclong(PyObject * self, PyObject * args) { - int pos = 0; - long value = 0; + uint64_t pos = 0; + uint64_t value = 1; + uint64_t current_value = 0; if (uwsgi.sharedareasize <= 0) { Py_INCREF(Py_None); return Py_None; } - if (!PyArg_ParseTuple(args, "ii:sharedarea_inclong", &pos, &value)) { + if (!PyArg_ParseTuple(args, "l|l:sharedarea_inclong", &pos, &value)) { return NULL; } - if (pos + 4 >= uwsgi.page_size * uwsgi.sharedareasize) { + if (pos + 8 >= uwsgi.page_size * uwsgi.sharedareasize) { Py_INCREF(Py_None); return Py_None; } - memcpy(&value, uwsgi.sharedarea + pos, 4); - value++; - memcpy(uwsgi.sharedarea + pos, &value, 4); + uwsgi_wlock(uwsgi.sa_lock); - return PyInt_FromLong(value); + memcpy(¤t_value, uwsgi.sharedarea + pos, 8); + value = current_value + value; + memcpy(uwsgi.sharedarea + pos, &value, 8); + + PyObject *ret = PyInt_FromLong(value); + + uwsgi_rwunlock(uwsgi.sa_lock); + + return ret; } PyObject *py_uwsgi_sharedarea_writelong(PyObject * self, PyObject * args) { - int pos = 0; - long value; + uint64_t pos = 0; + uint64_t value = 0; if (uwsgi.sharedareasize <= 0) { Py_INCREF(Py_None); return Py_None; } - if (!PyArg_ParseTuple(args, "ii:sharedarea_writelong", &pos, &value)) { + if (!PyArg_ParseTuple(args, "ll:sharedarea_writelong", &pos, &value)) { return NULL; } - if (pos + 4 >= uwsgi.page_size * uwsgi.sharedareasize) { + if (pos + 8 >= uwsgi.page_size * uwsgi.sharedareasize) { Py_INCREF(Py_None); return Py_None; } - memcpy(uwsgi.sharedarea + pos, &value, 4); + uwsgi_wlock(uwsgi.sa_lock); - return PyInt_FromLong(value); + memcpy(uwsgi.sharedarea + pos, &value, 8); + + + PyObject *ret = PyInt_FromLong(value); + + uwsgi_rwunlock(uwsgi.sa_lock); + + return ret; } PyObject *py_uwsgi_sharedarea_write(PyObject * self, PyObject * args) { - int pos = 0; + uint64_t pos = 0; char *value; + Py_ssize_t value_len = 0; if (uwsgi.sharedareasize <= 0) { Py_INCREF(Py_None); return Py_None; } - if (!PyArg_ParseTuple(args, "is:sharedarea_write", &pos, &value)) { + if (!PyArg_ParseTuple(args, "ls#:sharedarea_write", &pos, &value, &value_len)) { return NULL; } - if (pos + (int) strlen(value) >= uwsgi.page_size * uwsgi.sharedareasize) { + if (pos + value_len >= uwsgi.page_size * uwsgi.sharedareasize) { Py_INCREF(Py_None); return Py_None; } - memcpy(uwsgi.sharedarea + pos, value, strlen(value)); + uwsgi_wlock(uwsgi.sa_lock); - return PyInt_FromLong(strlen(value)); + memcpy(uwsgi.sharedarea + pos, value, value_len); + + PyObject *ret = PyInt_FromLong(value_len); + + uwsgi_rwunlock(uwsgi.sa_lock); + + return ret; } PyObject *py_uwsgi_sharedarea_writebyte(PyObject * self, PyObject * args) { - int pos = 0; + uint64_t pos = 0; char value; if (uwsgi.sharedareasize <= 0) { @@ -1102,7 +1123,7 @@ PyObject *py_uwsgi_sharedarea_writebyte(PyObject * self, PyObject * args) { } - if (!PyArg_ParseTuple(args, "ib:sharedarea_writebyte", &pos, &value)) { + if (!PyArg_ParseTuple(args, "lb:sharedarea_writebyte", &pos, &value)) { return NULL; } @@ -1111,46 +1132,58 @@ PyObject *py_uwsgi_sharedarea_writebyte(PyObject * self, PyObject * args) { return Py_None; } + uwsgi_wlock(uwsgi.sa_lock); + uwsgi.sharedarea[pos] = value; - return PyInt_FromLong(uwsgi.sharedarea[pos]); + PyObject *ret = PyInt_FromLong(uwsgi.sharedarea[pos]); + + uwsgi_rwunlock(uwsgi.sa_lock); + + return ret; } PyObject *py_uwsgi_sharedarea_readlong(PyObject * self, PyObject * args) { - int pos = 0; - long value; + uint64_t pos = 0; + uint64_t value; if (uwsgi.sharedareasize <= 0) { Py_INCREF(Py_None); return Py_None; } - if (!PyArg_ParseTuple(args, "i:sharedarea_readlong", &pos)) { + if (!PyArg_ParseTuple(args, "l:sharedarea_readlong", &pos)) { return NULL; } - if (pos + 4 >= uwsgi.page_size * uwsgi.sharedareasize) { + if (pos + 8 >= uwsgi.page_size * uwsgi.sharedareasize) { Py_INCREF(Py_None); return Py_None; } - memcpy(&value, uwsgi.sharedarea + pos, 4); + uwsgi_wlock(uwsgi.sa_lock); - return PyInt_FromLong(value); + memcpy(&value, uwsgi.sharedarea + pos, 8); + + PyObject *ret = PyLong_FromLong(value); + + uwsgi_rwunlock(uwsgi.sa_lock); + + return ret; } PyObject *py_uwsgi_sharedarea_readbyte(PyObject * self, PyObject * args) { - int pos = 0; + uint64_t pos = 0; if (uwsgi.sharedareasize <= 0) { Py_INCREF(Py_None); return Py_None; } - if (!PyArg_ParseTuple(args, "i:sharedarea_readbyte", &pos)) { + if (!PyArg_ParseTuple(args, "l:sharedarea_readbyte", &pos)) { return NULL; } @@ -1159,20 +1192,26 @@ PyObject *py_uwsgi_sharedarea_readbyte(PyObject * self, PyObject * args) { return Py_None; } - return PyInt_FromLong(uwsgi.sharedarea[pos]); + uwsgi_wlock(uwsgi.sa_lock); + + PyObject *ret = PyInt_FromLong(uwsgi.sharedarea[pos]); + + uwsgi_rwunlock(uwsgi.sa_lock); + + return ret; } PyObject *py_uwsgi_sharedarea_read(PyObject * self, PyObject * args) { - int pos = 0; - int len = 1; + uint64_t pos = 0; + uint64_t len = 1; if (uwsgi.sharedareasize <= 0) { Py_INCREF(Py_None); return Py_None; } - if (!PyArg_ParseTuple(args, "i|i:sharedarea_read", &pos, &len)) { + if (!PyArg_ParseTuple(args, "l|l:sharedarea_read", &pos, &len)) { return NULL; } @@ -1181,7 +1220,13 @@ PyObject *py_uwsgi_sharedarea_read(PyObject * self, PyObject * args) { return Py_None; } - return PyString_FromStringAndSize(uwsgi.sharedarea + pos, len); + uwsgi_wlock(uwsgi.sa_lock); + + PyObject *ret = PyString_FromStringAndSize(uwsgi.sharedarea + pos, len); + + uwsgi_rwunlock(uwsgi.sa_lock); + + return ret; } #ifdef UWSGI_SPOOLER diff --git a/tests/sharedarea.py b/tests/sharedarea.py new file mode 100644 index 00000000..1d8f2c4e --- /dev/null +++ b/tests/sharedarea.py @@ -0,0 +1,16 @@ +import uwsgi + +uwsgi.sharedarea_writelong(173, 30) + +def application(e, sr): + + sr('200 Ok', [('Content-Type','text/html')]) + + uwsgi.sharedarea_write(17, e['REQUEST_URI']) + + uwsgi.sharedarea_inclong(173) + uwsgi.sharedarea_inclong(173, 17) + + yield uwsgi.sharedarea_read(17, len(e['REQUEST_URI'])) + yield "
" + yield str(uwsgi.sharedarea_readlong(173)) diff --git a/uwsgi.c b/uwsgi.c index 1fccfb36..5be7e5a3 100644 --- a/uwsgi.c +++ b/uwsgi.c @@ -1653,18 +1653,18 @@ int uwsgi_start(void *v_argv) { uwsgi_lock_init(uwsgi.rpc_table_lock); if (uwsgi.sharedareasize > 0) { - uwsgi.sharedareamutex = uwsgi_mmap_shared_lock(); uwsgi.sharedarea = mmap(NULL, uwsgi.page_size * uwsgi.sharedareasize, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); if (uwsgi.sharedarea) { uwsgi_log("shared area mapped at %p, you can access it with uwsgi.sharedarea* functions.\n", uwsgi.sharedarea); - uwsgi_lock_init(uwsgi.sharedareamutex); } else { uwsgi_error("mmap()"); exit(1); } + uwsgi.sa_lock = uwsgi_mmap_shared_rwlock(); + uwsgi_rwlock_init(uwsgi.sa_lock); } if (uwsgi.queue_size > 0) { diff --git a/uwsgi.h b/uwsgi.h index 22bd56de..a52d9cc9 100644 --- a/uwsgi.h +++ b/uwsgi.h @@ -1115,8 +1115,7 @@ struct uwsgi_server { int vec_size; char *sharedarea; - void *sharedareamutex; - int sharedareasize; + uint64_t sharedareasize; #ifdef UWSGI_THREADING pthread_mutex_t six_feet_under_lock; @@ -1322,6 +1321,7 @@ struct uwsgi_server { void *rb_timer_table_lock; void *cron_table_lock; void *rpc_table_lock; + void *sa_lock; #ifdef UWSGI_SPOOLER void *spooler_lock; #endif