mirror of
https://github.com/fluencelabs/musl
synced 2025-05-21 11:41:29 +00:00
this implementation is rather heavy-weight, but it's the first solution i've found that's actually correct. all waiters actually wait twice at the barrier so that they can synchronize exit, and they hold a "vm lock" that prevents changes to virtual memory mappings (and blocks pthread_barrier_destroy) until all waiters are finished inspecting the barrier. thus, it is safe for any thread to destroy and/or unmap the barrier's memory as soon as pthread_barrier_wait returns, without further synchronization.
9 lines
239 B
C
9 lines
239 B
C
#include "pthread_impl.h"
|
|
|
|
int pthread_barrier_init(pthread_barrier_t *b, const pthread_barrierattr_t *a, unsigned count)
|
|
{
|
|
if (count-1 > INT_MAX-1) return EINVAL;
|
|
*b = (pthread_barrier_t){ ._b_limit = count-1 | (a?*a:0) };
|
|
return 0;
|
|
}
|