Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Reindent everything (possibly breaking all branches, but for the last time)
[simgrid.git] / examples / msg / sendrecv / sendrecv.c
1 /*      $Id$        */
2 /* Copyright (c) 2002,2003,2004 Arnaud Legrand. All rights reserved.        */
3 /* This program is free software; you can redistribute it and/or modify it
4  * under the terms of the license (GNU LGPL) which comes with this package. */
5
6 #include<stdio.h>
7
8 #include "msg/msg.h"            /* Yeah! If you want to use msg, you need to include msg/msg.h */
9 #include "xbt/sysdep.h"         /* calloc */
10
11 /* Create a log channel to have nice outputs. */
12 #include "xbt/log.h"
13 #include "xbt/asserts.h"
14
15 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
16                              "Messages specific for this msg example");
17
18 int sender(int argc, char *argv[]);
19 int receiver(int argc, char *argv[]);
20
21 MSG_error_t test_all(const char *platform_file, const char *application_file);
22
23 typedef enum {
24   PORT_22 = 0,
25   MAX_CHANNEL
26 } channel_t;
27
28 double task_comm_size_lat = 10e0;
29 double task_comm_size_bw = 10e8;
30
31 /** Emitter function  */
32 int sender(int argc, char *argv[])
33 {
34   m_host_t host = NULL;
35   double time;
36   m_task_t task_la = NULL;
37   m_task_t task_bw = NULL;
38   char sprintf_buffer_la[64];
39   char sprintf_buffer_bw[64];
40
41   INFO0("sender");
42
43   /*host = xbt_new0(m_host_t,1); */
44
45   INFO1("host = %s", argv[1]);
46
47   host = MSG_get_host_by_name(argv[1]);
48
49   if (host == NULL) {
50     INFO1("Unknown host %s. Stopping Now! ", argv[1]);
51     abort();
52   }
53
54   /* Latency */
55   time = MSG_get_clock();
56   sprintf(sprintf_buffer_la, "latency task");
57   task_la = MSG_task_create(sprintf_buffer_la, 0.0, task_comm_size_lat, NULL);
58   task_la->data = xbt_new(double, 1);
59   *(double *) task_la->data = time;
60   INFO1("task_la->data = %le", *((double *) task_la->data));
61   MSG_task_put(task_la, host, PORT_22);
62
63   /* Bandwidth */
64   time = MSG_get_clock();
65   sprintf(sprintf_buffer_bw, "bandwidth task");
66   task_bw = MSG_task_create(sprintf_buffer_bw, 0.0, task_comm_size_bw, NULL);
67   task_bw->data = xbt_new(double, 1);
68   *(double *) task_bw->data = time;
69   INFO1("task_bw->data = %le", *((double *) task_bw->data));
70   MSG_task_put(task_bw, host, PORT_22);
71
72   return 0;
73 }                               /* end_of_client */
74
75 /** Receiver function  */
76 int receiver(int argc, char *argv[])
77 {
78   double time, time1, sender_time;
79   m_task_t task_la = NULL;
80   m_task_t task_bw = NULL;
81   int a;
82   double communication_time = 0;
83
84   INFO0("receiver");
85
86   time = MSG_get_clock();
87
88   /* Get Latency */
89   a = MSG_task_get(&task_la, PORT_22);
90   if (a == MSG_OK) {
91     time1 = MSG_get_clock();
92     sender_time = *((double *) (task_la->data));
93     time = sender_time;
94     communication_time = time1 - time;
95     INFO1("Task received : %s", task_la->name);
96     MSG_task_destroy(task_la);
97     INFO1("Communic. time %le", communication_time);
98     INFO1("--- la %f ----", communication_time);
99   } else {
100     xbt_assert0(0, "Unexpected behavior");
101   }
102
103
104   /* Get Bandwidth */
105   a = MSG_task_get(&task_bw, PORT_22);
106   if (a == MSG_OK) {
107     time1 = MSG_get_clock();
108     sender_time = *((double *) (task_bw->data));
109     time = sender_time;
110     communication_time = time1 - time;
111     INFO1("Task received : %s", task_bw->name);
112     MSG_task_destroy(task_bw);
113     INFO1("Communic. time %le", communication_time);
114     INFO1("--- bw %f ----", task_comm_size_bw / communication_time);
115   } else {
116     xbt_assert0(0, "Unexpected behavior");
117   }
118
119
120   return 0;
121 }                               /* end_of_receiver */
122
123
124 /** Test function */
125 MSG_error_t test_all(const char *platform_file, const char *application_file)
126 {
127
128   MSG_error_t res = MSG_OK;
129
130
131
132   INFO0("test_all");
133
134   /*  Simulation setting */
135   MSG_set_channel_number(MAX_CHANNEL);
136   MSG_paje_output("msg_test.trace");
137   MSG_create_environment(platform_file);
138
139   /*   Application deployment */
140   MSG_function_register("sender", sender);
141   MSG_function_register("receiver", receiver);
142
143   MSG_launch_application(application_file);
144
145   res = MSG_main();
146
147   return res;
148 }                               /* end_of_test_all */
149
150
151 /** Main function */
152 int main(int argc, char *argv[])
153 {
154   MSG_error_t res = MSG_OK;
155
156 #ifdef _MSC_VER
157   unsigned int prev_exponent_format = _set_output_format(_TWO_DIGIT_EXPONENT);
158 #endif
159
160   MSG_global_init(&argc, argv);
161
162
163   if (argc != 3) {
164     CRITICAL1("Usage: %s platform_file deployment_file <model>\n", argv[0]);
165     CRITICAL1
166       ("example: %s msg_platform.xml msg_deployment.xml KCCFLN05_Vegas\n",
167        argv[0]);
168     exit(1);
169   }
170
171   /* Options for the workstation_model:
172
173      KCCFLN05              => for maxmin
174      KCCFLN05_proportional => for proportional (Vegas)
175      KCCFLN05_Vegas        => for TCP Vegas
176      KCCFLN05_Reno         => for TCP Reno
177    */
178   //MSG_config("workstation_model", argv[3]);
179
180   res = test_all(argv[1], argv[2]);
181
182   INFO1("Total simulation time: %le", MSG_get_clock());
183
184   MSG_clean();
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 */