[rtems-docs commit] c-users: Clarify semaphore obtain/flush
Joel Sherrill
joel at rtems.org
Fri Nov 17 14:38:45 UTC 2017
Classic API Barriers offer a cleaner alternative to using semaphore_flush.
Unlike
POSIX barriers, they have a manual release option. And unlike
semaphore_flush,
you wake up with SUCCESSFUL when it is signaled/released. It seems more
natural to get an OK than an UNSATISFIED when you got the "good result".
Off the top of my head, I don't know if they address the scenario you are
warning about but it would be nice to address the same use case and possibly
same issue.
--joel
On Fri, Nov 17, 2017 at 12:30 AM, Sebastian Huber <sebh at rtems.org> wrote:
> Module: rtems-docs
> Branch: master
> Commit: d9ecff105d5438158a994f106ca7f55b5c4e60e3
> Changeset: http://git.rtems.org/rtems-docs/commit/?id=
> d9ecff105d5438158a994f106ca7f55b5c4e60e3
>
> Author: Sebastian Huber <sebastian.huber at embedded-brains.de>
> Date: Thu Nov 16 10:29:43 2017 +0100
>
> c-users: Clarify semaphore obtain/flush
>
> ---
>
> c-user/semaphore_manager.rst | 44 ++++++++++++++++++++++++++++++
> +++++++++++++-
> 1 file changed, 43 insertions(+), 1 deletion(-)
>
> diff --git a/c-user/semaphore_manager.rst b/c-user/semaphore_manager.rst
> index 27080e0..f39f429 100644
> --- a/c-user/semaphore_manager.rst
> +++ b/c-user/semaphore_manager.rst
> @@ -614,6 +614,11 @@ DESCRIPTION:
> semaphore is available or the ``RTEMS_NO_WAIT`` option component is
> set,
> then timeout is ignored.
>
> + In case a semaphore is not available, then ``RTEMS_UNSATISFIED`` will
> be
> + returned. This happens immediately in case ``RTEMS_NO_WAIT`` is
> specified,
> + or as a result of another task invoking the ``rtems_semaphore_flush``
> + directive in case ``RTEMS_WAIT`` is specified.
> +
> Deadlock situations are detected for MrsP semaphores and the
> ``RTEMS_UNSATISFIED`` status code will be returned in SMP
> configurations in
> this case.
> @@ -734,7 +739,7 @@ DIRECTIVE STATUS CODES:
> * - ``RTEMS_INVALID_ID``
> - invalid semaphore id
> * - ``RTEMS_NOT_DEFINED``
> - - operation not defined for the protocol ofthe semaphore
> + - operation not defined for the protocol of the semaphore
> * - ``RTEMS_ILLEGAL_ON_REMOTE_OBJECT``
> - not supported for remote semaphores
>
> @@ -762,6 +767,43 @@ NOTES:
> It is not allowed to flush a MrsP semaphore and the
> ``RTEMS_NOT_DEFINED``
> status code will be returned in SMP configurations in this case.
>
> + Using the ``rtems_semaphore_flush`` directive for condition
> synchronization
> + in concert with another semaphore may be subject to the lost wake-up
> + problem. The following attempt to implement a condition variable is
> + broken.
> +
> + .. code-block:: c
> +
> + #include <rtems.h>
> + #include <assert.h>
> +
> + void cnd_wait( rtems_id cnd, rtems_id mtx )
> + {
> + rtems_status_code sc;
> +
> + sc = rtems_semaphore_release( mtx );
> + assert( sc == RTEMS_SUCCESSFUL );
> +
> + /*
> + * Here, a higher priority task may run and satisfy the
> condition. We
> + * may never wake up from the next semaphore obtain.
> + */
> +
> + sc = rtems_semaphore_obtain( cnd, RTEMS_WAIT, RTEMS_NO_TIMEOUT
> );
> + assert( sc == RTEMS_UNSATISFIED );
> +
> + sc = rtems_semaphore_obtain( mtx, RTEMS_WAIT, RTEMS_NO_TIMEOUT
> );
> + assert( sc == RTEMS_SUCCESSFUL );
> + }
> +
> + void cnd_broadcast( rtems_id cnd )
> + {
> + rtems_status_code sc;
> +
> + sc = rtems_semaphore_flush( cnd );
> + assert( sc == RTEMS_SUCCESSFUL );
> + }
> +
> .. raw:: latex
>
> \clearpage
>
> _______________________________________________
> vc mailing list
> vc at rtems.org
> http://lists.rtems.org/mailman/listinfo/vc
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20171117/d933e58c/attachment.html>
More information about the devel
mailing list