Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
db9c81b381b4d227b9bb4330d2169740e3463f74
[simgrid.git] / src / simix / smx_environment.c
1 /*      $Id$     */
2
3 /* Copyright (c) 2007 Arnaud Legrand, Bruno Donnassolo.
4    All rights reserved.                                          */
5
6 /* This program is free software; you can redistribute it and/or modify it
7  * under the terms of the license (GNU LGPL) which comes with this package. */
8
9 #include "private.h"
10 #include "xbt/sysdep.h"
11 #include "xbt/log.h"
12 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_environment, simix,
13                                 "Logging specific to SIMIX (environment)");
14
15 /********************************* SIMIX **************************************/
16
17 /** 
18  * \brief A platform constructor.
19  *
20  * Creates a new platform, including hosts, links and the
21  * routing_table. 
22  * \param file a filename of a xml description of a platform. This file 
23  * follows this DTD :
24  *
25  *     \include surfxml.dtd
26  *
27  * Here is a small example of such a platform 
28  *
29  *     \include small_platform.xml
30  *
31  */
32 void SIMIX_create_environment(const char *file) 
33 {
34   xbt_dict_cursor_t cursor = NULL;
35   char *name = NULL;
36   void *workstation = NULL;
37   char *workstation_model_name;
38   int workstation_id = -1;
39
40   simix_config_init(); /* make sure that our configuration set is created */
41   surf_timer_resource_init(file);
42
43   /* which model do you want today? */
44   workstation_model_name = xbt_cfg_get_string (_simix_cfg_set, "workstation_model");
45
46   DEBUG1("Model : %s", workstation_model_name);
47   workstation_id = find_resource_description(surf_workstation_resource_description,
48                                              surf_workstation_resource_description_size,
49                                              workstation_model_name);
50   if(!strcmp(workstation_model_name,"compound")) {
51     xbt_ex_t e;
52     char *network_model_name = NULL;
53     char *cpu_model_name = NULL;
54     int network_id = -1;
55     int cpu_id = -1;
56
57     TRY {                         
58       cpu_model_name = xbt_cfg_get_string (_simix_cfg_set, "cpu_model");
59     } CATCH(e) {                  
60       if (e.category == bound_error) {
61         xbt_assert0(0,"Set a cpu model to use with the 'compound' workstation model");
62         xbt_ex_free(e);           
63       } else {                    
64         RETHROW;                  
65       }
66     }
67
68     TRY {                         
69       network_model_name=xbt_cfg_get_string (_simix_cfg_set, "network_model");
70     } CATCH(e) {                  
71       if (e.category == bound_error) {
72         xbt_assert0(0,"Set a network model to use with the 'compound' workstation model");
73         xbt_ex_free(e);           
74       } else {                    
75         RETHROW;                  
76       }
77     }
78
79     network_id = find_resource_description(surf_network_resource_description,
80                                            surf_network_resource_description_size,
81                                            network_model_name);
82     cpu_id = find_resource_description(surf_cpu_resource_description,
83                                        surf_cpu_resource_description_size,
84                                        cpu_model_name);
85
86     surf_cpu_resource_description[cpu_id].resource_init(file);
87     surf_network_resource_description[network_id].resource_init(file);
88   }
89
90   surf_workstation_resource_description[workstation_id].resource_init(file);
91
92   _simix_init_status = 2; /* inited; don't change settings now */
93
94   xbt_dict_foreach(workstation_set, cursor, name, workstation) {
95     __SIMIX_host_create(name, workstation, NULL);
96   }
97
98   return;
99 }
100