1/** \file 2 * \brief Simple name-server based barriers 3 */ 4 5/* 6 * Copyright (c) 2010, ETH Zurich. 7 * All rights reserved. 8 * 9 * This file is distributed under the terms in the attached LICENSE file. 10 * If you do not find this file, copies can be found by writing to: 11 * ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group. 12 */ 13 14#include <stdio.h> 15#include <string.h> 16 17#include <barrelfish/barrelfish.h> 18#include <barrelfish/nameservice_client.h> 19 20#include <dist/barrier.h> 21 22#define EXTRA_NAME_LEN 6 // enough extra space for an int or "done" 23#define READY_SUFFIX "ready" 24#define READY_LEN 5 // strlen(READY_SUFFIX) 25 26 27errval_t nsb_wait_n(int n, char *name) 28{ 29 errval_t err; 30 int name_len = strlen(name) + EXTRA_NAME_LEN + READY_LEN; 31 char serv_name[name_len]; 32 snprintf(serv_name, name_len, "%s.%d.%s", name, n, READY_SUFFIX); 33 err = nameservice_blocking_lookup(serv_name, NULL); 34 if (err_is_fail(err)) { 35 return err_push(err, DIST_ERR_NS_LOOKUP); 36 } 37 return SYS_ERR_OK; 38} 39 40errval_t nsb_wait_s(char *s1, char *s2) 41{ 42 errval_t err; 43 int name_len = strlen(s1) + strlen(s2) + 2; 44 char serv_name[name_len]; 45 46 snprintf(serv_name, name_len, "%s.%s", s1, s2); 47 err = nameservice_blocking_lookup(serv_name, NULL); 48 if (err_is_fail(err)) { 49 return err_push(err, DIST_ERR_NS_LOOKUP); 50 } 51 return SYS_ERR_OK; 52} 53 54errval_t nsb_wait_ready(char *name) 55{ 56 return nsb_wait_s(name, READY_SUFFIX); 57} 58 59errval_t nsb_wait(char *name) 60{ 61 errval_t err; 62 err = nameservice_blocking_lookup(name, NULL); 63 if (err_is_fail(err)) { 64 return err_push(err, DIST_ERR_NS_LOOKUP); 65 } 66 return SYS_ERR_OK; 67} 68 69errval_t nsb_register(char *name) 70{ 71 errval_t err; 72 err = nameservice_register(name, 0); 73 if (err_is_fail(err)) { 74 return err_push(err, DIST_ERR_NS_REG); 75 } 76 return SYS_ERR_OK; 77} 78 79errval_t nsb_register_n(int n, char *name) 80{ 81 errval_t err; 82 int name_len = strlen(name) + EXTRA_NAME_LEN + READY_LEN; 83 char serv_name[name_len]; 84 snprintf(serv_name, name_len, "%s.%d.%s", name, n, READY_SUFFIX); 85 err = nameservice_register(serv_name, 0); 86 if (err_is_fail(err)) { 87 return err_push(err, DIST_ERR_NS_REG); 88 } 89 return SYS_ERR_OK; 90} 91 92errval_t nsb_register_s(char *s1, char *s2) 93{ 94 errval_t err; 95 int name_len = strlen(s1) + strlen(s2) + 2; 96 char serv_name[name_len]; 97 snprintf(serv_name, name_len, "%s.%s", s1, s2); 98 err = nameservice_register(serv_name, 0); 99 if (err_is_fail(err)) { 100 return err_push(err, DIST_ERR_NS_REG); 101 } 102 return SYS_ERR_OK; 103} 104 105errval_t nsb_register_ready(char *name) 106{ 107 return nsb_register_s(name, READY_SUFFIX); 108} 109 110errval_t nsb_master(int min, int max, char *name) 111{ 112 errval_t err; 113 int name_len = strlen(name) + EXTRA_NAME_LEN + READY_LEN; 114 char serv_name[name_len]; 115 for (int i = min; i <= max; i++) { 116 snprintf(serv_name, name_len, "%s.%d.%s", name, i, READY_SUFFIX); 117 err = nameservice_blocking_lookup(serv_name, NULL); 118 if (err_is_fail(err)) { 119 return err_push(err, DIST_ERR_NS_LOOKUP); } 120 } 121 122 snprintf(serv_name, name_len, "%s.%s", name, READY_SUFFIX); 123 err = nameservice_register(serv_name, 0); 124 if (err_is_fail(err)) { 125 return err_push(err, DIST_ERR_NS_REG); 126 } 127 128 return SYS_ERR_OK; 129} 130 131errval_t nsb_master_l(coreid_t *cores, int n_cores, char *name) 132{ 133 assert(cores != NULL); 134 assert(n_cores > 0); 135 136 errval_t err; 137 int name_len = strlen(name) + EXTRA_NAME_LEN + READY_LEN; 138 char serv_name[name_len]; 139 for (int i = 0; i < n_cores; i++) { 140 snprintf(serv_name, name_len, "%s.%d.%s", name, cores[i], READY_SUFFIX); 141 err = nameservice_blocking_lookup(serv_name, NULL); 142 if (err_is_fail(err)) { 143 return err_push(err, DIST_ERR_NS_LOOKUP); 144 } 145 } 146 147 snprintf(serv_name, name_len, "%s.%s", name, READY_SUFFIX); 148 err = nameservice_register(serv_name, 0); 149 if (err_is_fail(err)) { 150 return err_push(err, DIST_ERR_NS_REG); 151 } 152 153 return SYS_ERR_OK; 154} 155 156errval_t nsb_worker(int num, char *name) 157{ 158 errval_t err; 159 int name_len = strlen(name) + EXTRA_NAME_LEN + READY_LEN; 160 char serv_name[name_len]; 161 snprintf(serv_name, name_len, "%s.%d.%s", name, num, READY_SUFFIX); 162 err = nameservice_register(serv_name, 0); 163 if (err_is_fail(err)) { 164 return err_push(err, DIST_ERR_NS_REG); 165 } 166 167 snprintf(serv_name, name_len, "%s.%s", name, READY_SUFFIX); 168 err = nameservice_blocking_lookup(serv_name, NULL); 169 if (err_is_fail(err)) { 170 return err_push(err, DIST_ERR_NS_LOOKUP); 171 } 172 173 return SYS_ERR_OK; 174} 175 176 177