Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of scm.gforge.inria.fr:/gitroot/simgrid/simgrid
[simgrid.git] / src / surf / gtnets / gtnets_topology.cc
index 09e2f26..d3f2f13 100644 (file)
@@ -1,5 +1,3 @@
-/* $ID$ */
-
 /* Copyright (c) 2007 Kayo Fujiwara. All rights reserved.                  */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -9,6 +7,15 @@
 //Temporary classes for generating GTNetS topology
 
 #include "gtnets_topology.h"
+#ifdef XBT_DEBUG
+       #undef XBT_DEBUG
+#endif
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+#include <stdio.h> //for fflush in print_topology
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_gtnets_topology, surf_network_gtnets,
+                                "Logging specific to the SURF network GTNetS simulator");
 
 // 
 //  GTNETS_Node
@@ -29,10 +36,7 @@ GTNETS_Node::~GTNETS_Node(){
 
 // hostid = network_card_id
 int GTNETS_Node::add_host(int hostid){
-  if (is_router_){
-    fprintf(stderr, "Cannot add a host to a router node.\n");
-    return -1;
-  }
+  xbt_assert(!(is_router_), "Cannot add a host to a router node");
   hosts_.insert(hostid);
   return 0;
 }
@@ -40,17 +44,10 @@ int GTNETS_Node::add_host(int hostid){
 // Add a router. If this node already has a router/host,
 // return -1.
 int GTNETS_Node::add_router(int routerid){
-  if (hosts_.size() > 1){
-    fprintf(stderr, "Router node should have only one router.\n");
-    return -1;
-  }else if (hosts_.size() == 1){
-    if (hosts_.find(routerid) != hosts_.end()){
-      //printf("the router already exists\n");
-      return 0;
-    }else{
-      fprintf(stderr, "Node %d is a different router.\n");
-      return -1;
-    }
+  xbt_assert(!(hosts_.size() > 1), "Router node should have only one router");
+  if (hosts_.size() == 1){
+         xbt_assert((hosts_.find(routerid) != hosts_.end()), "Node %d is a different router", routerid);
+         return 0;
   }
   is_router_ = true;
   hosts_.insert(routerid);
@@ -68,11 +65,9 @@ bool GTNETS_Node::include(int hostid){
 
 void GTNETS_Node::print_hosts(){
   set<int>::iterator it;
-  printf("[");
   for (it = hosts_.begin(); it != hosts_.end(); it++){
-    printf(" %d", *it);
+    XBT_DEBUG("host id %d", *it);
   }
-  printf("]");
 }
 
 //
@@ -99,19 +94,13 @@ GTNETS_Link::~GTNETS_Link(){
 }
 
 void GTNETS_Link::print_link_status(){
-  printf("== LINKID: %d\n", ID_);
+  XBT_DEBUG("****** link id: %d", ID_);
   if (src_node_){
-    printf("  [SRC] ID: %d, router?: %d, hosts[]: ",
-          src_node_->id(), src_node_->is_router());
-    src_node_->print_hosts();
-    printf("\n");
+    XBT_DEBUG("[src] id: %d, is it router?: %d",src_node_->id(), src_node_->is_router());
   }
 
   if (dst_node_){
-    printf("  [DST] ID: %d, router?: %d, hosts[]: ", 
-          dst_node_->id(), dst_node_->is_router());
-    dst_node_->print_hosts();
-    printf("\n");
+    XBT_DEBUG("[dst] id: %d, is it router?: %d",dst_node_->id(), dst_node_->is_router());
   }
 }
 
@@ -130,12 +119,10 @@ bool GTNETS_Link::route_exists(){
 
 // return the peer node id
 int GTNETS_Link::peer_node(int cur_id){
+  xbt_assert(((cur_id ==  src_node_->id())||(cur_id == dst_node_->id())), "Node not found");
+
   if (cur_id ==  src_node_->id()) return dst_node_->id();
   else if (cur_id == dst_node_->id()) return src_node_->id();
-  else {
-    fprintf(stderr, "node not found\n");
-    return -1;
-  }
 }
 
 int GTNETS_Link::add_src(GTNETS_Node* src){
@@ -179,30 +166,23 @@ int GTNETS_Topology::node_size(){
 
 int GTNETS_Topology::add_link(int id){
   map<int,GTNETS_Link*>::iterator iter = links_.find(id);
+  xbt_assert((iter == links_.end()), "Link %d already exists", id);
 
   if(iter == links_.end()) {
     GTNETS_Link* link= new GTNETS_Link(id);
-    //printf("link %d is added: %d\n", id, link->id());
-    //links_.insert(make_pair(id, link));
     links_[id] = link;
-    return 0;
-  }else{
-    fprintf(stderr, "Link %d already exists.\n", id);
-    return -1;
   }
+  return 0;
 }
 
 int GTNETS_Topology::add_router(int id){
   set<int>::iterator iter = routers_.find(id);
-
-  if(iter == routers_.end()) {
-    //printf("router %d is inserted\n", id);
-    routers_.insert(id);
-    return 0;
+  if(iter == routers_.end()){
+         routers_.insert(id);
   }else{
-    fprintf(stderr, "Router %d already exists.\n", id);
-    return -1;
+         XBT_DEBUG("Router (#%d) already exists", id);
   }
+  return 0;
 }
 
 bool GTNETS_Topology::is_router(int id){
@@ -213,21 +193,13 @@ bool GTNETS_Topology::is_router(int id){
 
 //return the node id of the peer of cur_id by linkid.
 int GTNETS_Topology::peer_node_id(int linkid, int cur_id){
-  //printf("linkid: %d, cur_id: %d\n", linkid, cur_id);
   GTNETS_Link* link = links_[linkid];
-  if (!link) {
-    fprintf(stderr, "link %d not found\n", linkid);
-    return -1;
-  }
-  if ((cur_id < 0) || (cur_id > nodes_.size()-1)){
-    fprintf(stderr, "node %d not found\n", cur_id);
-    return -1;
-  }
+  xbt_assert((link), "Link %d not found", linkid);
+  xbt_assert(!((cur_id < 0) || (cur_id > nodes_.size()-1)), "Node %d not found", cur_id);
+
   int peer  = link->peer_node(nodes_[cur_id]->id());
-  if (peer < 0){
-    fprintf(stderr, "peer not found\n");
-    return -1;
-  }
+  xbt_assert(!(peer < 0), "Peer not found");
+
   return peer;
 }
 
@@ -236,24 +208,18 @@ int GTNETS_Topology::add_onehop_route(int src, int dst, int linkid){
 
   map<int, GTNETS_Link*>::iterator iter = links_.find(linkid);
 
-  if(iter == links_.end()) {
-    fprintf(stderr, "Link %d not found.\n", linkid);
-    return -1;
-  }else{
-    link = iter->second;
-  }
+  xbt_assert(!(iter == links_.end()), "Link %d not found", linkid);
+  link = iter->second;
 
-  //  printf("add_onehop_route: src: %d, dst: %d, linkid: %d, %d\n",
-  //    src, dst, linkid, link->id());
+  XBT_DEBUG("Add onehop route, src (#%d), dst (#%d), linkid %d:(#%d)",src, dst, linkid, link->id());
 
   GTNETS_Node *src_node, *dst_node;
   src_node = link->src_node();
   dst_node = link->dst_node();
 
-
   // If not exists a route, add one.
   if (!link->route_exists()){
-    //check whether there exists a node for the src host/router.
+    //check whether there exists a node for the src.
     int s_node_id = nodeid_from_hostid(src);
     int node_id;
 
@@ -289,11 +255,8 @@ int GTNETS_Topology::add_onehop_route(int src, int dst, int linkid){
       nodes_[d_node_id]->add_host(dst);
 
     link->add_dst(nodes_[d_node_id]);
-
-  // other: has either src or dst (error)
-  }else if (!src_node || !dst_node){
-    fprintf(stderr, "Either src or dst is null\n");
-    return -1;
+  }else if (!(src_node && dst_node)){
+      xbt_assert((src_node && dst_node), "Either src or dst is null");
   }
 
   // case 1: link has two routers
@@ -302,39 +265,27 @@ int GTNETS_Topology::add_onehop_route(int src, int dst, int linkid){
     int tmpsrc2 = nodeid_from_hostid(src);
     int tmpdst1 = dst_node->id();
     int tmpdst2 = nodeid_from_hostid(dst);
-    if (((tmpsrc1 == tmpsrc2) && (tmpdst1 == tmpdst2)) ||
-       ((tmpsrc1 == tmpdst2) && (tmpdst1 == tmpsrc2))){
-      fprintf(stderr, "Route already exists\n");
-    }else{
-      fprintf(stderr, "Different one hop route defined\n");
-      return -1;
-    }
+    xbt_assert( (((tmpsrc1 == tmpsrc2) && (tmpdst1 == tmpdst2)) ||
+       ((tmpsrc1 == tmpdst2) && (tmpdst1 == tmpsrc2))), "Different one hop route defined");
   }
+
   // case 2: link has one router and one host
   else if (src_node->is_router() && !dst_node->is_router()){
     int newsrc, newdst;
+    xbt_assert( ((is_router(src))||(is_router(dst))), "One of nodes should be a router");
+
     if (is_router(src)){
       newsrc = src;
       newdst = dst;
     }else if (is_router(dst)){
       newsrc = dst;
       newdst = src;
-    }else{
-      fprintf(stderr, "one of nodes should be a router\n");
-      return -1;
     }
 
-    if (src_node->id() != nodeid_from_hostid(newsrc)){
-      fprintf(stderr, "The router should be identical\n");
-      return -1;
-    }
+    xbt_assert(!(src_node->id() != nodeid_from_hostid(newsrc)), "The router should be identical");
 
     //now, to add dst to dst_node, dst should be a host.
-
-    if (is_router(newdst)){
-      fprintf(stderr, "dst %d is not an endpoint. cannot add it to dst_node\n");
-      return -1;
-    }
+    xbt_assert(!(is_router(newdst)), "Dst %d is not an endpoint. cannot add it to dst_node", newdst);
 
     if (!dst_node->include(newdst)){
       dst_node->add_host(newdst);
@@ -343,29 +294,19 @@ int GTNETS_Topology::add_onehop_route(int src, int dst, int linkid){
   }
   else if (!src_node->is_router() && dst_node->is_router()){
     int newsrc, newdst;
+    xbt_assert(((is_router(src))||(is_router(dst))), "One of nodes should be a router");
+
     if (is_router(src)){
       newsrc = dst;
       newdst = src;
     }else if (is_router(dst)){
       newsrc = src;
       newdst = dst;
-    }else{
-      fprintf(stderr, "one of nodes should be a router\n");
-      return -1;
-    }
-
-
-    if (dst_node->id() != hosts_[newdst]){
-      fprintf(stderr, "The router should be identical\n");
-      return -1;
     }
 
+    xbt_assert(!(dst_node->id() != hosts_[newdst]), "The router should be identical");
     //now, to add dst to src_node, dst should be a host.
-
-    if (is_router(newsrc)){
-      fprintf(stderr, "dst %d is not an endpoint. cannot add it to src_node\n");
-      return -1;
-    }
+    xbt_assert(!(is_router(newsrc)), "Src %d is not an endpoint. cannot add it to src_node", newsrc);
 
     if (!src_node->include(newsrc)){
       src_node->add_host(newsrc);
@@ -375,40 +316,36 @@ int GTNETS_Topology::add_onehop_route(int src, int dst, int linkid){
 
   // case 3: link has two hosts
   else if (!src_node->is_router() && !dst_node->is_router()){
-
-    if (is_router(src) || is_router(dst)){
-      fprintf(stderr, "Cannot add a router to host-host link\n");
-      return -1;
-    }
+       xbt_assert(!(is_router(src) || is_router(dst)), "Cannot add a router to host-host link");
 
     //if both are hosts, the order doesn't matter.
     if (src_node->include(src)){
       if (dst_node->include(dst)){
-       //nothing
+           //nothing
       }else{
-       dst_node->add_host(dst);
-       hosts_[dst] = dst_node->id();
+           dst_node->add_host(dst);
+           hosts_[dst] = dst_node->id();
       }
     }else if (src_node->include(dst)){
       if (dst_node->include(src)){
-       //nothing
+           //nothing
       }else{
-       dst_node->add_host(src);
-       hosts_[src] = dst_node->id();
+           dst_node->add_host(src);
+           hosts_[src] = dst_node->id();
       }
     }else if (dst_node->include(src)){
       if (src_node->include(dst)){
-       //nothing
+           //nothing
       }else{
-       src_node->add_host(dst);
-       hosts_[dst] = src_node->id();
+           src_node->add_host(dst);
+           hosts_[dst] = src_node->id();
       }
     }else if (dst_node->include(dst)){
       if (src_node->include(src)){
-       //nothing
+           //nothing
       }else{
-       src_node->add_host(src);
-       hosts_[src] = src_node->id();
+           src_node->add_host(src);
+           hosts_[src] = src_node->id();
       }
     }else{
       src_node->add_host(src);
@@ -419,9 +356,9 @@ int GTNETS_Topology::add_onehop_route(int src, int dst, int linkid){
       
   }
   else{
-    fprintf(stderr, "Shouldn't be here\n");
-    return -1;
+    xbt_die("Shouldn't be here");
   }
+
   return 0;
 }
 
@@ -433,13 +370,13 @@ int GTNETS_Topology::nodeid_from_hostid(int hostid){
 }
 
 void GTNETS_Topology::print_topology(){
-  printf("<<<<<================================>>>>>\n");
-  printf("Dumping GTNETS topollogy information\n");
+  XBT_DEBUG("<<<<<================================>>>>>");
+  XBT_DEBUG("Dumping GTNETS topollogy information");
   map<int, GTNETS_Link*>::iterator it;
   for (it = links_.begin(); it != links_.end(); it++){
     it->second->print_link_status();
   }
-  printf(">>>>>================================<<<<<\n");
+  XBT_DEBUG(">>>>>================================<<<<<");
   fflush(NULL);
 }