mirror of
https://github.com/jorisvink/kore
synced 2025-03-09 12:39:01 -04:00
add lock.trylock() and make lock.release() sync.
This commit is contained in:
parent
06fd5ca2f2
commit
d99d0b2d77
@ -357,10 +357,13 @@ struct pylock {
|
|||||||
|
|
||||||
static PyObject *pylock_aexit(struct pylock *, PyObject *);
|
static PyObject *pylock_aexit(struct pylock *, PyObject *);
|
||||||
static PyObject *pylock_aenter(struct pylock *, PyObject *);
|
static PyObject *pylock_aenter(struct pylock *, PyObject *);
|
||||||
|
static PyObject *pylock_release(struct pylock *, PyObject *);
|
||||||
|
static PyObject *pylock_trylock(struct pylock *, PyObject *);
|
||||||
|
|
||||||
static PyMethodDef pylock_methods[] = {
|
static PyMethodDef pylock_methods[] = {
|
||||||
METHOD("aqcuire", pylock_aenter, METH_NOARGS),
|
METHOD("aqcuire", pylock_aenter, METH_NOARGS),
|
||||||
METHOD("release", pylock_aexit, METH_NOARGS),
|
METHOD("release", pylock_release, METH_NOARGS),
|
||||||
|
METHOD("trylock", pylock_trylock, METH_NOARGS),
|
||||||
METHOD("__aexit__", pylock_aexit, METH_VARARGS),
|
METHOD("__aexit__", pylock_aexit, METH_VARARGS),
|
||||||
METHOD("__aenter__", pylock_aenter, METH_NOARGS),
|
METHOD("__aenter__", pylock_aenter, METH_NOARGS),
|
||||||
METHOD(NULL, NULL, -1)
|
METHOD(NULL, NULL, -1)
|
||||||
|
29
src/python.c
29
src/python.c
@ -2833,6 +2833,35 @@ pylock_dealloc(struct pylock *lock)
|
|||||||
PyObject_Del((PyObject *)lock);
|
PyObject_Del((PyObject *)lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
pylock_trylock(struct pylock *lock, PyObject *args)
|
||||||
|
{
|
||||||
|
if (lock->owner != NULL)
|
||||||
|
Py_RETURN_FALSE;
|
||||||
|
|
||||||
|
lock->owner = coro_running;
|
||||||
|
|
||||||
|
Py_RETURN_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
pylock_release(struct pylock *lock, PyObject *args)
|
||||||
|
{
|
||||||
|
if (lock->owner == NULL) {
|
||||||
|
PyErr_SetString(PyExc_RuntimeError, "no lock owner set");
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lock->owner->id != coro_running->id) {
|
||||||
|
PyErr_SetString(PyExc_RuntimeError, "lock not owned by caller");
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
pylock_do_release(lock);
|
||||||
|
|
||||||
|
Py_RETURN_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
pylock_aenter(struct pylock *lock, PyObject *args)
|
pylock_aenter(struct pylock *lock, PyObject *args)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user