X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5d22f5c22cc45a58c1cc904b874e730cb554cf39..97f29c3974bb3008815e603331b33e5065c2f387:/examples/amok/bandwidth/bandwidth.c diff --git a/examples/amok/bandwidth/bandwidth.c b/examples/amok/bandwidth/bandwidth.c index 6d1eda4e45..354eeb7f85 100644 --- a/examples/amok/bandwidth/bandwidth.c +++ b/examples/amok/bandwidth/bandwidth.c @@ -1,8 +1,7 @@ -/* $Id$ */ - /* bandwidth - bandwidth test demo of GRAS features */ -/* Copyright (c) 2003, 2004 Martin Quinson. All rights reserved. */ +/* Copyright (c) 2005, 2006, 2007, 2008, 2009, 2010. 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. */ @@ -12,29 +11,48 @@ #include "amok/bandwidth.h" #include "amok/peermanagement.h" -XBT_LOG_NEW_DEFAULT_CATEGORY(Bandwidth,"Messages specific to this example"); +XBT_LOG_NEW_DEFAULT_CATEGORY(Bandwidth, + "Messages specific to this example"); /* ********************************************************************** * Sensor code * **********************************************************************/ +static gras_socket_t try_gras_socket_client_from_string(const char *host) +{ + volatile gras_socket_t sock = NULL; + xbt_ex_t e; + TRY { + sock = gras_socket_client_from_string(host); + } + CATCH(e) { + xbt_ex_free(e); + } + return sock; +} + /* Function prototypes */ -int sensor (int argc,char *argv[]); +int sensor(int argc, char *argv[]); -int sensor (int argc,char *argv[]) { +int sensor(int argc, char *argv[]) +{ gras_socket_t mysock; - gras_socket_t master; + gras_socket_t master = NULL; + int connection_try = 10; gras_init(&argc, argv); amok_bw_init(); amok_pm_init(); - - mysock = gras_socket_server_range(3000,9999,0,0); - INFO1("Sensor starting (on port %d)",gras_os_myport()); - gras_os_sleep(0.5); /* let the master get ready */ - master = gras_socket_client_from_string(argv[1]); - - amok_pm_group_join(master,"bandwidth"); + + mysock = gras_socket_server_range(3000, 9999, 0, 0); + XBT_INFO("Sensor starting (on port %d)", gras_os_myport()); + while (connection_try > 0 && + !(master = try_gras_socket_client_from_string(argv[1]))) { + connection_try--; + gras_os_sleep(0.5); /* let the master get ready */ + } + + amok_pm_group_join(master, "bandwidth"); amok_pm_mainloop(60); gras_socket_close(mysock); @@ -48,62 +66,71 @@ int sensor (int argc,char *argv[]) { * **********************************************************************/ /* Function prototypes */ -int maestro (int argc,char *argv[]); +int maestro(int argc, char *argv[]); -int maestro(int argc,char *argv[]) { +int maestro(int argc, char *argv[]) +{ double sec, bw; - int buf_size=32 *1024; - int exp_size=512 *1024; - int msg_size=512 *1024; + int buf_size = 32 * 1024; + int msg_size = 512 * 1024; + int msg_amount = 1; double min_duration = 1; - + gras_socket_t peer; gras_socket_t mysock; - xbt_peer_t h1,h2; + xbt_peer_t h1, h2, h_temp; xbt_dynar_t group; gras_init(&argc, argv); amok_bw_init(); amok_pm_init(); - INFO0("Maestro starting"); + XBT_INFO("Maestro starting"); if (argc != 2) { - ERROR0("Usage: maestro port\n"); - return 1; + XBT_ERROR("Usage: maestro port\n"); + return 1; } - mysock=gras_socket_server(atoi(argv[1])); - group=amok_pm_group_new("bandwidth"); - INFO0("Wait for peers for 5 sec"); - gras_msg_handleall(5); /* friends, we're ready. Come and play */ - + mysock = gras_socket_server(atoi(argv[1])); + group = amok_pm_group_new("bandwidth"); + XBT_INFO("Wait for peers for 5 sec"); + gras_msg_handleall(5); /* friends, we're ready. Come and play */ + if (xbt_dynar_length(group) < 2) { - char *msg; - asprintf(&msg,"Not enough peers arrived. Expected 2 got %ld", - xbt_dynar_length(group)); - xbt_die(msg); + amok_pm_group_shutdown("bandwidth"); + xbt_die("Not enough peers arrived. Expected 2 got %ld", + xbt_dynar_length(group)); + } + h1 = *(xbt_peer_t *) xbt_dynar_get_ptr(group, 0); + h2 = *(xbt_peer_t *) xbt_dynar_get_ptr(group, 1); + /* sort peers in right order to keep output right */ + if (strcmp(h1->name, h2->name) < 0 || h1->port > h2->port) { + h_temp = h1; + h1 = h2; + h2 = h_temp; } - h1 = *(xbt_peer_t*) xbt_dynar_get_ptr(group, 0); - h2 = *(xbt_peer_t*)xbt_dynar_get_ptr(group, 1); - INFO2("Contact %s:%d",h1->name, h1->port); + XBT_INFO("Contact %s:%d", h1->name, h1->port); peer = gras_socket_client(h1->name, h1->port); - INFO0("Test the BW between me and one of the sensors"); - amok_bw_test(peer,buf_size,exp_size,msg_size,min_duration,&sec,&bw); - INFO6("Experience between me and %s:%d (%d bytes in msgs of %d bytes) took %f sec, achieving %f kb/s", - h1->name, h1->port, - exp_size,msg_size, - sec,((double)bw)/1024.0); - - INFO4("Test the BW between %s:%d and %s:%d", h1->name, h1->port, h2->name, h2->port); - amok_bw_request(h1->name, h1->port, h2->name, h2->port, - buf_size,exp_size,msg_size,min_duration,&sec,&bw); - INFO6("Experience between %s:%d and %s:%d took took %f sec, achieving %f kb/s", - h1->name, h1->port, h2->name, h2->port, - sec,((double)bw)/1024.0); + XBT_INFO("Test the BW between me and one of the sensors"); + amok_bw_test(peer, buf_size, msg_size, msg_amount, min_duration, &sec, + &bw); + XBT_INFO + ("Experience between me and %s:%d (initially %d msgs of %d bytes, maybe modified to fill the pipe at least %.1fs) took %f sec, achieving %f kb/s", + h1->name, h1->port, msg_amount, msg_size, min_duration, sec, + ((double) bw) / 1024.0); + + XBT_INFO("Test the BW between %s:%d and %s:%d", h1->name, h1->port, + h2->name, h2->port); + amok_bw_request(h1->name, h1->port, h2->name, h2->port, buf_size, + msg_size, msg_amount, min_duration, &sec, &bw); + XBT_INFO + ("Experience between %s:%d and %s:%d took took %f sec, achieving %f kb/s", + h1->name, h1->port, h2->name, h2->port, sec, + ((double) bw) / 1024.0); /* Game is over, friends */ - amok_pm_group_shutdown ("bandwidth"); + amok_pm_group_shutdown("bandwidth"); gras_socket_close(mysock); gras_exit();