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