add lock.trylock() and make lock.release() sync.

This commit is contained in:
Joris Vink 2019-09-20 10:03:43 +02:00
parent 06fd5ca2f2
commit d99d0b2d77
2 changed files with 33 additions and 1 deletions

View File

@ -357,10 +357,13 @@ struct pylock {
static PyObject *pylock_aexit(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[] = {
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("__aenter__", pylock_aenter, METH_NOARGS),
METHOD(NULL, NULL, -1)

View File

@ -2833,6 +2833,35 @@ pylock_dealloc(struct pylock *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 *
pylock_aenter(struct pylock *lock, PyObject *args)
{