X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1534b2e2f4525d905d5359a484983d1ece3f1178..5b3677b425b9cc6949c1573d59ac772540cbf4b2:/examples/msg/chainsend/peer.c diff --git a/examples/msg/chainsend/peer.c b/examples/msg/chainsend/peer.c index 43c055de5e..6be29c17b7 100644 --- a/examples/msg/chainsend/peer.c +++ b/examples/msg/chainsend/peer.c @@ -1,3 +1,9 @@ +/* Copyright (c) 2012-2014. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + #include "peer.h" XBT_LOG_NEW_DEFAULT_CATEGORY(msg_peer, @@ -11,12 +17,13 @@ void peer_init_chain(peer_t peer, message_t msg) { peer->prev = msg->prev_hostname; peer->next = msg->next_hostname; + peer->total_pieces = msg->num_pieces; peer->init = 1; } static void peer_forward_msg(peer_t peer, message_t msg) { - msg_task_t task = task_message_data_new(peer->me, peer->next, NULL, msg->data_length); + msg_task_t task = task_message_data_new(NULL, msg->data_length); msg_comm_t comm = NULL; XBT_DEBUG("Sending (isend) from %s into mailbox %s", peer->me, peer->next); comm = MSG_task_isend(task, peer->next); @@ -39,11 +46,10 @@ int peer_execute_task(peer_t peer, msg_task_t task) peer_forward_msg(peer, msg); peer->pieces++; peer->bytes += msg->data_length; - break; - case MESSAGE_END_DATA: - xbt_assert(peer->init, "peer_execute_task() failed: got msg_type %d before initialization", msg->type); - done = 1; - XBT_DEBUG("%d pieces receieved", peer->pieces); + if (peer->pieces >= peer->total_pieces) { + XBT_DEBUG("%d pieces receieved", peer->pieces); + done = 1; + } break; } @@ -91,31 +97,34 @@ void peer_init(peer_t p, int argc, char *argv[]) p->next = NULL; p->pieces = 0; p->bytes = 0; - p->close_asap = 0; p->pending_recvs = xbt_dynar_new(sizeof(msg_comm_t), NULL); p->pending_sends = xbt_dynar_new(sizeof(msg_comm_t), NULL); - p->me = xbt_new(char, HOSTNAME_LENGTH); /* Set mailbox name: use host number from argv or hostname if no argument given */ if (argc > 1) { - snprintf(p->me, HOSTNAME_LENGTH, "host%s", argv[1]); + p->me = bprintf("host%s", argv[1]); } else { - strncpy(p->me, MSG_host_get_name(MSG_host_self()), HOSTNAME_LENGTH); + p->me = xbt_strdup(MSG_host_get_name(MSG_host_self())); } } void peer_shutdown(peer_t p) { - float start_time = MSG_get_clock(); - float end_time = start_time + PEER_SHUTDOWN_DEADLINE; + unsigned int size = xbt_dynar_length(p->pending_sends); + unsigned int idx; + msg_comm_t *comms = xbt_new(msg_comm_t, size); + + for (idx = 0; idx < size; idx++) { + comms[idx] = xbt_dynar_get_as(p->pending_sends, idx, msg_comm_t); + } XBT_DEBUG("Waiting for sends to finish before shutdown..."); - /* MSG_comm_waitall(p->pending_sends, PEER_SHUTDOWN_DEADLINE); FIXME: this doesn't work */ - while (xbt_dynar_length(p->pending_sends) && MSG_get_clock() < end_time) { - process_pending_connections(p->pending_sends); - MSG_process_sleep(1); + MSG_comm_waitall(comms, size, PEER_SHUTDOWN_DEADLINE); + + for (idx = 0; idx < size; idx++) { + MSG_comm_destroy(comms[idx]); } - xbt_assert(xbt_dynar_length(p->pending_sends) == 0, "Shutdown failed, sends still pending after deadline"); + xbt_free(comms); } void peer_delete(peer_t p) @@ -123,6 +132,8 @@ void peer_delete(peer_t p) xbt_dynar_free(&p->pending_recvs); xbt_dynar_free(&p->pending_sends); xbt_free(p->me); + xbt_free(p->prev); + xbt_free(p->next); xbt_free(p); }