On Wed, 29 May 2024 12:26:31 +0200
Bruno Haible wrote:
> Takashi Yano wrote:
> > As you mentioned in private mail to me, this seems to be a regression of
> > pthread::once() introduced by
> > commit 2c5433e5da8216aaf7458e50c63683c68fb0d3e8.
> >
> > I'll submit a patch for that issue shortly.
>
> My workaround implementation of pthread_once (in gnulib) looks like this:
>
> /* This would be the code, for
> typedef struct
> {
> pthread_mutex_t mutex;
> _Atomic unsigned int num_threads;
> _Atomic unsigned int done;
> }
> pthread_once_t;
> */
> if (once_control->done == 0)
> {
> once_control->num_threads += 1;
> pthread_mutex_lock (&once_control->mutex);
> if (once_control->done == 0)
> {
> (*initfunction) ();
> once_control->done = 1;
> }
> pthread_mutex_unlock (&once_control->mutex);
> if ((once_control->num_threads -= 1) == 0)
> pthread_mutex_destroy (&once_control->mutex);
> }
>
> It makes sure that
> - The last thread that had been dealing with the mutex deletes
> the mutex.
> - Once the mutex is deleted, is it never again accessed. The
> entry test of the 'done' boolean ensures this.
Thanks for the advice.
The problem is that we cannot change the type of pthread_once_t
for binary compatibility. My patch stops to use
pthread_mutex_t mutex in pthread_once_t however it cannot be
deleted despite it is not used at all.
--
Takashi Yano <[email protected]>
--
Problem reports: https://cygwin.com/problems.html
FAQ: https://cygwin.com/faq/
Documentation: https://cygwin.com/docs.html
Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple