Next: thread.channel, Previous: term_to_xml, Up: Top [Contents]
%--------------------------------------------------%
% vim: ft=mercury ts=4 sw=4 et
%--------------------------------------------------%
% Copyright (C) 2005, 2014 Mission Critical IT.
% Copyright (C) 2014-2015, 2018 The Mercury team.
% This file is distributed under the terms specified in COPYING.LIB.
%--------------------------------------------------%
%
% File: thread.barrier.m
% Original author: Peter Ross
% Stability: low
%
% This module provides a barrier implementation.
%
% A barrier is a position in a program that any thread (of N threads) must
% be suspended at until all the other threads (of N) reach the same
% position.
%
% Barriers are represented by calls to barrier/3 (defined below). Different
% code locations can belong to the same conceptual barrier using values of
% type barrier. The same code location can also be used by multiple
% barriers by supplying different values.
%
%--------------------------------------------------%
%--------------------------------------------------%
:- module thread.barrier.
:- interface.
:- import_module io.
:- type barrier.
% init(N, Barrier, !IO)
%
% Create a barrier for N threads.
%
:- pred init(int::in, barrier::out, io::di, io::uo) is det.
% wait(Barrier, !IO)
%
% Indicate that the current thread has reached the barrier. Throws a
% software_error/1 exception if this barrier has been used by more than
% N threads.
%
:- pred wait(barrier::in, io::di, io::uo) is det.
% release_barrier(Barrier, !IO)
%
% Release all the threads waiting at the barrier regardless of whether
% or not N threads have arrived at the barrier. This can be called by
% any thread, it does not have to be a thread that would normally call
% wait/3.
%
:- pred release(barrier::in, io::di, io::uo) is det.
%--------------------------------------------------%
%--------------------------------------------------%