source: libcfa/src/concurrency/barrier.hfa@ 6b33e89

Last change on this file since 6b33e89 was 6b33e89, checked in by Peter A. Buhr <pabuhr@…>, 5 months ago

change backquote call to regular call

  • Property mode set to 100644
File size: 1.6 KB
Line 
1// -*- Mode: C -*-
2//
3// Cforall Version 1.0.0 Copyright (C) 2022 University of Waterloo
4//
5// The contents of this file are covered under the licence agreement in the
6// file "LICENCE" distributed with Cforall.
7//
8// barrier.hfa -- simple barrier implemented using a monitor
9//
10// Author : Peter A. Buhr
11// Created On : Sun Nov 10 08:07:35 2024
12// Last Modified By : Peter A. Buhr
13// Last Modified On : Thu Apr 24 22:41:11 2025
14// Update Count : 12
15//
16
17#pragma once
18
19#include <monitor.hfa>
20
21// Plan 9 inheritance does not work with monitors. Two monitor locks are created.
22
23monitor barrier {
24 unsigned int group, arrivals; // group size, arrival counter
25 condition c; // wait for group to form
26};
27
28static inline void ?{}( barrier & b, unsigned int group ) {
29 b.group = b.arrivals = group; // arrivals count backward
30}
31
32// Returns a value indicating the reverse order the threads arrived, i.e. last thread returns 0 (and does not block)
33// hook is an optional hook that is called by the Gth thread before unblocking the other threads.
34static inline unsigned int block( barrier & mutex b, fptr_t hook = (fptr_t)0 ) with( b ) {
35 arrivals -= 1; // prefix decrement so last is 0 not 1
36 unsigned arrived = b.arrivals; // note arrival order
37 if ( arrivals != 0 ) { // wait for group to form
38 wait( b.c );
39 } else { // group formed
40 if ( hook ) hook(); // safe to call
41 signal_all( c ); // unblock group
42 arrivals = group; // reset
43 } // if
44 return arrived; // return arrival order
45}
Note: See TracBrowser for help on using the repository browser.