Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
s/TRY/TRYOLD/ I'd like to introduce a TRY macro in the exception mecanism, but this...
[simgrid.git] / examples / amok / bandwidth / bandwidth.c
1 /* $Id$ */
2
3 /* bandwidth - bandwidth test demo of GRAS features                         */
4
5 /* Copyright (c) 2003, 2004 Martin Quinson. All rights reserved.            */
6
7 /* This program is free software; you can redistribute it and/or modify it
8  * under the terms of the license (GNU LGPL) which comes with this package. */
9
10
11 #include "gras.h"
12 #include "amok/bandwidth.h"
13
14 XBT_LOG_NEW_DEFAULT_CATEGORY(Bandwidth,"Messages specific to this example");
15
16 /* **********************************************************************
17  * Sensor code
18  * **********************************************************************/
19
20 /* Global private data */
21 typedef struct {
22   gras_socket_t sock;
23   int done;
24 } s_sensor_data_t,*sensor_data_t;
25
26 static int sensor_cb_quit(gras_socket_t  expeditor,
27                           void          *payload_data) {
28   sensor_data_t globals=(sensor_data_t)gras_userdata_get();
29                           
30   globals->done = 1;                  
31   return 1;         
32 }
33
34 /* Function prototypes */
35 int sensor (int argc,char *argv[]);
36
37 int sensor (int argc,char *argv[]) {
38   xbt_error_t errcode;
39   sensor_data_t g;
40
41   gras_init(&argc, argv);
42   g=gras_userdata_new(s_sensor_data_t);  
43   amok_bw_init();
44    
45   if ((errcode=gras_socket_server(atoi(argv[1]),&(g->sock)))) { 
46     ERROR1("Error %s encountered while opening the server socket",xbt_error_name(errcode));
47     return 1;
48   }
49   g->done = 0;
50   
51   gras_msgtype_declare("quit",NULL);
52   gras_cb_register(gras_msgtype_by_name("quit"),&sensor_cb_quit);
53   
54   while (! g->done ) {
55     errcode=gras_msg_handle(60.0);
56     if (errcode != no_error) {
57        ERROR1("Error '%s' while handling message",xbt_error_name(errcode));
58        return errcode;
59     }   
60   }     
61
62   gras_socket_close(g->sock);
63   return 0;
64 }
65
66 /* **********************************************************************
67  * Maestro code
68  * **********************************************************************/
69
70 /* Global private data */
71 typedef struct {
72   gras_socket_t sock;
73 } s_maestro_data_t,*maestro_data_t;
74
75 /* Function prototypes */
76 int maestro (int argc,char *argv[]);
77
78 int maestro(int argc,char *argv[]) {
79   xbt_error_t errcode;
80   maestro_data_t g;
81   double sec, bw;
82   int buf_size=32;
83   int exp_size=1024*50;
84   int msg_size=512;
85   gras_socket_t peer;
86
87   gras_init(&argc, argv);
88   g=gras_userdata_new(s_maestro_data_t);
89   amok_bw_init();
90
91   if (argc != 5) {
92      ERROR0("Usage: maestro host port host port\n");
93      return 1;
94   }
95
96   /* wait to ensure that all server sockets are there before starting the experiment */ 
97   gras_os_sleep(0.5);
98   
99   if ((errcode=gras_socket_client(argv[1],atoi(argv[2]),&peer))) {
100      ERROR3("Unable to connect to my peer on %s:%s. Got %s",
101             argv[1],argv[2],xbt_error_name(errcode));
102      return 1;
103   }
104
105   INFO0("Test the BW between me and one of the sensors");  
106   TRYOLD(amok_bw_test(peer,buf_size,exp_size,msg_size,&sec,&bw));
107   INFO6("Experience between me and %s:%d (%d kb in msgs of %d kb) took %f sec, achieving %f kb/s",
108         argv[1],atoi(argv[2]),
109         exp_size,msg_size,
110         sec,bw);
111
112   INFO0("Test the BW between the two sensors");  
113   TRYOLD(amok_bw_request(argv[1],atoi(argv[2]),argv[3],atoi(argv[4]),
114                       buf_size,exp_size,msg_size,&sec,&bw));    
115   INFO2("Experience took took %f sec, achieving %f kb/s",
116         sec,bw);
117
118   /* ask sensors to quit */                    
119   gras_msgtype_declare("quit",NULL);
120   TRYOLD(gras_msg_send(peer,gras_msgtype_by_name("quit"), NULL));
121   gras_socket_close(peer);
122   TRYOLD(gras_socket_client(argv[3],atoi(argv[4]),&peer));
123   TRYOLD(gras_msg_send(peer,gras_msgtype_by_name("quit"), NULL));
124   gras_socket_close(peer);
125
126   gras_socket_close(g->sock);
127   return 0;
128 }