diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-09-22 16:49:18 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-09-22 16:50:44 +0200 |
commit | e01f6e0ea56b02c0ac67089ec4a2ccae16506ed7 (patch) | |
tree | 14bd893fb7b47e7c95780fffc841c5501f92e95d /rtemsbsd | |
parent | Import and use subr_lock.c (diff) | |
download | rtems-libbsd-e01f6e0ea56b02c0ac67089ec4a2ccae16506ed7.tar.bz2 |
CONDVAR(9): Use lock class
Diffstat (limited to 'rtemsbsd')
-rw-r--r-- | rtemsbsd/rtems/rtems-bsd-condvar.c | 25 |
1 files changed, 7 insertions, 18 deletions
diff --git a/rtemsbsd/rtems/rtems-bsd-condvar.c b/rtemsbsd/rtems/rtems-bsd-condvar.c index a657a7d2..e64b4703 100644 --- a/rtemsbsd/rtems/rtems-bsd-condvar.c +++ b/rtemsbsd/rtems/rtems-bsd-condvar.c @@ -7,10 +7,9 @@ */ /* - * Copyright (c) 2009-2013 embedded brains GmbH. All rights reserved. + * Copyright (c) 2009-2014 embedded brains GmbH. All rights reserved. * * Dornierstr. 4 - * Obere Lagerstr. 30 * 82178 Puchheim * Germany * <rtems@embedded-brains.de> @@ -78,12 +77,14 @@ cv_destroy(struct cv *cv) static int _cv_wait_support(struct cv *cv, struct lock_object *lock, int timo, bool relock) { - rtems_status_code sc = RTEMS_SUCCESSFUL; int eno = 0; Objects_Locations location = OBJECTS_ERROR; POSIX_Condition_variables_Control *pcv = _POSIX_Condition_variables_Get(&cv->cv_id, &location); if (location == OBJECTS_LOCAL) { + struct lock_class *class = LOCK_CLASS(lock); + int lock_state; + if (pcv->Mutex != POSIX_CONDITION_VARIABLES_NO_MUTEX && pcv->Mutex != lock->lo_id) { _Thread_Enable_dispatch(); @@ -92,14 +93,7 @@ static int _cv_wait_support(struct cv *cv, struct lock_object *lock, int timo, b return EINVAL; } - sc = rtems_semaphore_release(lock->lo_id); - if (sc != RTEMS_SUCCESSFUL) { - _Thread_Enable_dispatch(); - - BSD_ASSERT(false); - - return EINVAL; - } + lock_state = (*class->lc_unlock)(lock); pcv->Mutex = lock->lo_id; @@ -129,12 +123,7 @@ static int _cv_wait_support(struct cv *cv, struct lock_object *lock, int timo, b } if (relock) { - sc = rtems_semaphore_obtain(lock->lo_id, RTEMS_WAIT, RTEMS_NO_TIMEOUT); - if (sc != RTEMS_SUCCESSFUL) { - BSD_ASSERT(false); - - eno = EINVAL; - } + (*class->lc_lock)(lock, lock_state); } return eno; @@ -187,7 +176,7 @@ int _cv_wait_sig(struct cv *cvp, struct lock_object *lock) { /* XXX */ - _cv_wait_support(cvp, lock, 0, true); + return _cv_wait_support(cvp, lock, 0, true); } int |