Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge 'master' into mc
[simgrid.git] / examples / msg / sendrecv / sendrecv.c
1 /* Copyright (c) 2007-2014. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 #include<stdio.h>
8
9 #include "msg/msg.h"            /* Yeah! If you want to use msg, you need to include msg/msg.h */
10 #include "xbt/sysdep.h"         /* calloc */
11
12 /* Create a log channel to have nice outputs. */
13 #include "xbt/log.h"
14 #include "xbt/asserts.h"
15
16 /** @addtogroup MSG_examples
17  *
18  *  - <b>sendrecv/sendrecv.c: Ping-pong example</b>. It's hard to
19  *    think of a simpler example. The tesh files laying in the
20  *    directory are instructive concerning the way to pass options to the simulators (as described in \ref options).
21  */
22
23 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
24                              "Messages specific for this msg example");
25
26 int sender(int argc, char *argv[]);
27 int receiver(int argc, char *argv[]);
28
29 msg_error_t test_all(const char *platform_file,
30                      const char *application_file);
31
32 double task_comm_size_lat = 10e0;
33 double task_comm_size_bw = 10e8;
34
35 /** Emitter function  */
36 int sender(int argc, char *argv[])
37 {
38   msg_host_t host = NULL;
39   double time;
40   msg_task_t task_la = NULL;
41   msg_task_t task_bw = NULL;
42   char sprintf_buffer_la[64];
43   char sprintf_buffer_bw[64];
44
45   XBT_INFO("sender");
46
47   /*host = xbt_new0(msg_host_t,1); */
48
49   XBT_INFO("host = %s", argv[1]);
50
51   host = MSG_get_host_by_name(argv[1]);
52
53   if (host == NULL) {
54     XBT_INFO("Unknown host %s. Stopping Now! ", argv[1]);
55     abort();
56   }
57
58   /* Latency */
59   time = MSG_get_clock();
60   sprintf(sprintf_buffer_la, "latency task");
61   task_la =
62       MSG_task_create(sprintf_buffer_la, 0.0, task_comm_size_lat, NULL);
63   task_la->data = xbt_new(double, 1);
64   *(double *) task_la->data = time;
65   XBT_INFO("task_la->data = %e", *((double *) task_la->data));
66   MSG_task_send(task_la, argv[1]);
67
68   /* Bandwidth */
69   time = MSG_get_clock();
70   sprintf(sprintf_buffer_bw, "bandwidth task");
71   task_bw =
72       MSG_task_create(sprintf_buffer_bw, 0.0, task_comm_size_bw, NULL);
73   task_bw->data = xbt_new(double, 1);
74   *(double *) task_bw->data = time;
75   XBT_INFO("task_bw->data = %e", *((double *) task_bw->data));
76   MSG_task_send(task_bw, argv[1]);
77
78   return 0;
79 }                               /* end_of_client */
80
81 /** Receiver function  */
82 int receiver(int argc, char *argv[])
83 {
84   double time, time1, sender_time;
85   msg_task_t task_la = NULL;
86   msg_task_t task_bw = NULL;
87   int a;
88   double communication_time = 0;
89
90   XBT_INFO("receiver");
91
92   /* Get Latency */
93   a = MSG_task_receive(&task_la,MSG_host_get_name(MSG_host_self()));
94   if (a == MSG_OK) {
95     time1 = MSG_get_clock();
96     sender_time = *((double *) (task_la->data));
97     time = sender_time;
98     communication_time = time1 - time;
99     XBT_INFO("Task received : %s", task_la->name);
100     xbt_free(task_la->data);
101     MSG_task_destroy(task_la);
102     XBT_INFO("Communic. time %e", communication_time);
103     XBT_INFO("--- la %f ----", communication_time);
104   } else {
105     xbt_die("Unexpected behavior");
106   }
107
108   /* Get Bandwidth */
109   a = MSG_task_receive(&task_bw,MSG_host_get_name(MSG_host_self()));
110   if (a == MSG_OK) {
111     time1 = MSG_get_clock();
112     sender_time = *((double *) (task_bw->data));
113     time = sender_time;
114     communication_time = time1 - time;
115     XBT_INFO("Task received : %s", task_bw->name);
116     xbt_free(task_bw->data);
117     MSG_task_destroy(task_bw);
118     XBT_INFO("Communic. time %e", communication_time);
119     XBT_INFO("--- bw %f ----", task_comm_size_bw / communication_time);
120   } else {
121     xbt_die("Unexpected behavior");
122   }
123
124
125   return 0;
126 }                               /* end_of_receiver */
127
128
129 /** Test function */
130 msg_error_t test_all(const char *platform_file,
131                      const char *application_file)
132 {
133   msg_error_t res = MSG_OK;
134
135   XBT_INFO("test_all");
136
137   /*  Simulation setting */
138   MSG_create_environment(platform_file);
139
140   /*   Application deployment */
141   MSG_function_register("sender", sender);
142   MSG_function_register("receiver", receiver);
143
144   MSG_launch_application(application_file);
145
146   res = MSG_main();
147
148   return res;
149 }                               /* end_of_test_all */
150
151
152 /** Main function */
153 int main(int argc, char *argv[])
154 {
155   msg_error_t res = MSG_OK;
156
157 #ifdef _MSC_VER
158   unsigned int prev_exponent_format =
159       _set_output_format(_TWO_DIGIT_EXPONENT);
160 #endif
161
162   MSG_init(&argc, argv);
163
164   if (argc != 3) {
165     XBT_CRITICAL("Usage: %s platform_file deployment_file <model>\n",
166               argv[0]);
167     XBT_CRITICAL
168         ("example: %s msg_platform.xml msg_deployment.xml KCCFLN05_Vegas\n",
169          argv[0]);
170     exit(1);
171   }
172
173   /* Options for the workstation/model:
174
175      KCCFLN05              => for maxmin
176      KCCFLN05_proportional => for proportional (Vegas)
177      KCCFLN05_Vegas        => for TCP Vegas
178      KCCFLN05_Reno         => for TCP Reno
179    */
180   //MSG_config("workstation/model", argv[3]);
181
182   res = test_all(argv[1], argv[2]);
183
184   XBT_INFO("Total simulation time: %e", MSG_get_clock());
185
186 #ifdef _MSC_VER
187   _set_output_format(prev_exponent_format);
188 #endif
189
190   if (res == MSG_OK)
191     return 0;
192   else
193     return 1;
194 }                               /* end_of_main */