+void sg_platf_new_prop(sg_platf_prop_cbarg_t prop) {
+ unsigned int iterator;
+ sg_platf_prop_cb_t fun;
+ xbt_dynar_foreach(sg_platf_prop_cb_list, iterator, fun) {
+ fun(prop);
+ }
+}
+void sg_platf_new_trace(sg_platf_trace_cbarg_t trace) {
+ unsigned int iterator;
+ sg_platf_trace_cb_t fun;
+ xbt_dynar_foreach(sg_platf_trace_cb_list, iterator, fun) {
+ fun(trace);
+ }
+}
+void sg_platf_new_trace_connect(sg_platf_trace_connect_cbarg_t trace_connect) {
+ unsigned int iterator;
+ sg_platf_trace_connect_cb_t fun;
+ xbt_dynar_foreach(sg_platf_trace_connect_cb_list, iterator, fun) {
+ fun(trace_connect);
+ }
+}
+void sg_platf_new_process(sg_platf_process_cbarg_t process){
+ unsigned int iterator;
+ sg_platf_process_cb_t fun;
+ xbt_dynar_foreach(sg_platf_process_cb_list, iterator, fun) {
+ fun(process);
+ }
+}
+
+void sg_platf_begin() { /* Do nothing: just for symmetry of user code */ }
+
+void sg_platf_end() {
+ unsigned int iterator;
+ void_f_void_t fun;
+ xbt_dynar_foreach(sg_platf_postparse_cb_list, iterator, fun) {
+ fun();
+ }
+}
+
+static int surf_parse_models_setup_already_called = 0;
+
+void sg_platf_new_AS_begin(const char *id, int routing) {
+ unsigned int iterator;
+ sg_platf_AS_begin_cb_t fun;
+
+ if (!surf_parse_models_setup_already_called && !xbt_dynar_is_empty(sg_platf_AS_begin_cb_list)) {
+ /* Initialize the surf models. That must be done after we got all config, and before we need the models.
+ * That is, after the last <config> tag, if any, and before the first of cluster|peer|AS|trace|trace_connect
+ *
+ * I'm not sure for <trace> and <trace_connect>, there may be a bug here
+ * (FIXME: check it out by creating a file beginning with one of these tags)
+ * but cluster and peer create ASes internally, so putting the code in there is ok.
+ *
+ * We are also guarding against xbt_dynar_length(sg_platf_AS_begin_cb_list) because we don't
+ * want to initialize the models if we are parsing the file to get the deployment. That could happen if
+ * the same file would be used for platf and deploy: it'd contain AS tags even during the deploy parsing.
+ * Removing that guard would result of the models to get re-inited when parsing for deploy.
+ */
+ surf_parse_models_setup_already_called = 1;
+ surf_config_models_setup();
+ }
+
+ xbt_dynar_foreach(sg_platf_AS_begin_cb_list, iterator, fun) {
+ fun(id, routing);
+ }
+}
+
+void sg_platf_new_AS_end() {
+ unsigned int iterator;
+ void_f_void_t fun;
+ xbt_dynar_foreach(sg_platf_AS_end_cb_list, iterator, fun) {
+ fun();
+ }
+}
+
+
+void sg_platf_host_add_cb(sg_platf_host_cb_t fct) {
+ xbt_dynar_push(sg_platf_host_cb_list, &fct);
+}
+void sg_platf_host_link_add_cb(sg_platf_host_link_cb_t fct) {
+ xbt_dynar_push(sg_platf_host_link_cb_list, &fct);
+}
+void sg_platf_link_add_cb(sg_platf_link_cb_t fct) {
+ xbt_dynar_push(sg_platf_link_cb_list, &fct);
+}
+void sg_platf_router_add_cb(sg_platf_router_cb_t fct) {
+ xbt_dynar_push(sg_platf_router_cb_list, &fct);
+}
+void sg_platf_peer_add_cb(sg_platf_peer_cb_t fct) {
+ xbt_dynar_push(sg_platf_peer_cb_list, &fct);
+}
+void sg_platf_cluster_add_cb(sg_platf_cluster_cb_t fct) {
+ xbt_dynar_push(sg_platf_cluster_cb_list, &fct);
+}
+void sg_platf_cabinet_add_cb(sg_platf_cabinet_cb_t fct) {
+ xbt_dynar_push(sg_platf_cabinet_cb_list, &fct);
+}
+void sg_platf_postparse_add_cb(void_f_void_t fct) {
+ xbt_dynar_push(sg_platf_postparse_cb_list, &fct);
+}
+void sg_platf_AS_begin_add_cb(sg_platf_AS_begin_cb_t fct) {
+ xbt_dynar_push(sg_platf_AS_begin_cb_list, &fct);
+}
+void sg_platf_AS_end_add_cb(void_f_void_t fct) {
+ xbt_dynar_push(sg_platf_AS_end_cb_list, &fct);
+}
+void sg_platf_storage_add_cb(sg_platf_storage_cb_t fct) {
+ xbt_dynar_push(sg_platf_storage_cb_list, &fct);
+}
+void sg_platf_storage_type_add_cb(sg_platf_storage_type_cb_t fct) {
+ xbt_dynar_push(sg_platf_storage_type_cb_list, &fct);
+}
+void sg_platf_mstorage_add_cb(sg_platf_mstorage_cb_t fct) {
+ xbt_dynar_push(sg_platf_mstorage_cb_list, &fct);
+}
+void sg_platf_mount_add_cb(sg_platf_mount_cb_t fct) {
+ xbt_dynar_push(sg_platf_mount_cb_list, &fct);
+}
+void sg_platf_route_add_cb(sg_platf_route_cb_t fct) {
+ xbt_dynar_push(sg_platf_route_cb_list, &fct);
+}
+void sg_platf_ASroute_add_cb(sg_platf_ASroute_cb_t fct) {
+ xbt_dynar_push(sg_platf_ASroute_cb_list, &fct);
+}
+void sg_platf_bypassRoute_add_cb(sg_platf_bypassRoute_cb_t fct) {
+ xbt_dynar_push(sg_platf_bypassRoute_cb_list, &fct);
+}
+void sg_platf_bypassASroute_add_cb(sg_platf_bypassASroute_cb_t fct) {
+ xbt_dynar_push(sg_platf_bypassASroute_cb_list, &fct);
+}
+void sg_platf_prop_add_cb(sg_platf_prop_cb_t fct) {
+ xbt_dynar_push(sg_platf_prop_cb_list, &fct);
+}
+void sg_platf_trace_add_cb(sg_platf_trace_cb_t fct) {
+ xbt_dynar_push(sg_platf_trace_cb_list, &fct);
+}
+void sg_platf_trace_connect_add_cb(sg_platf_trace_connect_cb_t fct) {
+ xbt_dynar_push(sg_platf_trace_connect_cb_list, &fct);
+}
+void sg_platf_rng_stream_init(unsigned long seed[6]) {
+ RngStream_SetPackageSeed(seed);
+ sg_platf_rng_stream = RngStream_CreateStream(NULL);
+}
+void sg_platf_process_add_cb(sg_platf_process_cb_t fct) {
+ xbt_dynar_push(sg_platf_process_cb_list, &fct);
+}
+
+RngStream sg_platf_rng_stream_get(const char* id) {
+ RngStream stream = NULL;
+ unsigned int id_hash;
+
+ stream = RngStream_CopyStream(sg_platf_rng_stream);
+ id_hash = xbt_str_hash(id);
+ RngStream_AdvanceState(stream, 0, (long)id_hash);
+
+ return stream;