process-shared barrier support, based on discussion with bdonlan

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.
This commit is contained in:
Rich Felker
2011-09-27 13:50:29 -04:00
parent 3f39c9b313
commit 6016457011
7 changed files with 102 additions and 16 deletions

View File

@ -2,7 +2,7 @@
int pthread_barrier_init(pthread_barrier_t *b, const pthread_barrierattr_t *a, unsigned count)
{
if (!count) return EINVAL;
*b = (pthread_barrier_t){ ._b_limit = count-1 };
if (count-1 > INT_MAX-1) return EINVAL;
*b = (pthread_barrier_t){ ._b_limit = count-1 | (a?*a:0) };
return 0;
}