potential deadlock in _once

Sebastian Huber sebastian.huber at embedded-brains.de
Tue Mar 6 12:19:17 UTC 2018


On 06/03/18 12:12, Passas, Stavros wrote:
> -----Original Message-----
> From: Sebastian Huber [mailto:sebastian.huber at embedded-brains.de]
> Sent: Tuesday, March 6, 2018 10:19 AM
> To: Passas, Stavros<stavros.passas at intel.com>;rtems-devel at rtems.org  <devel at rtems.org>
> Subject: Re: potential deadlock in _once
>
>> Yes, please open a ticket and provide a test case for the RTEMS test suite. Maybe we have to use dedicated mutexes for each pthread_once_t object. This is what Linux and FreeBSD do. This would require a Newlib update.
> Using one dedicated mutex for each pthread_once_t instance would be a longer term and elegant solution.
>
> On the other hand, I think we can get away with a much simpler change: The _once implementation uses a single mutex. Currently this mutex protects the whole function, while I believe we protect reads/writes to the once_state variable only. Concurrent tasks finding the state on RUNNING, could just yield until the state becomes ONCE_STATE_COMPLETE.

Ok, maybe we could use a condition variable for this. It might be 
preferable in terms of storage space. The pthread_once_t is currently 
only one byte. A mutex would increase this to 28 bytes or so.

>
> One side problem I noticed is that the _once() returns EINVAL, if a thread finds the state in ONCE_STATE_RUNNING. This is not documented in RTEMS, neither in POSIX. The specs define: "The init_routine is guaranteed to have run to completion when this routine returns to the caller".

If this is important for you then I suggest to add tickets and implement 
and test it.

-- 
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.huber at embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.



More information about the devel mailing list