-/*! @page getting_started Getting started with SimGrid!
+/*! @page getting_started Getting started with SimGrid
\tableofcontents
-Welcome to SimGrid's documentation! %As you may know, SimGrid is (actively
-developed) research software and contains many features. This documentation is
+Welcome to SimGrid's documentation! %As you may know, SimGrid is an actively
+developed research software and contains many features. This documentation is
\c "work in progress" (and we need the community's help to improve this
documentation! If you're ready to step up and help us, see Section \ref
contributing "Contributing"), but many features are already well described.
| ----------------- | ------------------------------------------------- |
| \ref tutorial | Introduces the user to basic features of SimGrid. |
| \ref install | Explains how SimGrid can be installed; this covers Windows as well as Linux; plus, it shows how to install from a package or how to install from source. |
-| [Tutorials](http://simgrid.gforge.inria.fr/tutorials.html) | These tutorials cover most of the basics and might be valuable for what you want to do, especially the [SimGrid User 101](http://simgrid.gforge.inria.fr/tutorials/simgrid-use-101.pdf). |
+| [Online Tutorials](http://simgrid.gforge.inria.fr/tutorials.html) | These tutorials cover most of the basics and might be valuable for what you want to do, especially the [SimGrid User 101](http://simgrid.gforge.inria.fr/tutorials/simgrid-use-101.pdf). |
| \ref MSG_examples | This document explains several tests that we wrote for MSG; these tests are working simulations and you may learn something from looking at them. |
In order to actually use SimGrid, three steps are necessary:
-\li \ref platform
-\li \ref options
-\li \ref deployment
+\li Step 1: \ref platform
+\li Step 2: \ref options
+\li Step 3: \ref deployment
\section gs_experienced_users Documentation for experienced users
| Document name | Description |
| ----------------- | ------------------------------------------------- |
| \ref tracing | Shows how the behavior of a program can be written to a file so that it can be analyzed. |
-| \ref bindings | SimGrid supports many different bindings for languages such as Lua, Ruby, Java, ... You can run your simulations with those! |
-| \ref pls | Although SimGrid is not a packet level simulator, it does have bindings to two such simulators. |
+| \ref bindings | You can write your application in Java, if you prefer. |
+| \ref pls | You can use the NS3 simulation models instead of our own. |
| \ref inside | If you want to contribute or obtain a deeper understanding of SimGrid, this is the right location. |
\section gs_examples Examples shipped with SimGrid
-SimGrid ships with many examples. You can find them in the folder
-\c examples/. Especially when you're looking for examples on how to
-use a specific XML-tag, this will prove valuable, as you can easily
-search through all the files with tools like \c grep.
+SimGrid ships with many examples, detailed in Section \ref
+MSG_examples. You can find them in the folder \c examples/. Especially
+when you're looking for examples on how to use a specific XML-tag,
+this will prove valuable, as you can easily search through all the
+files with tools like \c grep.
Here is the output of a quick search for examples for \ref pf_trace "trace_connect":
./platforms/two_hosts_platform_with_availability_included.xml:26:<trace_connect kind="POWER" trace="B" element="Cpu B"/>
\endverbatim
-\note
- There's also a Section on \ref MSG_examples "examples for MSG".
-
*/
AS_t * res_dst)
{
xbt_assert(src && dst, "bad parameters for \"elements_father\" method");
-#define ELEMENTS_FATHER_MAXDEPTH 16 /* increase if it is not enough */
- simgrid::surf::As *src_as, *dst_as;
- simgrid::surf::As *path_src[ELEMENTS_FATHER_MAXDEPTH];
- simgrid::surf::As *path_dst[ELEMENTS_FATHER_MAXDEPTH];
+#define ROUTING_HIERARCHY_MAXDEPTH 16 /* increase if it is not enough */
+ simgrid::surf::As *path_src[ROUTING_HIERARCHY_MAXDEPTH];
+ simgrid::surf::As *path_dst[ROUTING_HIERARCHY_MAXDEPTH];
int index_src = 0;
int index_dst = 0;
- simgrid::surf::As *current;
simgrid::surf::As *current_src;
simgrid::surf::As *current_dst;
simgrid::surf::As *father;
- /* (1) find the as where the src and dst are located */
- sg_netcard_t src_data = src;
- sg_netcard_t dst_data = dst;
- src_as = src_data->containingAS();
- dst_as = dst_data->containingAS();
-#ifndef NDEBUG
- char* src_name = src_data->name();
- char* dst_name = dst_data->name();
-#endif
+ /* (1) find the path to root of src and dst*/
+ simgrid::surf::As *src_as = src->containingAS();
+ simgrid::surf::As *dst_as = dst->containingAS();
- xbt_assert(src_as && dst_as,
- "Ask for route \"from\"(%s) or \"to\"(%s) no found", src_name, dst_name);
+ xbt_assert(src_as, "Host %s must be in an AS", src->name());
+ xbt_assert(dst_as, "Host %s must be in an AS", dst->name());
/* (2) find the path to the root routing component */
- for (current = src_as; current != NULL; current = current->father_) {
- if (index_src >= ELEMENTS_FATHER_MAXDEPTH)
- xbt_die("ELEMENTS_FATHER_MAXDEPTH should be increased for path_src");
+ for (simgrid::surf::As *current = src_as; current != NULL; current = current->father_) {
+ if (index_src >= ROUTING_HIERARCHY_MAXDEPTH)
+ xbt_die("ROUTING_HIERARCHY_MAXDEPTH should be increased for element %s", src->name());
path_src[index_src++] = current;
}
- for (current = dst_as; current != NULL; current = current->father_) {
- if (index_dst >= ELEMENTS_FATHER_MAXDEPTH)
- xbt_die("ELEMENTS_FATHER_MAXDEPTH should be increased for path_dst");
+ for (simgrid::surf::As *current = dst_as; current != NULL; current = current->father_) {
+ if (index_dst >= ROUTING_HIERARCHY_MAXDEPTH)
+ xbt_die("ROUTING_HIERARCHY_MAXDEPTH should be increased for path_dst");
path_dst[index_dst++] = current;
}
*res_src = current_src; /* second the first different father of src */
*res_dst = current_dst; /* three the first different father of dst */
-#undef ELEMENTS_FATHER_MAXDEPTH
+#undef ROUTING_HIERARCHY_MAXDEPTH
}
-/* Global Business methods */
-
/**
- * \brief Recursive function for get_route_latency
+ * \brief Recursive function for get_route_and_latency
*
* \param src the source host name
* \param dst the destination host name
* \param *route the route where the links are stored. It is either NULL or a ready to use dynar
* \param *latency the latency, if needed
*
- * This function is called by "get_route" and "get_latency". It allows to walk
- * recursively through the ASes tree.
+ * This function is called by "get_route" and "get_latency". It allows to walk recursively through the ASes tree.
*/
-static void _get_route_and_latency(
- simgrid::surf::NetCard *src, simgrid::surf::NetCard *dst,
+static void _get_route_and_latency(simgrid::surf::NetCard *src, simgrid::surf::NetCard *dst,
xbt_dynar_t * links, double *latency)
{
s_sg_platf_route_cbarg_t route = SG_PLATF_ROUTE_INITIALIZER;
XBT_DEBUG("elements_father: common father '%s' src_father '%s' dst_father '%s'",
common_father->name_, src_father->name_, dst_father->name_);
- /* Check whether a direct bypass is defined */
- sg_platf_route_cbarg_t e_route_bypass = NULL;
- //FIXME:REMOVE:if (common_father->get_bypass_route)
-
- e_route_bypass = common_father->getBypassRoute(src, dst, latency);
-
- /* Common ancestor is kind enough to declare a bypass route from src to dst -- use it and bail out */
- if (e_route_bypass) {
- xbt_dynar_merge(links, &e_route_bypass->link_list);
- routing_route_free(e_route_bypass);
+ /* Check whether a direct bypass is defined. If so, use it and bail out */
+ sg_platf_route_cbarg_t bypassed_route = common_father->getBypassRoute(src, dst, latency);
+ if (bypassed_route) {
+ xbt_dynar_merge(links, &bypassed_route->link_list);
+ routing_route_free(bypassed_route);
return;
}
if (src_father == dst_father) { /* SURF_ROUTING_BASE */
route.link_list = *links;
common_father->getRouteAndLatency(src, dst, &route, latency);
- // if vivaldi latency+=vivaldi(src,dst)
return;
}
/* Not in the same AS, no bypass. We'll have to find our path between the ASes recursively*/
route.link_list = xbt_dynar_new(sizeof(Link*), NULL);
- // Find the net_card corresponding to father
- simgrid::surf::NetCard *src_father_netcard = src_father->netcard_;
- simgrid::surf::NetCard *dst_father_netcard = dst_father->netcard_;
-
- common_father->getRouteAndLatency(src_father_netcard, dst_father_netcard,
- &route, latency);
+ common_father->getRouteAndLatency(src_father->netcard_, dst_father->netcard_, &route, latency);
xbt_assert((route.gw_src != NULL) && (route.gw_dst != NULL),
"bad gateways for route from \"%s\" to \"%s\"", src->name(), dst->name());
- sg_netcard_t src_gateway_net_elm = route.gw_src;
- sg_netcard_t dst_gateway_net_elm = route.gw_dst;
-
/* If source gateway is not our source, we have to recursively find our way up to this point */
- if (src != src_gateway_net_elm)
- _get_route_and_latency(src, src_gateway_net_elm, links, latency);
+ if (src != route.gw_src)
+ _get_route_and_latency(src, route.gw_src, links, latency);
xbt_dynar_merge(links, &route.link_list);
/* If dest gateway is not our destination, we have to recursively find our way from this point */
- if (dst_gateway_net_elm != dst)
- _get_route_and_latency(dst_gateway_net_elm, dst, links, latency);
+ if (route.gw_dst != dst)
+ _get_route_and_latency(route.gw_dst, dst, links, latency);
}
}
_get_route_and_latency(src, dst, route, latency);
-
- xbt_assert(!latency || *latency >= 0.0,
- "negative latency on route between \"%s\" and \"%s\"", src->name(), dst->name());
}
-xbt_dynar_t RoutingPlatf::getOneLinkRoutes(){
- return recursiveGetOneLinkRoutes(root_);
-}
-
-xbt_dynar_t RoutingPlatf::recursiveGetOneLinkRoutes(As *rc)
+static xbt_dynar_t _recursiveGetOneLinkRoutes(As *rc)
{
xbt_dynar_t ret = xbt_dynar_new(sizeof(Onelink*), xbt_free_f);
xbt_dict_cursor_t cursor = NULL;
AS_t rc_child;
xbt_dict_foreach(rc->sons_, cursor, key, rc_child) {
- xbt_dynar_t onelink_child = recursiveGetOneLinkRoutes(rc_child);
+ xbt_dynar_t onelink_child = _recursiveGetOneLinkRoutes(rc_child);
if (onelink_child)
xbt_dynar_merge(&ret,&onelink_child);
}
return ret;
}
+xbt_dynar_t RoutingPlatf::getOneLinkRoutes(){
+ return _recursiveGetOneLinkRoutes(root_);
+}
+
}
}