/** @brief Pop something from the message exchange queue, with a timeout. * * @see #xbt_queue_pop * */ void xbt_queue_pop_timed(xbt_queue_t queue, void *const dst, double delay) { double begin = xbt_time(); xbt_mutex_acquire(queue->mutex); if (delay == 0) { if (xbt_dynar_is_empty(queue->data)) { xbt_mutex_release(queue->mutex); THROWF(timeout_error, 0, "Delay = 0, and queue is empty"); } } else { while ((xbt_dynar_is_empty(queue->data)) && (delay < 0 || (xbt_time() - begin) <= delay)) { XBT_DEBUG("Queue %p empty. Waiting", queue); TRY { xbt_cond_timedwait(queue->not_empty, queue->mutex, delay < 0 ? -1 : delay - (xbt_time() - begin)); } CATCH_ANONYMOUS { xbt_mutex_release(queue->mutex); RETHROW; } } } xbt_dynar_pop(queue->data, dst); xbt_cond_signal(queue->not_full); xbt_mutex_release(queue->mutex); }
/* Connect entry tasks to 'root', and exit tasks to 'end'*/ xbt_dynar_foreach (result, i, task){ if (xbt_dynar_is_empty(task->tasks_before) && task != root) { XBT_DEBUG("Task '%s' has no source. Add dependency from 'root'", task->name); SD_task_dependency_add(nullptr, nullptr, root, task); } if (xbt_dynar_is_empty(task->tasks_after) && task != end) { XBT_DEBUG("Task '%s' has no destination. Add dependency to 'end'", task->name); SD_task_dependency_add(nullptr, nullptr, task, end); } }
ActionPtr NetworkCm02Model::communicate(RoutingEdgePtr src, RoutingEdgePtr dst, double size, double rate) { unsigned int i; void *_link; NetworkCm02LinkPtr link; int failed = 0; NetworkCm02ActionPtr action = NULL; double bandwidth_bound; double latency = 0.0; xbt_dynar_t back_route = NULL; int constraints_per_variable = 0; xbt_dynar_t route = xbt_dynar_new(sizeof(RoutingEdgePtr), NULL); XBT_IN("(%s,%s,%g,%g)", src->getName(), dst->getName(), size, rate); routing_platf->getRouteAndLatency(src, dst, &route, &latency); xbt_assert(!xbt_dynar_is_empty(route) || latency, "You're trying to send data from %s to %s but there is no connection at all between these two hosts.", src->getName(), dst->getName()); xbt_dynar_foreach(route, i, _link) { link = static_cast<NetworkCm02LinkPtr>(_link); if (link->getState() == SURF_RESOURCE_OFF) { failed = 1; break; } }
JNIEXPORT void JNICALL JNICALL Java_org_simgrid_msg_Msg_run(JNIEnv * env, jclass cls) { /* Run everything */ XBT_DEBUG("Ready to run MSG_MAIN"); msg_error_t rv = MSG_main(); XBT_DEBUG("Done running MSG_MAIN"); jxbt_check_res("MSG_main()", rv, MSG_OK, xbt_strdup("unexpected error : MSG_main() failed .. please report this bug ")); XBT_INFO("MSG_main finished; Cleaning up the simulation..."); /* Cleanup java hosts */ xbt_dynar_t hosts = MSG_hosts_as_dynar(); for (unsigned long index = 0; index < xbt_dynar_length(hosts) - 1; index++) { msg_host_t msg_host = xbt_dynar_get_as(hosts,index,msg_host_t); jobject jhost = (jobject) msg_host->extension(JAVA_HOST_LEVEL); if (jhost) jhost_unref(env, jhost); } xbt_dynar_free(&hosts); /* Cleanup java storages */ xbt_dynar_t storages = MSG_storages_as_dynar(); if(!xbt_dynar_is_empty(storages)){ for (unsigned long index = 0; index < xbt_dynar_length(storages) - 1; index++) { jobject jstorage = (jobject) xbt_lib_get_level(xbt_dynar_get_as(storages,index,msg_storage_t), JAVA_STORAGE_LEVEL); if (jstorage) jstorage_unref(env, jstorage); } } xbt_dynar_free(&storages); }
/** \brief Insert \e data under all the keys contained in \e keys, providing their sizes in \e lens. * * \arg mdict: the multi-dict * \arg keys: dynar of (char *) containing all the keys * \arg lens: length of each element of \e keys * \arg data: where to put what was found in structure * \arg free_ctn: function to use to free the pushed content on need * * Dynars are not modified during the operation. */ void *xbt_multidict_get_ext(xbt_dict_t mdict, xbt_dynar_t keys, xbt_dynar_t lens) { xbt_dict_t thislevel, nextlevel; int i; unsigned long int thislen; char *thiskey; int keys_len = xbt_dynar_length(keys); xbt_assert(xbt_dynar_length(keys) == xbt_dynar_length(lens)); xbt_assert(!xbt_dynar_is_empty(keys), "Can't get a zero-long key set in a multidict"); XBT_DEBUG("xbt_multidict_get(%p, %ld)", mdict, xbt_dynar_length(keys)); for (i = 0, thislevel = mdict; i < keys_len - 1; i++, thislevel = nextlevel) { xbt_dynar_get_cpy(keys, i, &thiskey); xbt_dynar_get_cpy(lens, i, &thislen); XBT_DEBUG("multi_get: at level %d (%p), len=%ld, key=%p |%*s|", i, thislevel, thislen, thiskey, (int) thislen, thiskey); /* search the dict of next level: let mismatch raise if not found */ nextlevel = xbt_dict_get_ext(thislevel, thiskey, thislen); } xbt_dynar_get_cpy(keys, i, &thiskey); xbt_dynar_get_cpy(lens, i, &thislen); return xbt_dict_get_ext(thislevel, thiskey, thislen); }
static void model_rulebased_parse_route(AS_t rc, sg_platf_route_cbarg_t route) { char *src = (char*)(route->src); char *dst = (char*)(route->dst); AS_rulebased_t routing = (AS_rulebased_t) rc; rule_route_t ruleroute = xbt_new0(s_rule_route_t, 1); const char *error; int erroffset; if(!strcmp(rc->model_desc->name,"Vivaldi")){ if(!xbt_dynar_is_empty(route->link_list)) xbt_die("You can't have link_ctn with Model Vivaldi."); } ruleroute->re_src = pcre_compile(src, 0, &error, &erroffset, NULL); xbt_assert(ruleroute->re_src, "PCRE compilation failed at offset %d (\"%s\"): %s\n", erroffset, src, error); ruleroute->re_dst = pcre_compile(dst, 0, &error, &erroffset, NULL); xbt_assert(ruleroute->re_src, "PCRE compilation failed at offset %d (\"%s\"): %s\n", erroffset, dst, error); ruleroute->re_str_link = route->link_list; route->link_list = NULL; // Don't free it twice in each container xbt_dynar_push(routing->list_route, &ruleroute); }
/** * Garbage collector :D */ static void garbageCollector(xbt_dynar_t dax) { while (!xbt_dynar_is_empty(dax)) { SD_task_t task = xbt_dynar_pop_as(dax, SD_task_t); SD_task_destroy(task); } xbt_dynar_free(&dax); SD_exit(); }
/** Sender function */ int sender(int argc, char *argv[]) { long number_of_tasks = atol(argv[1]); double task_comp_size = atof(argv[2]); double task_comm_size = atof(argv[3]); long receivers_count = atol(argv[4]); int diff_com = atol(argv[5]); double coef = 0; xbt_dynar_t d = xbt_dynar_new(sizeof(msg_comm_t), NULL); int i; msg_task_t task; char mailbox[256]; char sprintf_buffer[256]; msg_comm_t comm; for (i = 0; i < number_of_tasks; i++) { if (diff_com == 0) coef = 1; else coef = (i + 1); sprintf(mailbox, "receiver-%ld", (i % receivers_count)); sprintf(sprintf_buffer, "Task_%d", i); task = MSG_task_create(sprintf_buffer, task_comp_size, task_comm_size / coef, NULL); comm = MSG_task_isend(task, mailbox); xbt_dynar_push_as(d, msg_comm_t, comm); XBT_INFO("Send to receiver-%ld %s comm_size %f", i % receivers_count, sprintf_buffer, task_comm_size / coef); } /* Here we are waiting for the completion of all communications */ while (!xbt_dynar_is_empty(d)) { xbt_dynar_remove_at(d, MSG_comm_waitany(d), &comm); MSG_comm_destroy(comm); } xbt_dynar_free(&d); /* Here we are waiting for the completion of all tasks */ sprintf(mailbox, "finalize"); msg_comm_t res_irecv; _XBT_GNUC_UNUSED msg_error_t res_wait; for (i = 0; i < receivers_count; i++) { task = NULL; res_irecv = MSG_task_irecv(&(task), mailbox); res_wait = MSG_comm_wait(res_irecv, -1); xbt_assert(res_wait == MSG_OK, "MSG_comm_wait failed"); MSG_comm_destroy(res_irecv); MSG_task_destroy(task); } XBT_INFO("Goodbye now!"); return 0; } /* end_of_sender */
static void smx_ctx_cojava_runall(void) { cojava_processes = SIMIX_process_get_runnable(); smx_process_t process; if (!xbt_dynar_is_empty(cojava_processes)) { process = xbt_dynar_get_as(cojava_processes, 0, smx_process_t); cojava_process_index = 1; /* Execute the first process */ smx_ctx_cojava_resume(SIMIX_process_get_context(process)); } }
int main(int argc, char **argv) { unsigned int ctr; SD_task_t task; xbt_dynar_t changed_tasks; SD_init(&argc, argv); SD_create_environment(argv[1]); const sg_host_t *hosts = sg_host_list(); SD_task_t t1 = SD_task_create_comp_seq("t1", NULL, 25000000); SD_task_t c1 = SD_task_create_comm_e2e("c1", NULL, 125000000); SD_task_t t2 = SD_task_create_comp_seq("t2", NULL, 25000000); SD_task_t c2 = SD_task_create_comm_e2e("c2", NULL, 62500000); SD_task_t t3 = SD_task_create_comp_seq("t3", NULL, 25000000); SD_task_t c3 = SD_task_create_comm_e2e("c3", NULL, 31250000); SD_task_t t4 = SD_task_create_comp_seq("t4", NULL, 25000000); /* Add dependencies: t1->c1->t2->c2->t3 */ SD_task_dependency_add(NULL, NULL, t1, c1); SD_task_dependency_add(NULL, NULL, c1, t2); SD_task_dependency_add(NULL, NULL, t2, c2); SD_task_dependency_add(NULL, NULL, c2, t3); SD_task_dependency_add(NULL, NULL, t3, c3); SD_task_dependency_add(NULL, NULL, c3, t4); /* Schedule tasks t1 and w3 on first host, t2 on second host */ /* Transfers are auto-scheduled */ SD_task_schedulel(t1, 1, hosts[0]); SD_task_schedulel(t2, 1, hosts[1]); SD_task_schedulel(t3, 1, hosts[0]); SD_task_schedulel(t4, 1, hosts[1]); /* Add some watchpoint upon task completion */ SD_task_watch(t1, SD_DONE); SD_task_watch(c1, SD_DONE); SD_task_watch(t2, SD_DONE); SD_task_watch(c2, SD_DONE); SD_task_watch(t3, SD_DONE); SD_task_watch(c3, SD_DONE); SD_task_watch(t4, SD_DONE); while (!xbt_dynar_is_empty((changed_tasks = SD_simulate(-1.0)))) { XBT_INFO("link1: bw=%.0f, lat=%f", SD_route_get_bandwidth(hosts[0], hosts[1]), SD_route_get_latency(hosts[0], hosts[1])); XBT_INFO("Jupiter: speed=%.0f", sg_host_speed(hosts[0])* sg_host_get_available_speed(hosts[0])); XBT_INFO("Tremblay: speed=%.0f", sg_host_speed(hosts[1])* sg_host_get_available_speed(hosts[1])); xbt_dynar_foreach(changed_tasks, ctr, task) { XBT_INFO("Task '%s' start time: %f, finish time: %f", SD_task_get_name(task), SD_task_get_start_time(task), SD_task_get_finish_time(task)); if (SD_task_get_state(task)==SD_DONE) SD_task_destroy(task); } }
/** @brief Pop something from the message exchange queue. * * This is blocking if the queue is empty. * * @see #xbt_dynar_pop * */ void xbt_queue_pop(xbt_queue_t queue, void *const dst) { xbt_mutex_acquire(queue->mutex); while (xbt_dynar_is_empty(queue->data)) { XBT_DEBUG("Queue %p empty. Waiting", queue); xbt_cond_wait(queue->not_empty, queue->mutex); } xbt_dynar_pop(queue->data, dst); xbt_cond_signal(queue->not_full); xbt_mutex_release(queue->mutex); }
/** @brief helper function to close a file descriptor */ void process_close_call(process_descriptor_t * proc, int fd) { fd_descriptor_t *file_desc = process_descriptor_get_fd(proc, fd); if (file_desc != NULL) { file_desc->refcount++; if (file_desc->type == FD_SOCKET) socket_close(proc, fd); else { if (file_desc->type == FD_PIPE) { pipe_t *pipe = file_desc->pipe; xbt_assert(pipe != NULL); unsigned int cpt_in; pipe_end_t end_in; xbt_dynar_t read_end = pipe->read_end; xbt_dynar_foreach(read_end, cpt_in, end_in) { if (end_in->fd == fd && end_in->proc->pid == proc->pid) { xbt_dynar_remove_at(read_end, cpt_in, NULL); cpt_in--; } } unsigned int cpt_out; pipe_end_t end_out; xbt_dynar_t write_end = pipe->write_end; xbt_dynar_foreach(write_end, cpt_out, end_out) { if (end_out->fd == fd && end_out->proc->pid == proc->pid) { xbt_dynar_remove_at(write_end, cpt_out, NULL); cpt_out--; } } // if both sides are closed we can free the pipe if (xbt_dynar_is_empty(read_end) && xbt_dynar_is_empty(write_end)) { xbt_dynar_free(&read_end); xbt_dynar_free(&write_end); free(pipe); } } }
void rctx_wait_bg(void) { /* Do not use xbt_dynar_free or it will lock the dynar, preventing armageddon * from working */ while (!xbt_dynar_is_empty(bg_jobs)) { rctx_t rctx = xbt_dynar_getlast_as(bg_jobs, rctx_t); wait_it(rctx); xbt_dynar_pop(bg_jobs, &rctx); rctx_free(rctx); } xbt_dynar_reset(bg_jobs); }
static char *TRACE_smpi_get_key(int src, int dst, char *key, int n) { char aux[INSTR_DEFAULT_STR_SIZE]; snprintf(aux, INSTR_DEFAULT_STR_SIZE, "%d#%d", src, dst); xbt_dynar_t d = xbt_dict_get_or_null(keys, aux); xbt_assert(!xbt_dynar_is_empty(d), "Trying to get a link key (for message reception) that has no corresponding send (%s).", __FUNCTION__); char *s = xbt_dynar_get_as (d, 0, char *); snprintf (key, n, "%s", s); xbt_dynar_remove_at (d, 0, NULL); return key; }
int main(int argc, char **argv) { unsigned int ctr; SD_task_t task; xbt_dynar_t changed_tasks; SD_init(&argc, argv); xbt_assert(argc > 1, "Usage: %s platform_file\n\nExample: %s two_clusters.xml", argv[0], argv[0]); SD_create_environment(argv[1]); sg_host_t *hosts = sg_host_list(); /* creation of some typed tasks and their dependencies */ /* chain of five tasks, three compute tasks with two data transfers in between */ SD_task_t taskA = SD_task_create_comp_seq("Task A", NULL, 5e9); SD_task_t taskB = SD_task_create_comm_e2e("Task B", NULL, 1e7); SD_task_t taskC = SD_task_create_comp_seq("Task C", NULL, 5e9); SD_task_t taskD = SD_task_create_comm_e2e("Task D", NULL, 1e7); SD_task_t taskE = SD_task_create_comp_seq("Task E", NULL, 5e9); SD_task_dependency_add(NULL, NULL, taskA, taskB); SD_task_dependency_add(NULL, NULL, taskB, taskC); SD_task_dependency_add(NULL, NULL, taskC, taskD); SD_task_dependency_add(NULL, NULL, taskD, taskE); /* Add watchpoints on completion of compute tasks */ SD_task_watch(taskA, SD_DONE); SD_task_watch(taskC, SD_DONE); SD_task_watch(taskE, SD_DONE); /* Auto-schedule the compute tasks on three different workstations */ /* Data transfer tasks taskB and taskD are automagically scheduled */ SD_task_schedulel(taskA, 1, hosts[0]); SD_task_schedulel(taskC, 1, hosts[1]); SD_task_schedulel(taskE, 1, hosts[0]); while (!xbt_dynar_is_empty((changed_tasks = SD_simulate(-1.0)))) { XBT_INFO("Simulation stopped after %.4f seconds", SD_get_clock()); xbt_dynar_foreach(changed_tasks, ctr, task) { XBT_INFO("Task '%s' start time: %f, finish time: %f", SD_task_get_name(task), SD_task_get_start_time(task), SD_task_get_finish_time(task)); } /* let throttle the communication for taskD if its parent is SD_DONE */ /* the bandwidth is 1.25e8, the data size is 1e7, and we want to throttle the bandwidth by a factor 2. * The rate is then 1.25e8/(2*1e7)=6.25 * Changing the rate is possible before the task execution starts (in SD_RUNNING state). */ if (SD_task_get_state(taskC) == SD_DONE && SD_task_get_state(taskD) < SD_RUNNING) SD_task_set_rate(taskD, 6.25); }
static double finish_on_at(SD_task_t task, sg_host_t host) { double result; unsigned int i; double data_available = 0.; double redist_time = 0; double last_data_available; xbt_dynar_t parents = SD_task_get_parents(task); if (!xbt_dynar_is_empty(parents)) { /* compute last_data_available */ SD_task_t parent; last_data_available = -1.0; xbt_dynar_foreach(parents, i, parent) { /* normal case */ if (SD_task_get_kind(parent) == SD_TASK_COMM_E2E) { xbt_dynar_t grand_parents = SD_task_get_parents(parent); SD_task_t grand_parent; xbt_assert(xbt_dynar_length(grand_parents) <2, "Error: transfer %s has 2 parents", SD_task_get_name(parent)); xbt_dynar_get_cpy(grand_parents, 0, &grand_parent); sg_host_t * grand_parent_host_list = SD_task_get_workstation_list(grand_parent); /* Estimate the redistribution time from this parent */ if (SD_task_get_amount(parent) <= 1e-6){ redist_time= 0; } else { redist_time = SD_route_get_latency(grand_parent_host_list[0], host) + SD_task_get_amount(parent) / SD_route_get_bandwidth(grand_parent_host_list[0], host); } data_available = SD_task_get_finish_time(grand_parent) + redist_time; xbt_dynar_free_container(&grand_parents); } /* no transfer, control dependency */ if (SD_task_get_kind(parent) == SD_TASK_COMP_SEQ) { data_available = SD_task_get_finish_time(parent); } if (last_data_available < data_available) last_data_available = data_available; } xbt_dynar_free_container(&parents); result = MAX(sg_host_get_available_at(host), last_data_available) + SD_task_get_amount(task)/sg_host_speed(host); } else {
void AsFloyd::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t res, double *lat) { /* set utils vars */ size_t table_size = xbt_dynar_length(p_indexNetworkElm); this->srcDstCheck(src, dst); /* create a result route */ xbt_dynar_t route_stack = xbt_dynar_new(sizeof(sg_platf_route_cbarg_t), NULL); int pred; int cur = dst->getId(); do { pred = TO_FLOYD_PRED(src->getId(), cur); if (pred == -1) THROWF(arg_error, 0, "No route from '%s' to '%s'", src->getName(), dst->getName()); xbt_dynar_push_as(route_stack, sg_platf_route_cbarg_t, TO_FLOYD_LINK(pred, cur)); cur = pred; } while (cur != src->getId()); if (p_hierarchy == SURF_ROUTING_RECURSIVE) { res->gw_src = xbt_dynar_getlast_as(route_stack, sg_platf_route_cbarg_t)->gw_src; res->gw_dst = xbt_dynar_getfirst_as(route_stack, sg_platf_route_cbarg_t)->gw_dst; } sg_routing_edge_t prev_dst_gw = NULL; while (!xbt_dynar_is_empty(route_stack)) { sg_platf_route_cbarg_t e_route = xbt_dynar_pop_as(route_stack, sg_platf_route_cbarg_t); xbt_dynar_t links; void *link; unsigned int cpt; if (p_hierarchy == SURF_ROUTING_RECURSIVE && prev_dst_gw != NULL && strcmp(prev_dst_gw->getName(), e_route->gw_src->getName())) { routing_get_route_and_latency(prev_dst_gw, e_route->gw_src, &res->link_list, lat); } links = e_route->link_list; xbt_dynar_foreach(links, cpt, link) { xbt_dynar_push_as(res->link_list, sg_routing_link_t, link); if (lat) *lat += static_cast<NetworkLinkPtr>(link)->getLatency(); } prev_dst_gw = e_route->gw_dst; }
/** Receiver function */ int receiver(int argc, char *argv[]) { int id = -1; int i; char mailbox[80]; xbt_dynar_t comms = xbt_dynar_new(sizeof(msg_comm_t), NULL); int tasks = atof(argv[2]); msg_task_t *task = xbt_new(msg_task_t, tasks); _XBT_GNUC_UNUSED int read; read = sscanf(argv[1], "%d", &id); xbt_assert(read, "Invalid argument %s\n", argv[1]); sprintf(mailbox, "receiver-%d", id); MSG_process_sleep(10); msg_comm_t res_irecv; for (i = 0; i < tasks; i++) { XBT_INFO("Wait to receive task %d", i); task[i] = NULL; res_irecv = MSG_task_irecv(&task[i], mailbox); xbt_dynar_push_as(comms, msg_comm_t, res_irecv); } /* Here we are waiting for the receiving of all communications */ msg_task_t task_com; while (!xbt_dynar_is_empty(comms)) { _XBT_GNUC_UNUSED msg_error_t err; xbt_dynar_remove_at(comms, MSG_comm_waitany(comms), &res_irecv); task_com = MSG_comm_get_task(res_irecv); MSG_comm_destroy(res_irecv); XBT_INFO("Processing \"%s\"", MSG_task_get_name(task_com)); MSG_task_execute(task_com); XBT_INFO("\"%s\" done", MSG_task_get_name(task_com)); err = MSG_task_destroy(task_com); xbt_assert(err == MSG_OK, "MSG_task_destroy failed"); } xbt_dynar_free(&comms); xbt_free(task); /* Here we tell to sender that all tasks are done */ sprintf(mailbox, "finalize"); res_irecv = MSG_task_isend(MSG_task_create(NULL, 0, 0, NULL), mailbox); MSG_comm_wait(res_irecv, -1); MSG_comm_destroy(res_irecv); XBT_INFO("I'm done. See you!"); return 0; } /* end_of_receiver */
static int coordinator(int argc, char *argv[]) { int CS_used = 0; msg_task_t task = NULL, answer = NULL; xbt_dynar_t requests = xbt_dynar_new(sizeof(char *), NULL); char *req; while(1){ MSG_task_receive(&task, "coordinator"); const char *kind = MSG_task_get_name(task); if (!strcmp(kind, "request")) { req = MSG_task_get_data(task); if (CS_used) { XBT_INFO("CS already used. Queue the request."); xbt_dynar_push(requests, &req); } else { if(strcmp(req, "1") != 0){ XBT_INFO("CS idle. Grant immediatly"); answer = MSG_task_create("grant", 0, 1000, NULL); MSG_task_send(answer, req); CS_used = 1; answer = NULL; } } } else { if (!xbt_dynar_is_empty(requests)) { XBT_INFO("CS release. Grant to queued requests (queue size: %lu)", xbt_dynar_length(requests)); xbt_dynar_shift(requests, &req); if(strcmp(req, "1") != 0){ MSG_task_send(MSG_task_create("grant", 0, 1000, NULL), req); }else{ xbt_dynar_push(requests, &req); CS_used = 0; } }else{ XBT_INFO("CS release. resource now idle"); CS_used = 0; } } MSG_task_destroy(task); task = NULL; kind = NULL; req = NULL; } return 0; }
static int sender(int argc, char *argv[]) { xbt_assert(argc==6, "This function expects 5 parameters from the XML deployment file"); long number_of_tasks = xbt_str_parse_int(argv[1], "Invalid amount of tasks: %s"); double task_comp_size = xbt_str_parse_double(argv[2], "Invalid computational size: %s"); double task_comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s"); long receivers_count = xbt_str_parse_int(argv[4], "Invalid amount of receivers: %s"); int diff_com = xbt_str_parse_int(argv[5], "Invalid value for diff_comm: %s"); xbt_dynar_t comms = xbt_dynar_new(sizeof(msg_comm_t), NULL); /* First pack the communications in the dynar */ for (int i = 0; i < number_of_tasks; i++) { double coef = (diff_com == 0) ? 1 : (i + 1); char mailbox[80]; char taskname[80]; snprintf(mailbox,79, "receiver-%ld", (i % receivers_count)); snprintf(taskname,79, "Task_%d", i); msg_task_t task = MSG_task_create(taskname, task_comp_size, task_comm_size / coef, NULL); msg_comm_t comm = MSG_task_isend(task, mailbox); xbt_dynar_push_as(comms, msg_comm_t, comm); XBT_INFO("Send to receiver-%ld %s comm_size %f", i % receivers_count, taskname, task_comm_size / coef); } /* Here we are waiting for the completion of all communications */ while (xbt_dynar_is_empty(comms) == 0) { msg_comm_t comm; xbt_dynar_remove_at(comms, MSG_comm_waitany(comms), &comm); MSG_comm_destroy(comm); } xbt_dynar_free(&comms); /* Here we are waiting for the completion of all tasks */ for (int i = 0; i < receivers_count; i++) { msg_task_t task = NULL; msg_comm_t comm = MSG_task_irecv(&task, "finalize"); msg_error_t res_wait = MSG_comm_wait(comm, -1); xbt_assert(res_wait == MSG_OK, "MSG_comm_wait failed"); MSG_comm_destroy(comm); MSG_task_destroy(task); } XBT_INFO("Goodbye now!"); return 0; }
/** @brief When reaching EOF, check whether we are in an include tag, and behave accordingly if yes * * This function is called automatically by sedding the parser in tools/cmake/MaintainerMode.cmake * Every FAIL on "Premature EOF" is preceded by a call to this function, which role is to restore the * previous buffer if we reached the EOF /of an include file/. Its return code is used to avoid the * error message in that case. * * Yeah, that's terribly hackish, but it works. A better solution should be dealed with in flexml * directly: a command line flag could instruct it to do the correct thing when #include is encountered * on a line. One day maybe, if the maya allow it. */ int ETag_surfxml_include_state(void) { fflush(nullptr); XBT_DEBUG("ETag_surfxml_include_state '%s'",A_surfxml_include_file); if(xbt_dynar_is_empty(surf_input_buffer_stack)) // nope, that's a true premature EOF. Let the parser die verbosely. return 0; // Yeah, we were in an <include> Restore state and proceed. fclose(surf_file_to_parse); xbt_dynar_pop(surf_file_to_parse_stack, &surf_file_to_parse); surf_parse_pop_buffer_state(); xbt_dynar_pop(surf_input_buffer_stack,&surf_input_buffer); // Restore the filename for error messages free(surf_parsed_filename); xbt_dynar_pop(surf_parsed_filename_stack,&surf_parsed_filename); return 1; }
static void model_rulebased_parse_ASroute(AS_t rc, sg_platf_route_cbarg_t route) { char *src = (char*)(route->src); char *dst = (char*)(route->dst); AS_rulebased_t routing = (AS_rulebased_t) rc; rule_route_extended_t ruleroute_e = xbt_new0(s_rule_route_extended_t, 1); const char *error; int erroffset; if(!strcmp(rc->model_desc->name,"Vivaldi")){ if(!xbt_dynar_is_empty(route->link_list)) xbt_die("You can't have link_ctn with Model Vivaldi."); } ruleroute_e->generic_rule_route.re_src = pcre_compile(src, 0, &error, &erroffset, NULL); xbt_assert(ruleroute_e->generic_rule_route.re_src, "PCRE compilation failed at offset %d (\"%s\"): %s\n", erroffset, src, error); ruleroute_e->generic_rule_route.re_dst = pcre_compile(dst, 0, &error, &erroffset, NULL); xbt_assert(ruleroute_e->generic_rule_route.re_dst, "PCRE compilation failed at offset %d (\"%s\"): %s\n", erroffset, dst, error); ruleroute_e->generic_rule_route.re_str_link = route->link_list; // DIRTY PERL HACK AHEAD: with the rulebased routing, the {src,dst}_gateway fields // store the provided name instead of the entity directly (routing_parse_E_ASroute knows) // // This is because the user will provide something like "^AS_(.*)$" instead of the proper name of a given entity ruleroute_e->re_src_gateway = xbt_strdup((char *)route->gw_src); ruleroute_e->re_dst_gateway = xbt_strdup((char *)route->gw_dst); xbt_dynar_push(routing->list_ASroute, &ruleroute_e); /* make sure that they don't get freed */ route->link_list = NULL; route->gw_src = route->gw_dst = NULL; }
static int receiver(int argc, char *argv[]) { xbt_assert(argc==3, "This function expects 2 parameters from the XML deployment file"); int id = xbt_str_parse_int(argv[1], "ID should be numerical, not %s"); int task_amount = xbt_str_parse_int(argv[2], "Invalid amount of tasks: %s"); msg_task_t *tasks = xbt_new(msg_task_t, task_amount); xbt_dynar_t comms = xbt_dynar_new(sizeof(msg_comm_t), NULL); char mailbox[80]; snprintf(mailbox,79, "receiver-%d", id); MSG_process_sleep(10); for (int i = 0; i < task_amount; i++) { XBT_INFO("Wait to receive task %d", i); tasks[i] = NULL; msg_comm_t comm = MSG_task_irecv(&tasks[i], mailbox); xbt_dynar_push_as(comms, msg_comm_t, comm); } /* Here we are waiting for the receiving of all communications */ while (!xbt_dynar_is_empty(comms)) { msg_comm_t comm; // MSG_comm_waitany returns the rank of the comm that just ended. Remove it. xbt_dynar_remove_at(comms, MSG_comm_waitany(comms), &comm); msg_task_t task = MSG_comm_get_task(comm); MSG_comm_destroy(comm); XBT_INFO("Processing \"%s\"", MSG_task_get_name(task)); MSG_task_execute(task); XBT_INFO("\"%s\" done", MSG_task_get_name(task)); msg_error_t err = MSG_task_destroy(task); xbt_assert(err == MSG_OK, "MSG_task_destroy failed"); } xbt_dynar_free(&comms); xbt_free(tasks); /* Here we tell to sender that all tasks are done */ MSG_task_send(MSG_task_create(NULL, 0, 0, NULL), "finalize"); XBT_INFO("I'm done. See you!"); return 0; }
int main(int argc, char **argv) { xbt_os_timer_t timer = xbt_os_timer_new(); /* initialization of SD */ SD_init(&argc, argv); if (argc > 1) { SD_create_environment(argv[1]); } else { SD_create_environment("../../platforms/One_cluster_no_backbone.xml"); } ws_list = SD_workstation_get_list(); reclaimed = xbt_dynar_new(sizeof(bcast_task_t),xbt_free_ref); xbt_dynar_t done = NULL; xbt_os_cputimer_start(timer); send_one(0,SD_workstation_get_number()); do { if (done != NULL && !xbt_dynar_is_empty(done)) { unsigned int cursor; SD_task_t task; xbt_dynar_foreach(done, cursor, task) { bcast_task_t bt = SD_task_get_data(task); if (bt->i != bt->j -1) send_one(bt->i,bt->j); if (bt->j != bt->k -1) send_one(bt->j,bt->k); if (xbt_dynar_length(reclaimed)<100) { xbt_dynar_push_as(reclaimed,bcast_task_t,bt); } else { free(bt); } SD_task_destroy(task); } xbt_dynar_free(&done); }
int coordinator(int argc, char *argv[]) { xbt_dynar_t requests = xbt_dynar_new(sizeof(char *), NULL); // dynamic vector storing requests (which are char*) int CS_used = 0; // initially the CS is idle int todo = AMOUNT_OF_CLIENTS * CS_PER_PROCESS; // amount of releases we are expecting while (todo > 0) { msg_task_t task = NULL; MSG_task_receive(&task, "coordinator"); const char *kind = MSG_task_get_name(task); //is it a request or a release? if (!strcmp(kind, "request")) { // that's a request char *req = MSG_task_get_data(task); if (CS_used) { // need to push the request in the vector XBT_INFO("CS already used. Queue the request"); xbt_dynar_push(requests, &req); } else { // can serve it immediatly XBT_INFO("CS idle. Grant immediatly"); msg_task_t answer = MSG_task_create("grant", 0, 1000, NULL); MSG_task_send(answer, req); CS_used = 1; } } else { // that's a release. Check if someone was waiting for the lock if (!xbt_dynar_is_empty(requests)) { XBT_INFO("CS release. Grant to queued requests (queue size: %lu)", xbt_dynar_length(requests)); char *req; xbt_dynar_pop(requests, &req); MSG_task_send(MSG_task_create("grant", 0, 1000, NULL), req); todo--; } else { // nobody wants it XBT_INFO("CS release. resource now idle"); CS_used = 0; todo--; } } MSG_task_destroy(task); } XBT_INFO("Received all releases, quit now"); return 0; }
static void send_one(int from, int to) { //XBT_DEBUG("send_one(%d, %d)",from,to); if (count %100000 == 0) XBT_INFO("Sending task #%d",count); count++; bcast_task_t bt; if (!xbt_dynar_is_empty(reclaimed)) { bt = xbt_dynar_pop_as(reclaimed,bcast_task_t); } else { bt = xbt_new(s_bcast_task_t,1); } bt->i=from; bt->j=(from+to)/2; bt->k=to; SD_task_t task = SD_task_create_comm_e2e(NULL,bt,424242); XBT_DEBUG("Schedule task between %d and %d",bt->i,bt->j); SD_task_schedulel(task,2,ws_list[bt->i],ws_list[bt->j]); SD_task_watch(task,SD_DONE); }
int main(int argc, char **argv) { int i; const char *platform_file; const SD_workstation_t *workstations; int kind; SD_task_t task, taskA, taskB, taskC; xbt_dynar_t changed_tasks; SD_workstation_t workstation_list[2]; double computation_amount[2]; double communication_amount[4] = { 0 }; double rate = -1.0; SD_workstation_t w1, w2; /* SD initialization */ SD_init(&argc, argv); /* xbt_log_control_set("sd.thres=debug"); */ if (argc < 2) { XBT_INFO("Usage: %s platform_file", argv[0]); XBT_INFO("example: %s sd_platform.xml", argv[0]); exit(1); } /* creation of the environment */ platform_file = argv[1]; SD_create_environment(platform_file); /* Change the access mode of the workstations */ workstations = SD_workstation_get_list(); w1 = workstations[0]; w2 = workstations[1]; for (i = 0; i < 2; i++) { SD_workstation_set_access_mode(workstations[i], SD_WORKSTATION_SEQUENTIAL_ACCESS); XBT_INFO("Access mode of %s is %s", SD_workstation_get_name(workstations[i]), (SD_workstation_get_access_mode(workstations[i]) == SD_WORKSTATION_SEQUENTIAL_ACCESS) ? "sequential" : "shared"); } /* creation of the tasks and their dependencies */ taskA = SD_task_create_comp_seq("Task A", NULL, 2e9); taskB = SD_task_create_comm_e2e("Task B", NULL, 2e9); taskC = SD_task_create_comp_seq("Task C", NULL, 1e9); TRACE_category ("taskA"); TRACE_category ("taskB"); TRACE_category ("taskC"); TRACE_sd_set_task_category (taskA, "taskA"); TRACE_sd_set_task_category (taskB, "taskB"); TRACE_sd_set_task_category (taskC, "taskC"); /* if everything is ok, no exception is forwarded or rethrown by main() */ /* watch points */ SD_task_watch(taskA, SD_RUNNING); SD_task_watch(taskB, SD_RUNNING); SD_task_watch(taskC, SD_RUNNING); SD_task_watch(taskC, SD_DONE); /* scheduling parameters */ workstation_list[0] = w1; workstation_list[1] = w2; computation_amount[0] = SD_task_get_amount(taskA); computation_amount[1] = SD_task_get_amount(taskB); communication_amount[1] = SD_task_get_amount(taskC); communication_amount[2] = 0.0; SD_task_schedule(taskA, 1, &w1, &(computation_amount[0]), SD_SCHED_NO_COST, rate); SD_task_schedule(taskB, 2, workstation_list, SD_SCHED_NO_COST, communication_amount, rate); SD_task_schedule(taskC, 1, &w1, &(computation_amount[1]), SD_SCHED_NO_COST, rate); /* let's launch the simulation! */ while (!xbt_dynar_is_empty(changed_tasks = SD_simulate(-1.0))) { for (i = 0; i < 2; i++) { task = SD_workstation_get_current_task(workstations[i]); if (task) kind = SD_task_get_kind(task); else { XBT_INFO("There is no task running on %s", SD_workstation_get_name(workstations[i])); continue; } switch (kind) { case SD_TASK_COMP_SEQ: XBT_INFO("%s is currently running on %s (SD_TASK_COMP_SEQ)", SD_task_get_name(task), SD_workstation_get_name(workstations[i])); break; case SD_TASK_COMM_E2E: XBT_INFO("%s is currently running on %s (SD_TASK_COMM_E2E)", SD_task_get_name(task), SD_workstation_get_name(workstations[i])); break; case SD_TASK_NOT_TYPED: XBT_INFO("Task running on %s has no type", SD_workstation_get_name(workstations[i])); break; default: XBT_ERROR("Shouldn't be here"); } } xbt_dynar_free_container(&changed_tasks); } xbt_dynar_free_container(&changed_tasks); XBT_DEBUG("Destroying tasks..."); SD_task_destroy(taskA); SD_task_destroy(taskB); SD_task_destroy(taskC); XBT_DEBUG("Tasks destroyed. Exiting SimDag..."); SD_exit(); return 0; }
/** * \ingroup simix_comm_management */ int simcall_comm_testany(xbt_dynar_t comms) { if (xbt_dynar_is_empty(comms)) return -1; return simcall_BODY_comm_testany(comms); }
int main(int argc, char **argv) { int i; const char *platform_file; const SD_workstation_t *workstations; SD_task_t taskA, taskB, taskC, taskD; xbt_dynar_t changed_tasks; /* initialization of SD */ SD_init(&argc, argv); /* xbt_log_control_set("sd.thres=debug"); */ if (argc < 2) { XBT_INFO("Usage: %s platform_file", argv[0]); XBT_INFO("example: %s sd_platform.xml", argv[0]); exit(1); } /* creation of the environment */ platform_file = argv[1]; SD_create_environment(platform_file); /* Change the access mode of the workstations */ workstations = SD_workstation_get_list(); for (i = 0; i < 2; i++) { SD_workstation_dump(workstations[i]); SD_workstation_set_access_mode(workstations[i], SD_WORKSTATION_SEQUENTIAL_ACCESS); XBT_INFO(" Change access mode of %s to %s", SD_workstation_get_name(workstations[i]), (SD_workstation_get_access_mode(workstations[i]) == SD_WORKSTATION_SEQUENTIAL_ACCESS) ? "sequential" : "shared"); } /* Well I changed my mind, I want the second workstation to be shared */ SD_workstation_set_access_mode(workstations[1], SD_WORKSTATION_SHARED_ACCESS); XBT_INFO(" Change access mode of %s to %s", SD_workstation_get_name(workstations[1]), (SD_workstation_get_access_mode(workstations[1]) == SD_WORKSTATION_SEQUENTIAL_ACCESS) ? "sequential" : "shared"); /* creation of the tasks and their dependencies */ taskA = SD_task_create_comp_seq("Task A", NULL, 2e10); taskB = SD_task_create_comm_e2e("Task B", NULL, 2e8); taskC = SD_task_create_comp_seq("Task C", NULL, 1e10); taskD = SD_task_create_comp_seq("Task D", NULL, 1e11); SD_task_dependency_add("B->C", NULL,taskB, taskC); /* watch points */ SD_task_watch(taskA, SD_RUNNING); SD_task_watch(taskB, SD_RUNNING); SD_task_watch(taskC, SD_RUNNING); SD_task_watch(taskC, SD_DONE); SD_task_watch(taskD, SD_DONE); /* scheduling parameters */ SD_task_schedulel(taskA, 1, workstations[0]); SD_task_schedulel(taskB, 2, workstations[0], workstations[1]); SD_task_schedulel(taskC, 1, workstations[1]); SD_task_schedulel(taskD, 1, workstations[1]); /* let's launch the simulation! */ while (!xbt_dynar_is_empty(changed_tasks = SD_simulate(-1.0))) { XBT_INFO(" Simulation was suspended, check workstation states"); for (i = 0; i < 2; i++) { SD_workstation_dump(workstations[i]); } xbt_dynar_free(&changed_tasks); } xbt_dynar_free(&changed_tasks); XBT_DEBUG("Destroying tasks..."); SD_task_destroy(taskA); SD_task_destroy(taskB); SD_task_destroy(taskC); SD_task_destroy(taskD); XBT_DEBUG("Tasks destroyed. Exiting SimDag..."); SD_exit(); return 0; }
int main(int argc, char **argv){ int size; int rank; int recv_buff; MPI_Status status; xbt_dynar_t requests = xbt_dynar_new(sizeof(int), NULL); /* Initialize MPI */ int err = MPI_Init(&argc, &argv); if(err != MPI_SUCCESS){ printf("MPI initialization failed !\n"); exit(1); } MC_automaton_new_propositional_symbol_pointer("r", &r); MC_automaton_new_propositional_symbol_pointer("cs", &cs); MC_ignore(&(status.count), sizeof(status.count)); /* Get number of processes */ MPI_Comm_size(MPI_COMM_WORLD, &size); /* Get id of this process */ MPI_Comm_rank(MPI_COMM_WORLD, &rank); if(rank == 0){ /* Coordinator */ int CS_used = 0; while(1){ MPI_Recv(&recv_buff, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); if(status.MPI_TAG == REQUEST_TAG){ if(CS_used){ printf("CS already used.\n"); xbt_dynar_push(requests, &recv_buff); }else{ if(recv_buff != size - 1){ printf("CS idle. Grant immediatly.\n"); MPI_Send(&rank, 1, MPI_INT, recv_buff, GRANT_TAG, MPI_COMM_WORLD); CS_used = 1; } } }else{ if(!xbt_dynar_is_empty(requests)){ printf("CS release. Grant to queued requests (queue size: %lu)", xbt_dynar_length(requests)); xbt_dynar_shift(requests, &recv_buff); if(recv_buff != size - 1){ MPI_Send(&rank, 1, MPI_INT, recv_buff, GRANT_TAG, MPI_COMM_WORLD); CS_used = 1; }else{ xbt_dynar_push(requests, &recv_buff); CS_used = 0; } }else{ printf("CS release. Resource now idle.\n"); CS_used = 0; } } } }else{ /* Client */ while(1){ printf("%d asks the request.\n", rank); MPI_Send(&rank, 1, MPI_INT, 0, REQUEST_TAG, MPI_COMM_WORLD); if(rank == size - 1){ r = 1; cs = 0; } MPI_Recv(&recv_buff, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status); if(status.MPI_TAG == GRANT_TAG && rank == size - 1){ cs = 1; r = 0; } printf("%d got the answer. Release it.\n", rank); MPI_Send(&rank, 1, MPI_INT, 0, RELEASE_TAG, MPI_COMM_WORLD); if(rank == size - 1){ r = 0; cs = 0; } } } MPI_Finalize(); return 0; }