source: libcfa/src/concurrency/barrier.hfa@ e71e94a

ADT ast-experimental enum pthread-emulation qualifiedEnum
Last change on this file since e71e94a was 31ef267, checked in by Thierry Delisle <tdelisle@…>, 4 years ago

Added comments.

  • Property mode set to 100644
File size: 1.5 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2022 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// barrier.hfa -- simple barrier implemented from monitors
8//
9// Author : Thierry Delisle
10// Created On : Thu Mar 31 16:51:35 2022
11// Last Modified By :
12// Last Modified On :
13// Update Count :
14//
15
16#pragma once
17
18#include <monitor.hfa>
19
20// Simple barrier based on a monitor
21monitor barrier {
22 // Number of threads blocking needed to unblock the barrier
23 // Unsigned should be enough, I don't expect use cases with 2^32 thread barriers.
24 unsigned width;
25
26 // Current count (counting backwards)
27 unsigned count;
28
29 // Barrier uses internal scheduling
30 condition c;
31};
32
33// Constructor
34void ?{}( barrier & this, unsigned width ) {
35 this.width = width;
36 this.count = width; // Count backwards so initialize at width
37}
38
39// block until the number of threads needed have blocked
40// returns an value indicating the reverse order the threads arrived in
41// i.e. last thread will return 0 (and not block)
42// second last thread returns 1
43// etc.
44static inline unsigned block(barrier & mutex this ) {
45 this.count -= 1; // prefix decrement so we the last is 0 and not 1
46 unsigned arrival = this.count; // Note arrival order
47 if(arrival == 0) {
48 // If arrived last unblock everyone and reset
49 signal_all(this.c);
50 this.count = this.width;
51 } else {
52 // Otherwise block
53 wait(this.c);
54 }
55 return arrival; // return arrival order
56}
Note: See TracBrowser for help on using the repository browser.