summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-10-31 09:35:25 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-10-31 13:18:54 +0100
commit1c61fdb62cdfbeb83e5390867abe3f9f0ec30f2f (patch)
tree75a6ee2d5b1235e438ee0623df1277016e0974bc
parentROUTE(8): Add and use context (diff)
downloadrtems-libbsd-1c61fdb62cdfbeb83e5390867abe3f9f0ec30f2f.tar.bz2
MUTEX(9): Allow destruction of self-owned mutexes
-rw-r--r--rtemsbsd/rtems/rtems-bsd-mutex.c18
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