int benchmark_initrun() { b = barrier_create(lm_optP * lm_optT * (lm_optB + 1), 0); return (0); }
static int enter_request_cb (flux_t h, int typemask, zmsg_t **zmsg, void *arg) { ctx_t *ctx = arg; barrier_t *b; json_object *o = NULL; char *sender = NULL; const char *name; int count, nprocs, hopcount; if (flux_msg_decode (*zmsg, NULL, &o) < 0 || o == NULL || !(sender = flux_msg_sender (*zmsg)) || util_json_object_get_string (o, "name", &name) < 0 || util_json_object_get_int (o, "count", &count) < 0 || util_json_object_get_int (o, "nprocs", &nprocs) < 0) { flux_log (ctx->h, LOG_ERR, "%s: ignoring bad message", __FUNCTION__); goto done; } if (!(b = zhash_lookup (ctx->barriers, name))) b = barrier_create (ctx, name, nprocs); /* Distinguish client (tracked) vs downstream barrier plugin (untracked). * A client, distinguished by hopcount > 0, can only enter barrier once. */ if (util_json_object_get_int (o, "hopcount", &hopcount) < 0) { if (barrier_add_client (b, sender, zmsg) < 0) { flux_respond_errnum (ctx->h, zmsg, EEXIST); flux_log (ctx->h, LOG_ERR, "abort %s due to double entry by client %s", name, sender); if (exit_event_send (ctx->h, b->name, ECONNABORTED) < 0) flux_log (ctx->h, LOG_ERR, "exit_event_send: %s", strerror (errno)); goto done; } } /* If the count has been reached, terminate the barrier; * o/w set timer to pass count upstream and zero it here. */ b->count += count; if (b->count == b->nprocs) { if (exit_event_send (ctx->h, b->name, 0) < 0) flux_log (ctx->h, LOG_ERR, "exit_event_send: %s", strerror (errno)); } else if (!flux_treeroot (ctx->h) && !ctx->timer_armed) { if (flux_tmouthandler_add (h, barrier_reduction_timeout_msec, true, timeout_cb, ctx) < 0) { flux_log (h, LOG_ERR, "flux_tmouthandler_add: %s",strerror (errno)); goto done; } ctx->timer_armed = true; } done: if (o) json_object_put (o); if (*zmsg) zmsg_destroy (zmsg); if (sender) free (sender); return 0; }
int main() { pthread_t t[N]; int args[N], i; b = barrier_create(N); for(i=0; i<N; i++) { args[i] = i; pthread_create(&t[i], 0, f, &args[i]); } for(i=0; i<N; i++) pthread_join(t[i], NULL); barrier_free(b); return 0; }
static void enter_request_cb (flux_t *h, flux_msg_handler_t *w, const flux_msg_t *msg, void *arg) { ctx_t *ctx = arg; barrier_t *b; json_object *o = NULL; char *sender = NULL; const char *name; int count, nprocs, hopcount; const char *json_str; if (flux_request_decode (msg, NULL, &json_str) < 0 || flux_msg_get_route_first (msg, &sender) < 0) { flux_log_error (ctx->h, "%s: decoding request", __FUNCTION__); goto done; } if (!(o = Jfromstr (json_str)) || !Jget_str (o, "name", &name) || !Jget_int (o, "count", &count) || !Jget_int (o, "nprocs", &nprocs)) { errno = EPROTO; flux_log_error (ctx->h, "%s: decoding request", __FUNCTION__); goto done; } if (!(b = zhash_lookup (ctx->barriers, name))) b = barrier_create (ctx, name, nprocs); /* Distinguish client (tracked) vs downstream barrier plugin (untracked). * A client, distinguished by hopcount > 0, can only enter barrier once. */ if (!Jget_int (o, "hopcount", &hopcount)) { if (barrier_add_client (b, sender, msg) < 0) { flux_respond (ctx->h, msg, EEXIST, NULL); flux_log (ctx->h, LOG_ERR, "abort %s due to double entry by client %s", name, sender); if (exit_event_send (ctx->h, b->name, ECONNABORTED) < 0) flux_log_error (ctx->h, "exit_event_send"); goto done; } } /* If the count has been reached, terminate the barrier; * o/w set timer to pass count upstream and zero it here. */ b->count += count; if (b->count == b->nprocs) { if (exit_event_send (ctx->h, b->name, 0) < 0) flux_log_error (ctx->h, "exit_event_send"); } else if (ctx->rank > 0 && !ctx->timer_armed) { flux_timer_watcher_reset (ctx->timer, barrier_reduction_timeout_sec, 0.); flux_watcher_start (ctx->timer); ctx->timer_armed = true; } done: if (o) json_object_put (o); if (sender) free (sender); }