Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add "attach" attribute to storage tag in platform description
[simgrid.git] / src / surf / network_gtnets.cpp
1 /* Copyright (c) 2013-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 "network_gtnets.hpp"
8
9 static double time_to_next_flow_completion = -1;
10
11 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_gtnets, surf,
12                                 "Logging specific to the SURF network GTNetS module");
13
14 extern routing_platf_t routing_platf;
15
16 double sg_gtnets_jitter = 0.0;
17 int sg_gtnets_jitter_seed = 10;
18
19 /*********
20  * Model *
21  *********/
22
23 void newRoute(int src_id, int dst_id,
24                       xbt_dynar_t links, int nb_link)
25 {
26   void *_link;
27   NetworkGTNetsLinkPtr link;
28   unsigned int cursor;
29   int i = 0;
30   int *gtnets_links;
31
32   XBT_IN("(src_id=%d, dst_id=%d, links=%p, nb_link=%d)",
33           src_id, dst_id, links, nb_link);
34
35   /* Build the list of gtnets link IDs */
36   gtnets_links = xbt_new0(int, nb_link);
37   i = 0;
38   xbt_dynar_foreach(links, cursor, _link) {
39         link = (NetworkGTNetsLinkPtr) _link;
40     gtnets_links[i++] = link->m_id;
41   }
42
43   if (gtnets_add_route(src_id, dst_id, gtnets_links, nb_link)) {
44     xbt_die("Cannot create GTNetS route");
45   }
46   XBT_OUT();
47 }
48
49 void newRouteOnehop(int src_id, int dst_id,
50                     NetworkGTNetsLinkPtr link)
51 {
52   if (gtnets_add_onehop_route(src_id, dst_id, link->m_id)) {
53     xbt_die("Cannot create GTNetS route");
54   }
55 }
56
57 int NetworkGTNetsModel::addLink(ind id, double bandwidth, double latency)
58 {
59   double bw = bandwidth * 8; //Bandwidth in bits (used in GTNETS).
60
61   map<int,GTNETS_Link*>::iterator iter = p_links.find(id);
62   xbt_assert((iter == p_links.end()), "Link %d already exists", id);
63
64   if(iter == p_links.end()) {
65     GTNETS_Link* link= new GTNETS_Link(id);
66     p_links[id] = link;
67   }
68
69   XBT_DEBUG("Creating a new P2P, linkid %d, bandwidth %gl, latency %gl", id, bandwidth, latency);
70   p_gtnetsLinks_[id] = new Linkp2p(bw, latency);
71           if(jitter_ > 0){
72                 XBT_DEBUG("Using jitter %f, and seed %u", jitter_, jitter_seed_);
73                 double min = -1*jitter_*latency;
74                 double max = jitter_*latency;
75                 uniform_jitter_generator_[id] = new Uniform(min,max);
76                 gtnets_links_[id]->Jitter((const Random &) *(uniform_jitter_generator_[id]));
77           }
78
79           return 0;
80 }
81
82 /************
83  * Resource *
84  ************/
85 NetworkGTNetsLink::NetworkGTNetsLink(NetworkGTNetsModelPtr model, const char* name, double bw, double lat, xbt_dict_t properties)
86   :NetworkCm02Link(model, name, properties), m_bwCurrent(bw), m_latCurrent(lat)
87 {
88
89   static int link_count = -1;
90
91   if (xbt_lib_get_or_null(link_lib, name, SURF_LINK_LEVEL)) {
92     return;
93   }
94
95   XBT_DEBUG("Scanning link name %s", name);
96
97   link_count++;
98
99   XBT_DEBUG("Adding new link, linkid %d, name %s, latency %g, bandwidth %g",
100            link_count, name, lat, bw);
101
102
103
104   if (gtnets_add_link(link_count, bw, lat)) {
105     xbt_die("Cannot create GTNetS link");
106   }
107   m_id = link_count;
108
109   xbt_lib_set(link_lib, name, SURF_LINK_LEVEL, this);
110 }
111
112 /**********
113  * Action *
114  **********/