Path: blob/main/sys/contrib/ck/include/ck_barrier.h
48254 views
/*1* Copyright 2011-2015 Samy Al Bahra.2* Copyright 2011 David Joseph.3* All rights reserved.4*5* Redistribution and use in source and binary forms, with or without6* modification, are permitted provided that the following conditions7* are met:8* 1. Redistributions of source code must retain the above copyright9* notice, this list of conditions and the following disclaimer.10* 2. Redistributions in binary form must reproduce the above copyright11* notice, this list of conditions and the following disclaimer in the12* documentation and/or other materials provided with the distribution.13*14* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND15* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE16* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE17* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE18* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL19* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS20* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)21* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT22* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY23* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF24* SUCH DAMAGE.25*/2627#ifndef CK_BARRIER_H28#define CK_BARRIER_H2930#include <ck_spinlock.h>3132struct ck_barrier_centralized {33unsigned int value;34unsigned int sense;35};36typedef struct ck_barrier_centralized ck_barrier_centralized_t;3738struct ck_barrier_centralized_state {39unsigned int sense;40};41typedef struct ck_barrier_centralized_state ck_barrier_centralized_state_t;4243#define CK_BARRIER_CENTRALIZED_INITIALIZER {0, 0}44#define CK_BARRIER_CENTRALIZED_STATE_INITIALIZER {0}4546void ck_barrier_centralized(ck_barrier_centralized_t *,47ck_barrier_centralized_state_t *, unsigned int);4849struct ck_barrier_combining_group {50unsigned int k;51unsigned int count;52unsigned int sense;53struct ck_barrier_combining_group *parent;54struct ck_barrier_combining_group *left;55struct ck_barrier_combining_group *right;56struct ck_barrier_combining_group *next;57} CK_CC_CACHELINE;58typedef struct ck_barrier_combining_group ck_barrier_combining_group_t;5960struct ck_barrier_combining_state {61unsigned int sense;62};63typedef struct ck_barrier_combining_state ck_barrier_combining_state_t;6465#define CK_BARRIER_COMBINING_STATE_INITIALIZER {~0}6667struct ck_barrier_combining {68struct ck_barrier_combining_group *root;69ck_spinlock_fas_t mutex;70};71typedef struct ck_barrier_combining ck_barrier_combining_t;7273void ck_barrier_combining_init(ck_barrier_combining_t *, ck_barrier_combining_group_t *);7475void ck_barrier_combining_group_init(ck_barrier_combining_t *,76ck_barrier_combining_group_t *, unsigned int);7778void ck_barrier_combining(ck_barrier_combining_t *,79ck_barrier_combining_group_t *,80ck_barrier_combining_state_t *);8182struct ck_barrier_dissemination_flag {83unsigned int tflag;84unsigned int *pflag;85};86typedef struct ck_barrier_dissemination_flag ck_barrier_dissemination_flag_t;8788struct ck_barrier_dissemination {89unsigned int nthr;90unsigned int size;91unsigned int tid;92struct ck_barrier_dissemination_flag *flags[2];93};94typedef struct ck_barrier_dissemination ck_barrier_dissemination_t;9596struct ck_barrier_dissemination_state {97int parity;98unsigned int sense;99unsigned int tid;100};101typedef struct ck_barrier_dissemination_state ck_barrier_dissemination_state_t;102103void ck_barrier_dissemination_init(ck_barrier_dissemination_t *,104ck_barrier_dissemination_flag_t **, unsigned int);105106void ck_barrier_dissemination_subscribe(ck_barrier_dissemination_t *,107ck_barrier_dissemination_state_t *);108109unsigned int ck_barrier_dissemination_size(unsigned int);110111void ck_barrier_dissemination(ck_barrier_dissemination_t *,112ck_barrier_dissemination_state_t *);113114struct ck_barrier_tournament_round {115int role;116unsigned int *opponent;117unsigned int flag;118};119typedef struct ck_barrier_tournament_round ck_barrier_tournament_round_t;120121struct ck_barrier_tournament {122unsigned int tid;123unsigned int size;124struct ck_barrier_tournament_round **rounds;125};126typedef struct ck_barrier_tournament ck_barrier_tournament_t;127128struct ck_barrier_tournament_state {129unsigned int sense;130unsigned int vpid;131};132typedef struct ck_barrier_tournament_state ck_barrier_tournament_state_t;133134void ck_barrier_tournament_subscribe(ck_barrier_tournament_t *,135ck_barrier_tournament_state_t *);136void ck_barrier_tournament_init(ck_barrier_tournament_t *,137ck_barrier_tournament_round_t **,138unsigned int);139unsigned int ck_barrier_tournament_size(unsigned int);140void ck_barrier_tournament(ck_barrier_tournament_t *, ck_barrier_tournament_state_t *);141142struct ck_barrier_mcs {143unsigned int tid;144unsigned int *children[2];145unsigned int childnotready[4];146unsigned int dummy;147unsigned int havechild[4];148unsigned int *parent;149unsigned int parentsense;150};151typedef struct ck_barrier_mcs ck_barrier_mcs_t;152153struct ck_barrier_mcs_state {154unsigned int sense;155unsigned int vpid;156};157typedef struct ck_barrier_mcs_state ck_barrier_mcs_state_t;158159void ck_barrier_mcs_init(ck_barrier_mcs_t *, unsigned int);160void ck_barrier_mcs_subscribe(ck_barrier_mcs_t *, ck_barrier_mcs_state_t *);161void ck_barrier_mcs(ck_barrier_mcs_t *, ck_barrier_mcs_state_t *);162163#endif /* CK_BARRIER_H */164165166