[PATCH 05/14] pytdb: Add support for tdb_chainlock() & friends
Kirill Smelkov
kirr at landau.phys.spbu.ru
Sat Oct 2 07:43:44 MDT 2010
I wonder whether do we need _mark variants, and also why in pytdb there
is a name mismatch with C tdb? e.g.
tdb_lockall_read() is called tdb.read_lock_all() in Python.
I've sticked to this rule, but it looks confusing to me...
Cc: 597386 at bugs.debian.org
Signed-off-by: Kirill Smelkov <kirr at landau.phys.spbu.ru>
---
lib/tdb/pytdb.c | 77 ++++++++++++++++++++++++++++++++++++++++
lib/tdb/python/tests/simple.py | 20 ++++++++++
2 files changed, 97 insertions(+), 0 deletions(-)
diff --git a/lib/tdb/pytdb.c b/lib/tdb/pytdb.c
index 42df639..07ac524 100644
--- a/lib/tdb/pytdb.c
+++ b/lib/tdb/pytdb.c
@@ -196,6 +196,71 @@ static PyObject *obj_lockall_read_nonblock(PyTdbObject *self)
PyTdb_LOCK_NONBLOCK_RET_OR_RAISE(ret, self->ctx);
}
+
+static PyObject *obj_chainlock(PyTdbObject *self, PyObject *args)
+{
+ int ret;
+ TDB_DATA key;
+ PyTdb_ARGS_AS_TDBDATA(args, &key);
+
+ ret = tdb_chainlock(self->ctx, key);
+ PyErr_TDB_ERROR_IS_ERR_RAISE(ret, self->ctx);
+ Py_RETURN_NONE;
+}
+
+static PyObject *obj_chainunlock(PyTdbObject *self, PyObject *args)
+{
+ int ret;
+ TDB_DATA key;
+ PyTdb_ARGS_AS_TDBDATA(args, &key);
+
+ ret = tdb_chainunlock(self->ctx, key);
+ PyErr_TDB_ERROR_IS_ERR_RAISE(ret, self->ctx);
+ Py_RETURN_NONE;
+}
+
+static PyObject *obj_chainlock_read(PyTdbObject *self, PyObject *args)
+{
+ int ret;
+ TDB_DATA key;
+ PyTdb_ARGS_AS_TDBDATA(args, &key);
+
+ ret = tdb_chainlock_read(self->ctx, key);
+ PyErr_TDB_ERROR_IS_ERR_RAISE(ret, self->ctx);
+ Py_RETURN_NONE;
+}
+
+static PyObject *obj_chainunlock_read(PyTdbObject *self, PyObject *args)
+{
+ int ret;
+ TDB_DATA key;
+ PyTdb_ARGS_AS_TDBDATA(args, &key);
+
+ ret = tdb_chainunlock_read(self->ctx, key);
+ PyErr_TDB_ERROR_IS_ERR_RAISE(ret, self->ctx);
+ Py_RETURN_NONE;
+}
+
+static PyObject *obj_chainlock_nonblock(PyTdbObject *self, PyObject *args)
+{
+ int ret;
+ TDB_DATA key;
+ PyTdb_ARGS_AS_TDBDATA(args, &key);
+
+ ret = tdb_chainlock_nonblock(self->ctx, key);
+ PyTdb_LOCK_NONBLOCK_RET_OR_RAISE(ret, self->ctx);
+}
+
+static PyObject *obj_chainlock_read_nonblock(PyTdbObject *self, PyObject *args)
+{
+ int ret;
+ TDB_DATA key;
+ PyTdb_ARGS_AS_TDBDATA(args, &key);
+
+ ret = tdb_chainlock_read_nonblock(self->ctx, key);
+ PyTdb_LOCK_NONBLOCK_RET_OR_RAISE(ret, self->ctx);
+}
+
static PyObject *obj_close(PyTdbObject *self)
{
int ret;
@@ -394,6 +459,18 @@ static PyMethodDef tdb_object_methods[] = {
"S.lock_all_nonblock() -> True|False" },
{ "read_lock_all_nonblock", (PyCFunction)obj_lockall_read_nonblock, METH_NOARGS,
"S.read_lock_all_nonblock() -> True|False" },
+ { "chainlock", (PyCFunction)obj_chainlock, METH_VARARGS,
+ "S.chainlock(key) -> None" },
+ { "chainunlock", (PyCFunction)obj_chainunlock, METH_VARARGS,
+ "S.chainunlock() -> None" },
+ { "read_chainlock", (PyCFunction)obj_chainlock_read, METH_VARARGS,
+ "S.read_chainlock(key) -> None" },
+ { "read_chainunlock", (PyCFunction)obj_chainunlock_read, METH_VARARGS,
+ "S.read_chainunlock() -> None" },
+ { "chainlock_nonblock", (PyCFunction)obj_chainlock_nonblock, METH_VARARGS,
+ "S.chainlock_nonblock(key) -> True|False" },
+ { "read_chainlock_nonblock", (PyCFunction)obj_chainlock_read_nonblock, METH_VARARGS,
+ "S.chainlock_read_nonblock(key) -> True|False" },
{ "close", (PyCFunction)obj_close, METH_NOARGS, NULL },
{ "get", (PyCFunction)obj_get, METH_VARARGS, "S.get(key) -> value\n"
"Fetch a value." },
diff --git a/lib/tdb/python/tests/simple.py b/lib/tdb/python/tests/simple.py
index eb7fd17..3d3118b 100644
--- a/lib/tdb/python/tests/simple.py
+++ b/lib/tdb/python/tests/simple.py
@@ -78,6 +78,26 @@ class SimpleTdbTests(TestCase):
locked = self.tdb.read_lock_all_nonblock()
self.tdb.read_unlock_all()
+ def test_chainlock(self):
+ self.tdb.chainlock("foo")
+ self.tdb.chainunlock("foo")
+
+ def test_chainlock_read(self):
+ self.tdb.read_chainlock("foo")
+ self.tdb.read_chainunlock("foo")
+
+ def test_chainlock_nonblock(self):
+ locked = False
+ while not locked:
+ locked = self.tdb.chainlock_nonblock("foo")
+ self.tdb.chainunlock("foo")
+
+ def test_chainlock_read_nonblock(self):
+ locked = False
+ while not locked:
+ locked = self.tdb.read_chainlock_nonblock("foo")
+ self.tdb.read_chainunlock("foo")
+
def test_reopen(self):
self.tdb.reopen()
--
1.7.3.1.50.g1e633
More information about the samba-technical
mailing list