From d1a4ae694ee858126709a4311e3426dd9b5857ac Mon Sep 17 00:00:00 2001 From: "roberto@debian32" Date: Sat, 15 Oct 2011 08:32:32 +0200 Subject: [PATCH] --locks --- plugins/python/uwsgi_pymodule.c | 24 +++++++++++++++++++++++- uwsgi.c | 11 +++++++++-- uwsgi.h | 5 ++++- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/plugins/python/uwsgi_pymodule.c b/plugins/python/uwsgi_pymodule.c index 2a2ac478..0e6c81a9 100644 --- a/plugins/python/uwsgi_pymodule.c +++ b/plugins/python/uwsgi_pymodule.c @@ -995,13 +995,24 @@ PyObject *py_uwsgi_i_am_the_spooler(PyObject * self, PyObject * args) { PyObject *py_uwsgi_lock(PyObject * self, PyObject * args) { + int lock_num = 0; + // the spooler cannot lock resources #ifdef UWSGI_SPOOLER if (uwsgi.mypid == uwsgi.shared->spooler_pid) { return PyErr_Format(PyExc_ValueError, "The spooler cannot lock/unlock resources"); } #endif - uwsgi_lock(uwsgi.user_lock); + + if (!PyArg_ParseTuple(args, "|i:lock", &lock_num)) { + return NULL; + } + + if (lock_num < 0 || lock_num > uwsgi.locks) { + return PyErr_Format(PyExc_ValueError, "Invalid lock number"); + } + + uwsgi_lock(uwsgi.user_lock[lock_num]); Py_INCREF(Py_None); return Py_None; @@ -1009,12 +1020,23 @@ PyObject *py_uwsgi_lock(PyObject * self, PyObject * args) { PyObject *py_uwsgi_unlock(PyObject * self, PyObject * args) { + int lock_num = 0; + #ifdef UWSGI_SPOOLER if (uwsgi.mypid == uwsgi.shared->spooler_pid) { return PyErr_Format(PyExc_ValueError, "The spooler cannot lock/unlock resources"); } #endif + if (!PyArg_ParseTuple(args, "|i:unlock", &lock_num)) { + return NULL; + } + + if (lock_num < 0 || lock_num > uwsgi.locks) { + return PyErr_Format(PyExc_ValueError, "Invalid lock number"); + } + + uwsgi_unlock(uwsgi.user_lock); Py_INCREF(Py_None); diff --git a/uwsgi.c b/uwsgi.c index d114c24c..80f6e75f 100644 --- a/uwsgi.c +++ b/uwsgi.c @@ -103,6 +103,7 @@ static struct option long_base_options[] = { {"max-requests", required_argument, 0, 'R'}, {"socket-timeout", required_argument, 0, 'z'}, {"no-fd-passing", no_argument, &uwsgi.no_fd_passing, 1}, + {"locks", required_argument, 0, LONG_ARGS_LOCKS}, {"sharedarea", required_argument, 0, 'A'}, {"cache", required_argument, 0, LONG_ARGS_CACHE}, {"cache-blocksize", required_argument, 0, LONG_ARGS_CACHE_BLOCKSIZE}, @@ -1703,8 +1704,11 @@ int uwsgi_start(void *v_argv) { } // application generic lock - uwsgi.user_lock = uwsgi_mmap_shared_lock(); - uwsgi_lock_init(uwsgi.user_lock); + uwsgi.user_lock = uwsgi_malloc(sizeof(void *) * (uwsgi.locks+1)); + for(i=0;i