diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-10-31 09:35:25 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-10-31 13:18:54 +0100 |
commit | 1c61fdb62cdfbeb83e5390867abe3f9f0ec30f2f (patch) | |
tree | 75a6ee2d5b1235e438ee0623df1277016e0974bc | |
parent | ROUTE(8): Add and use context (diff) | |
download | rtems-libbsd-1c61fdb62cdfbeb83e5390867abe3f9f0ec30f2f.tar.bz2 |
MUTEX(9): Allow destruction of self-owned mutexes
-rw-r--r-- | rtemsbsd/rtems/rtems-bsd-mutex.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/rtemsbsd/rtems/rtems-bsd-mutex.c b/rtemsbsd/rtems/rtems-bsd-mutex.c index f5901bd4..02960f9a 100644 --- a/rtemsbsd/rtems/rtems-bsd-mutex.c +++ b/rtemsbsd/rtems/rtems-bsd-mutex.c @@ -299,15 +299,23 @@ mtx_sysinit(void *arg) void mtx_destroy(struct mtx *m) { - rtems_status_code sc = RTEMS_SUCCESSFUL; + rtems_status_code sc; - sc = rtems_semaphore_delete(m->lock_object.lo_id); - BSD_ASSERT_SC(sc); + do { + sc = rtems_semaphore_delete(m->lock_object.lo_id); + if (sc == RTEMS_RESOURCE_IN_USE) { + BSD_ASSERT(mtx_owned(m)); + + mtx_unlock(m); + } else { + BSD_ASSERT_SC(sc); + } + } while (sc != RTEMS_SUCCESSFUL); rtems_chain_extract(&m->lock_object.lo_node); - m->lock_object.lo_id = 0; - m->lock_object.lo_flags &= ~LO_INITIALIZED; + m->lock_object.lo_id = 0; + m->lock_object.lo_flags &= ~LO_INITIALIZED; } void |