1*1fb62fb0SOlivier Houchard /* 2*1fb62fb0SOlivier Houchard * Copyright 2011-2015 Samy Al Bahra. 3*1fb62fb0SOlivier Houchard * Copyright 2011 David Joseph. 4*1fb62fb0SOlivier Houchard * All rights reserved. 5*1fb62fb0SOlivier Houchard * 6*1fb62fb0SOlivier Houchard * Redistribution and use in source and binary forms, with or without 7*1fb62fb0SOlivier Houchard * modification, are permitted provided that the following conditions 8*1fb62fb0SOlivier Houchard * are met: 9*1fb62fb0SOlivier Houchard * 1. Redistributions of source code must retain the above copyright 10*1fb62fb0SOlivier Houchard * notice, this list of conditions and the following disclaimer. 11*1fb62fb0SOlivier Houchard * 2. Redistributions in binary form must reproduce the above copyright 12*1fb62fb0SOlivier Houchard * notice, this list of conditions and the following disclaimer in the 13*1fb62fb0SOlivier Houchard * documentation and/or other materials provided with the distribution. 14*1fb62fb0SOlivier Houchard * 15*1fb62fb0SOlivier Houchard * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16*1fb62fb0SOlivier Houchard * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17*1fb62fb0SOlivier Houchard * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18*1fb62fb0SOlivier Houchard * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19*1fb62fb0SOlivier Houchard * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20*1fb62fb0SOlivier Houchard * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21*1fb62fb0SOlivier Houchard * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22*1fb62fb0SOlivier Houchard * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23*1fb62fb0SOlivier Houchard * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24*1fb62fb0SOlivier Houchard * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25*1fb62fb0SOlivier Houchard * SUCH DAMAGE. 26*1fb62fb0SOlivier Houchard */ 27*1fb62fb0SOlivier Houchard 28*1fb62fb0SOlivier Houchard #include <ck_barrier.h> 29*1fb62fb0SOlivier Houchard #include <ck_pr.h> 30*1fb62fb0SOlivier Houchard 31*1fb62fb0SOlivier Houchard void 32*1fb62fb0SOlivier Houchard ck_barrier_centralized(struct ck_barrier_centralized *barrier, 33*1fb62fb0SOlivier Houchard struct ck_barrier_centralized_state *state, 34*1fb62fb0SOlivier Houchard unsigned int n_threads) 35*1fb62fb0SOlivier Houchard { 36*1fb62fb0SOlivier Houchard unsigned int sense, value; 37*1fb62fb0SOlivier Houchard 38*1fb62fb0SOlivier Houchard /* 39*1fb62fb0SOlivier Houchard * Every execution context has a sense associated with it. 40*1fb62fb0SOlivier Houchard * This sense is reversed when the barrier is entered. Every 41*1fb62fb0SOlivier Houchard * thread will spin on the global sense until the last thread 42*1fb62fb0SOlivier Houchard * reverses it. 43*1fb62fb0SOlivier Houchard */ 44*1fb62fb0SOlivier Houchard sense = state->sense = ~state->sense; 45*1fb62fb0SOlivier Houchard value = ck_pr_faa_uint(&barrier->value, 1); 46*1fb62fb0SOlivier Houchard if (value == n_threads - 1) { 47*1fb62fb0SOlivier Houchard ck_pr_store_uint(&barrier->value, 0); 48*1fb62fb0SOlivier Houchard ck_pr_fence_memory(); 49*1fb62fb0SOlivier Houchard ck_pr_store_uint(&barrier->sense, sense); 50*1fb62fb0SOlivier Houchard return; 51*1fb62fb0SOlivier Houchard } 52*1fb62fb0SOlivier Houchard 53*1fb62fb0SOlivier Houchard ck_pr_fence_atomic_load(); 54*1fb62fb0SOlivier Houchard while (sense != ck_pr_load_uint(&barrier->sense)) 55*1fb62fb0SOlivier Houchard ck_pr_stall(); 56*1fb62fb0SOlivier Houchard 57*1fb62fb0SOlivier Houchard ck_pr_fence_acquire(); 58*1fb62fb0SOlivier Houchard return; 59*1fb62fb0SOlivier Houchard } 60