Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
I had forgotten a host...
[simgrid.git] / testsuite / msg / msg_test.c
1 /*      $Id$     */
2
3 /* Copyright (c) 2002,2004,2004 Arnaud Legrand. All rights reserved.        */
4
5 /* This program is free software; you can redistribute it and/or modify it
6  * under the terms of the license (GNU LGPL) which comes with this package. */
7
8 /** \file msg_test.c 
9  *  \brief Test program for msg.
10 */
11
12 #include "msg/msg.h"
13
14 /** This flag enable the debugging messages from PRINT_DEBUG_MESSAGE() */
15 #define VERBOSE
16 #include "messages.h"
17
18 int unix_emitter(int argc, char *argv[]);
19 int unix_receiver(int argc, char *argv[]);
20 int unix_forwarder(int argc, char *argv[]);
21 void test_all(const char *platform_file, const char *application_file);
22
23
24 /** The names of the channels we will use in this simulation. There is
25     only one channel identified by the name PORT_22. */
26 typedef enum {
27   PORT_22 = 0,
28   MAX_CHANNEL
29 } channel_t;
30
31 void print_args(int argc, char** argv);
32 void print_args(int argc, char** argv)
33 {
34   int i ; 
35
36   fprintf(stderr,"<");
37   for(i=0; i<argc; i++) 
38     fprintf(stderr,"%s ",argv[i]);
39   fprintf(stderr,">\n");
40 }
41
42 /** The number of task each slave will process */
43 #define NB_TASK 3
44 int unix_emitter(int argc, char *argv[])
45 {
46   int slaves_count = 0;
47   m_host_t *slaves = NULL;
48   int todo_count = 0;
49   m_task_t *todo = NULL;
50
51   int i;
52
53   print_args(argc,argv);
54
55   {                  /* Process organisation */
56     slaves_count = argc - 1;
57     slaves = calloc(slaves_count, sizeof(m_host_t));
58     
59     for (i = 1; i < argc; i++) {
60       slaves[i-1] = MSG_get_host_by_name(argv[i]);
61       if(slaves[i-1]==NULL) {
62         PRINT_MESSAGE("Unknown host %s. Stopping Now! \n", argv[i]);
63         abort();
64       }
65     }
66   }
67
68   {                  /*  Task creation */
69     char sprintf_buffer[64];
70     int slave  = slaves_count;
71
72     todo = calloc(NB_TASK * slave, sizeof(m_task_t));
73     todo_count = NB_TASK * slave;
74
75     for (i = 0; i < NB_TASK * slave; i++) {
76       sprintf(sprintf_buffer, "Task_%d", i);
77       todo[i] = MSG_task_create(sprintf_buffer, 5000, 10, NULL);
78     }
79   }
80
81   PRINT_MESSAGE("Got %d slave(s) :\n", slaves_count);
82   for (i = 0; i < slaves_count; i++)
83     PRINT_MESSAGE("\t %s\n", slaves[i]->name);
84
85   PRINT_MESSAGE("Got %d task to process :\n", todo_count);
86
87   for (i = 0; i < todo_count; i++)
88     PRINT_MESSAGE("\t\"%s\"\n", todo[i]->name);
89
90   for (i = 0; i < todo_count; i++) {
91     PRINT_MESSAGE("Sending \"%s\" to \"%s\"\n",
92                   todo[i]->name,
93                   slaves[i % slaves_count]->name);
94     MSG_task_put(todo[i], slaves[i % slaves_count],
95                  PORT_22);
96     PRINT_MESSAGE("Send completed\n");
97   }
98   
99   free(slaves);
100   free(todo);
101   return 0;
102 }
103
104 int unix_receiver(int argc, char *argv[])
105 {
106   int todo_count = 0;
107   m_task_t *todo = (m_task_t *) calloc(NB_TASK, sizeof(m_task_t));
108   int i;
109
110   print_args(argc,argv);
111
112   for (i = 0; i < NB_TASK;) {
113     int a;
114     PRINT_MESSAGE("Awaiting Task %d \n", i);
115     a = MSG_task_get(&(todo[i]), PORT_22);
116     if (a == MSG_OK) {
117       todo_count++;
118       PRINT_MESSAGE("Received \"%s\" \n", todo[i]->name);
119       PRINT_MESSAGE("Processing \"%s\" \n", todo[i]->name);
120       MSG_task_execute(todo[i]);
121       PRINT_MESSAGE("\"%s\" done \n", todo[i]->name);
122       MSG_task_destroy(todo[i]);
123       i++;
124     } else {
125       PRINT_MESSAGE("Hey ?! What's up ? \n");
126       DIE("Unexpected behaviour");
127     }
128   }
129   free(todo);
130   PRINT_MESSAGE("I'm done. See you!\n");
131   return 0;
132 }
133
134
135 int unix_forwarder(int argc, char *argv[])
136 {
137   int todo_count = 0;
138   m_task_t *todo = (m_task_t *) calloc(NB_TASK, sizeof(m_task_t));
139   int i;
140
141   print_args(argc,argv);
142
143   for (i = 0; i < NB_TASK;) {
144     int a;
145     PRINT_MESSAGE("Awaiting Task %d \n", i);
146     a = MSG_task_get(&(todo[i]), PORT_22);
147     if (a == MSG_OK) {
148       todo_count++;
149       PRINT_MESSAGE("Received \"%s\" \n", todo[i]->name);
150       PRINT_MESSAGE("Processing \"%s\" \n", todo[i]->name);
151       MSG_task_execute(todo[i]);
152       PRINT_MESSAGE("\"%s\" done \n", todo[i]->name);
153       MSG_task_destroy(todo[i]);
154       i++;
155     } else {
156       PRINT_MESSAGE("Hey ?! What's up ? \n");
157       DIE("Unexpected behaviour");
158     }
159   }
160   free(todo);
161   PRINT_MESSAGE("I'm done. See you!\n");
162   return 0;
163 }
164
165
166 void test_all(const char *platform_file,const char *application_file)
167 {
168   {                             /*  Simulation setting */
169     MSG_set_channel_number(MAX_CHANNEL);
170     MSG_create_environment(platform_file);
171   }
172   {                            /*   Application deployment */
173     MSG_function_register("master", unix_emitter);
174     MSG_function_register("slave", unix_receiver);
175     MSG_launch_application(application_file);
176   }
177   MSG_main();
178   printf("Simulation time %Lg\n",MSG_getClock());
179 }
180
181 int main(int argc, char *argv[])
182 {
183   MSG_global_init_args(&argc,argv);
184   test_all("msg_platform.xml","msg_deployment.xml");
185   MSG_clean();
186   return (0);
187 }