mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-21 01:12:26 +08:00
590b40f7ec
2004-09-07 Jakub Jelinek <jakub@redhat.com> * sysdeps/powerpc/powerpc64/configure.in: New file. * config.h.in (USE_PPC64_OVERLAPPING_OPD): Add. * configure.in (HAVE_ASM_GLOBAL_DOT_NAME): Remove. * sysdeps/powerpc/powerpc64/sysdep.h: Formatting. (OPD_ENT, BODY_LABEL, ENTRY_1, ENTRY_2, END_2, DOT_PREFIX, BODY_PREFIX): Define. (ENTRY, DOT_LABEL, END, TRACEBACK, END_GEN_TB, EALIGN): Support HAVE_ASM_GLOBAL_DOT_NAME or no dot symbols, USE_PPC64_OVERLAPPING_OPD or never overlapping .opd entries. * sysdeps/powerpc/powerpc64/dl-machine.h: Include sysdep.h. (TRAMPOLINE_TEMPLATE, RTLD_START): Use the new sysdep.h macros.
45 lines
938 B
Plaintext
45 lines
938 B
Plaintext
Barriers pseudocode
|
|
===================
|
|
|
|
int pthread_barrier_wait(barrier_t *barrier);
|
|
|
|
struct barrier_t {
|
|
|
|
unsigned int lock:
|
|
- internal mutex
|
|
|
|
unsigned int left;
|
|
- current barrier count, # of threads still needed.
|
|
|
|
unsigned int init_count;
|
|
- number of threads needed for the barrier to continue.
|
|
|
|
unsigned int curr_event;
|
|
- generation count
|
|
}
|
|
|
|
pthread_barrier_wait(barrier_t *barrier)
|
|
{
|
|
unsigned int event;
|
|
result = 0;
|
|
|
|
lll_lock(barrier->lock);
|
|
if (!--barrier->left) {
|
|
barrier->curr_event++;
|
|
futex_wake(&barrier->curr_event, INT_MAX)
|
|
|
|
result = BARRIER_SERIAL_THREAD;
|
|
} else {
|
|
event = barrier->curr_event;
|
|
lll_unlock(barrier->lock);
|
|
do {
|
|
futex_wait(&barrier->curr_event, event)
|
|
} while (event == barrier->curr_event);
|
|
}
|
|
|
|
if (atomic_increment_val (barrier->left) == barrier->init_count)
|
|
lll_unlock(barrier->lock);
|
|
|
|
return result;
|
|
}
|