1309260Scognet/* 2309260Scognet * Copyright 2011-2015 Samy Al Bahra. 3309260Scognet * Copyright 2011 David Joseph. 4309260Scognet * All rights reserved. 5309260Scognet * 6309260Scognet * Redistribution and use in source and binary forms, with or without 7309260Scognet * modification, are permitted provided that the following conditions 8309260Scognet * are met: 9309260Scognet * 1. Redistributions of source code must retain the above copyright 10309260Scognet * notice, this list of conditions and the following disclaimer. 11309260Scognet * 2. Redistributions in binary form must reproduce the above copyright 12309260Scognet * notice, this list of conditions and the following disclaimer in the 13309260Scognet * documentation and/or other materials provided with the distribution. 14309260Scognet * 15309260Scognet * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16309260Scognet * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17309260Scognet * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18309260Scognet * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19309260Scognet * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20309260Scognet * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21309260Scognet * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22309260Scognet * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23309260Scognet * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24309260Scognet * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25309260Scognet * SUCH DAMAGE. 26309260Scognet */ 27309260Scognet 28309260Scognet#include <ck_barrier.h> 29309260Scognet#include <ck_pr.h> 30309260Scognet 31309260Scognetvoid 32309260Scognetck_barrier_centralized(struct ck_barrier_centralized *barrier, 33309260Scognet struct ck_barrier_centralized_state *state, 34309260Scognet unsigned int n_threads) 35309260Scognet{ 36309260Scognet unsigned int sense, value; 37309260Scognet 38309260Scognet /* 39309260Scognet * Every execution context has a sense associated with it. 40309260Scognet * This sense is reversed when the barrier is entered. Every 41309260Scognet * thread will spin on the global sense until the last thread 42309260Scognet * reverses it. 43309260Scognet */ 44309260Scognet sense = state->sense = ~state->sense; 45309260Scognet value = ck_pr_faa_uint(&barrier->value, 1); 46309260Scognet if (value == n_threads - 1) { 47309260Scognet ck_pr_store_uint(&barrier->value, 0); 48309260Scognet ck_pr_fence_memory(); 49309260Scognet ck_pr_store_uint(&barrier->sense, sense); 50309260Scognet return; 51309260Scognet } 52309260Scognet 53309260Scognet ck_pr_fence_atomic_load(); 54309260Scognet while (sense != ck_pr_load_uint(&barrier->sense)) 55309260Scognet ck_pr_stall(); 56309260Scognet 57309260Scognet ck_pr_fence_acquire(); 58309260Scognet return; 59309260Scognet} 60