git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@6688
48e7efb5-ca39-0410-a469-
dd3cf9ba447f
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
#include "gtnets_simulator.h"
#include "gtnets_interface.h"
#include "gtnets_simulator.h"
#include "gtnets_interface.h"
+#ifdef DEBUG0
+ #undef DEBUG0
+#endif
+#include "xbt/log.h"
+#include "xbt/asserts.h"
static GTSim* gtnets_sim = 0;
static GTSim* gtnets_sim = 0;
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_gtnets_interface, surf_network_gtnets,
+ "Logging specific to the SURF network GTNetS interface");
+
+
+
// initialize the GTNetS interface and environment
int gtnets_initialize(){
// initialize the GTNetS interface and environment
int gtnets_initialize(){
- if (gtnets_sim){
- fprintf(stderr, "gtnets already initialized.\n");
- return -1;
- }
+
+ DEBUG0("Using logging.");
+
+ xbt_assert0(!gtnets_sim, "gtnets already initialized");
+
gtnets_sim = new GTSim();
return 0;
}
gtnets_sim = new GTSim();
return 0;
}
// if no flows exist, return -1.0
double gtnets_get_time_to_next_flow_completion(){
ofstream file;
// if no flows exist, return -1.0
double gtnets_get_time_to_next_flow_completion(){
ofstream file;
- file.open ("/dev/null");
- streambuf* sbuf = cout.rdbuf();
- cout.rdbuf(file.rdbuf());
- value = gtnets_sim->get_time_to_next_flow_completion();
+ if (!XBT_LOG_ISENABLED(surf_network_gtnets_interface, xbt_log_priority_debug)) {
+ file.open ("/dev/null");
+ sbuf = cout.rdbuf();
+ cout.rdbuf(file.rdbuf());
+ DEBUG0("Enable GTNetS library quite mode");
+ }else {
+ DEBUG0("Disable GTNetS library quite mode");
+ }
+ value = gtnets_sim->get_time_to_next_flow_completion();
+ if (!XBT_LOG_ISENABLED(surf_network_gtnets_interface, xbt_log_priority_debug)) {
+ cout.rdbuf(sbuf);
+ file.close();
+ }
return value;
}
// run until a flow completes (returns that flow's metadata)
int gtnets_run_until_next_flow_completion(void ***metadata, int *number_of_flows){
ofstream file;
return value;
}
// run until a flow completes (returns that flow's metadata)
int gtnets_run_until_next_flow_completion(void ***metadata, int *number_of_flows){
ofstream file;
- file.open ("/dev/null");
- streambuf* sbuf = cout.rdbuf();
- cout.rdbuf(file.rdbuf());
- value = gtnets_sim->run_until_next_flow_completion(metadata, number_of_flows);
+ if (!XBT_LOG_ISENABLED(surf_network_gtnets_interface, xbt_log_priority_debug)) {
+ file.open ("/dev/null");
+ sbuf = cout.rdbuf();
+ cout.rdbuf(file.rdbuf());
+ DEBUG0("Enable GTNetS library quite mode");
+ }else {
+ DEBUG0("Disable GTNetS library quite mode");
+ }
+ value = gtnets_sim->run_until_next_flow_completion(metadata, number_of_flows);
+ if (!XBT_LOG_ISENABLED(surf_network_gtnets_interface, xbt_log_priority_debug)) {
+ cout.rdbuf(sbuf);
+ file.close();
+ }
#include "gtnets_topology.h"
#include <map>
#include <vector>
#include "gtnets_topology.h"
#include <map>
#include <vector>
+#ifdef DEBUG0
+ #undef DEBUG0
+#endif
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_gtnets_simulator, surf_network_gtnets,
+ "Logging specific to the SURF network GTNetS simulator");
+
}
int GTSim::add_router(int id){
}
int GTSim::add_router(int id){
- if (topo_->add_router(id) < 0){
- fprintf(stderr, "can't add router %d. already exists.\n", id);
- return -1;
- }
+ xbt_assert1(!(topo_->add_router(id) < 0), "can't add router %d. already exists", id);
}
//bandwidth: in bytes.
//latency: in seconds.
int GTSim::add_link(int id, double bandwidth, double latency){
double bw = bandwidth * 8; //Bandwidth in bits (used in GTNETS).
}
//bandwidth: in bytes.
//latency: in seconds.
int GTSim::add_link(int id, double bandwidth, double latency){
double bw = bandwidth * 8; //Bandwidth in bits (used in GTNETS).
- if (topo_->add_link(id) < 0){
- fprintf(stderr, "can't add link %d. already exists.\n", id);
- return -1;
- }
+ xbt_assert1(!(topo_->add_link(id) < 0),"Can't add link %d. already exists", id);
+ DEBUG3("Creating a new P2P, linkid %d, bandwidth %gl, latency %gl", id, bandwidth, latency);
gtnets_links_[id] = new Linkp2p(bw, latency);
return 0;
}
gtnets_links_[id] = new Linkp2p(bw, latency);
return 0;
}
}
int GTSim::add_onehop_route(int src, int dst, int link){
}
int GTSim::add_onehop_route(int src, int dst, int link){
- if (topo_->add_onehop_route(src, dst, link) < 0){
- fprintf(stderr, "Cannot add a route, src: %d, dst: %d, link: %d\n",
- src, dst, link);
- return -1;
- }
+ xbt_assert3(!(topo_->add_onehop_route(src, dst, link) < 0), "Cannot add a route, src: %d, dst: %d, link: %d", src, dst, link);
return 0;
}
// Generate the gtnets nodes according to topo_.
void GTSim::add_nodes(){
static unsigned int address = IPAddr("192.168.0.1");
return 0;
}
// Generate the gtnets nodes according to topo_.
void GTSim::add_nodes(){
static unsigned int address = IPAddr("192.168.0.1");
+ IPAddr helper = IPAddr();
vector<GTNETS_Node*> nodes = topo_->nodes();
vector<GTNETS_Node*>::iterator it;
int id;
vector<GTNETS_Node*> nodes = topo_->nodes();
vector<GTNETS_Node*>::iterator it;
int id;
id = (*it)->id();
gtnets_nodes_[id] = new Node();
gtnets_nodes_[id]->SetIPAddr(address++);
id = (*it)->id();
gtnets_nodes_[id] = new Node();
gtnets_nodes_[id]->SetIPAddr(address++);
- // printf("In GTSim, add_node: %d\n", id);
+ DEBUG2("In GTSim, add_node: %d, with IPAddr %s", id, helper.ToDotted(address-1));
+
gtnets_nodes_[srcid]->
AddDuplexLink(gtnets_nodes_[dstid], *(gtnets_links_[linkid]));
gtnets_nodes_[srcid]->
AddDuplexLink(gtnets_nodes_[dstid], *(gtnets_links_[linkid]));
+ DEBUG3("Setting DuplexLink, src %d, dst %d, linkid %d", srcid, dstid, linkid);
int src_node = topo_->nodeid_from_hostid(src);
int dst_node = topo_->nodeid_from_hostid(dst);
int src_node = topo_->nodeid_from_hostid(src);
int dst_node = topo_->nodeid_from_hostid(dst);
- if (gtnets_nodes_.find(src_node) == gtnets_nodes_.end()){
- fprintf(stderr, "node %d not found\n", src_node);
- return -1;
- }
- if (gtnets_nodes_.find(dst_node) == gtnets_nodes_.end()){
- fprintf(stderr, "node %d not found\n", dst_node);
- return -1;
- }
+ xbt_assert1(!(gtnets_nodes_.find(src_node) == gtnets_nodes_.end()), "Node %d not found", src_node);
+ xbt_assert1(!(gtnets_nodes_.find(dst_node) == gtnets_nodes_.end()), "Node %d not found", dst_node);
Node* tmpsrc = gtnets_nodes_[src_node];
Node* tmpdst = gtnets_nodes_[dst_node];
Node* tmpsrc = gtnets_nodes_[src_node];
Node* tmpdst = gtnets_nodes_[dst_node];
cur_node = src_node;
for (int i = 0; i < nlink; i++){
cur_node = src_node;
for (int i = 0; i < nlink; i++){
- if (gtnets_nodes_.find(cur_node) == gtnets_nodes_.end()){
- fprintf(stderr, "node %d not found\n", cur_node);
- return -1;
- }
+ xbt_assert1(!(gtnets_nodes_.find(cur_node) == gtnets_nodes_.end()), "Node %d not found", cur_node);
next_node = topo_->peer_node_id(links[i], cur_node);
next_node = topo_->peer_node_id(links[i], cur_node);
- if (next_node < 0){
- fprintf(stderr, "peer node not found\n");
- return -1;
- }
- if (gtnets_nodes_.find(next_node) == gtnets_nodes_.end()){
- fprintf(stderr, "node %d not found\n", next_node);
- return -1;
- }
+ xbt_assert0(!(next_node < 0), "Peer node not found");
+ xbt_assert1(!(gtnets_nodes_.find(next_node) == gtnets_nodes_.end()), "Node %d not found", next_node);
//add route
Node* tmpcur = gtnets_nodes_[cur_node];
//add route
Node* tmpcur = gtnets_nodes_[cur_node];
- if (cur_node != dst_node){
- fprintf(stderr, "Route inconsistency, last: %d, dst: %d\n",
- cur_node, dst_node);
- return -1;
- }
+ xbt_assert2(!(cur_node != dst_node), "Route inconsistency, last: %d, dst: %d",cur_node, dst_node);
}
int src_node = topo_->nodeid_from_hostid(src);
}
int src_node = topo_->nodeid_from_hostid(src);
- if (src_node < 0){
- fprintf(stderr, "src %d not found\n");
- return -1;
- }
+ xbt_assert1(!(src_node < 0), "Src %d not found", src_node);
+
int dst_node = topo_->nodeid_from_hostid(dst);
int dst_node = topo_->nodeid_from_hostid(dst);
- if (dst_node < 0){
- fprintf(stderr, "dst %d not found\n");
- return -1;
- }
+ xbt_assert1(!(dst_node < 0), "Dst %d not found", dst_node);
gtnets_servers_[nflow_] = (TCPServer*) gtnets_nodes_[dst_node]->
AddApplication(TCPServer(TCPReno()));
gtnets_servers_[nflow_] = (TCPServer*) gtnets_nodes_[dst_node]->
AddApplication(TCPServer(TCPReno()));
//Temporary classes for generating GTNetS topology
#include "gtnets_topology.h"
//Temporary classes for generating GTNetS topology
#include "gtnets_topology.h"
+#ifdef DEBUG0
+ #undef DEBUG0
+#endif
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_gtnets_topology, surf_network_gtnets,
+ "Logging specific to the SURF network GTNetS simulator");
// hostid = network_card_id
int GTNETS_Node::add_host(int hostid){
// 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_assert0(!(is_router_), "Cannot add a host to a router node");
hosts_.insert(hostid);
return 0;
}
hosts_.insert(hostid);
return 0;
}
// Add a router. If this node already has a router/host,
// return -1.
int GTNETS_Node::add_router(int routerid){
// 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_assert0(!(hosts_.size() > 1), "Router node should have only one router");
+ xbt_assert1(((hosts_.size() == 1)&&(hosts_.find(routerid) != hosts_.end())), "Node %d is a different router", routerid);
is_router_ = true;
hosts_.insert(routerid);
return 0;
is_router_ = true;
hosts_.insert(routerid);
return 0;
void GTNETS_Node::print_hosts(){
set<int>::iterator it;
void GTNETS_Node::print_hosts(){
set<int>::iterator it;
for (it = hosts_.begin(); it != hosts_.end(); it++){
for (it = hosts_.begin(); it != hosts_.end(); it++){
+ DEBUG1(" host id %d", *it);
}
void GTNETS_Link::print_link_status(){
}
void GTNETS_Link::print_link_status(){
- printf("== LINKID: %d\n", ID_);
+ DEBUG1(" link id: %d", ID_);
- printf(" [SRC] ID: %d, router?: %d, hosts[]: ",
- src_node_->id(), src_node_->is_router());
+ DEBUG2(" [src] id: %d, is it router?: %d, host list: ",src_node_->id(), src_node_->is_router());
src_node_->print_hosts();
src_node_->print_hosts();
- printf(" [DST] ID: %d, router?: %d, hosts[]: ",
- dst_node_->id(), dst_node_->is_router());
+ DEBUG2(" [dst] id: %d, is it router?: %d, host list: ",dst_node_->id(), dst_node_->is_router());
dst_node_->print_hosts();
dst_node_->print_hosts();
// return the peer node id
int GTNETS_Link::peer_node(int cur_id){
// return the peer node id
int GTNETS_Link::peer_node(int cur_id){
+ xbt_assert0(((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();
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){
}
int GTNETS_Link::add_src(GTNETS_Node* src){
int GTNETS_Topology::add_link(int id){
map<int,GTNETS_Link*>::iterator iter = links_.find(id);
int GTNETS_Topology::add_link(int id){
map<int,GTNETS_Link*>::iterator iter = links_.find(id);
+ xbt_assert1((iter == links_.end()), "Link %d already exists", id);
if(iter == links_.end()) {
GTNETS_Link* link= new GTNETS_Link(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));
- return 0;
- }else{
- fprintf(stderr, "Link %d already exists.\n", id);
- return -1;
}
int GTNETS_Topology::add_router(int id){
set<int>::iterator iter = routers_.find(id);
}
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;
- }else{
- fprintf(stderr, "Router %d already exists.\n", id);
- return -1;
- }
+ xbt_assert1((iter == routers_.end()), "Router %d already exists", id);
+ routers_.insert(id);
+ return 0;
}
bool GTNETS_Topology::is_router(int id){
}
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){
//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];
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_assert1((link), "Link %d not found", linkid);
+ xbt_assert1(!((cur_id < 0) || (cur_id > nodes_.size()-1)), "Node %d not found", cur_id);
+
int peer = link->peer_node(nodes_[cur_id]->id());
int peer = link->peer_node(nodes_[cur_id]->id());
- if (peer < 0){
- fprintf(stderr, "peer not found\n");
- return -1;
- }
+ xbt_assert0(!(peer < 0), "Peer not found");
+
map<int, GTNETS_Link*>::iterator iter = links_.find(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_assert1(!(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());
+ DEBUG4("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();
GTNETS_Node *src_node, *dst_node;
src_node = link->src_node();
dst_node = link->dst_node();
+ if (XBT_LOG_ISENABLED(surf_network_gtnets_topology, xbt_log_priority_debug)) {
+ link->print_link_status();
+ src_node->print_hosts();
+ dst_node->print_hosts();
+ }
+
+ xbt_assert0((src_node && dst_node), "Either src or dst is null");
// If not exists a route, add one.
if (!link->route_exists()){
// If not exists a route, add one.
if (!link->route_exists()){
nodes_[d_node_id]->add_host(dst);
link->add_dst(nodes_[d_node_id]);
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;
}
// case 1: link has two routers
}
// case 1: link has two routers
int tmpsrc2 = nodeid_from_hostid(src);
int tmpdst1 = dst_node->id();
int tmpdst2 = nodeid_from_hostid(dst);
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_assert0( (((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;
// case 2: link has one router and one host
else if (src_node->is_router() && !dst_node->is_router()){
int newsrc, newdst;
+ xbt_assert0( ((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;
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_assert0(!(src_node->id() != nodeid_from_hostid(newsrc)), "The router should be identical");
//now, to add dst to dst_node, dst should be a host.
//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_assert1(!(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);
if (!dst_node->include(newdst)){
dst_node->add_host(newdst);
}
else if (!src_node->is_router() && dst_node->is_router()){
int newsrc, newdst;
}
else if (!src_node->is_router() && dst_node->is_router()){
int newsrc, newdst;
+ xbt_assert0(((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;
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_assert0(!(dst_node->id() != hosts_[newdst]), "The router should be identical");
//now, to add dst to src_node, dst should be a host.
//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_assert1(!(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);
if (!src_node->include(newsrc)){
src_node->add_host(newsrc);
// case 3: link has two hosts
else if (!src_node->is_router() && !dst_node->is_router()){
// 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_assert0(!(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)){
//if both are hosts, the order doesn't matter.
if (src_node->include(src)){
if (dst_node->include(dst)){
- 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)){
}
}else if (src_node->include(dst)){
if (dst_node->include(src)){
- 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)){
}
}else if (dst_node->include(src)){
if (src_node->include(dst)){
- 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)){
}
}else if (dst_node->include(dst)){
if (src_node->include(src)){
- 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);
}
}else{
src_node->add_host(src);
- fprintf(stderr, "Shouldn't be here\n");
- return -1;
+ xbt_assert0(0, "Shouldn't be here");
}
void GTNETS_Topology::print_topology(){
}
void GTNETS_Topology::print_topology(){
- printf("<<<<<================================>>>>>\n");
- printf("Dumping GTNETS topollogy information\n");
+ DEBUG0("<<<<<================================>>>>>");
+ DEBUG0("Dumping GTNETS topollogy information");
map<int, GTNETS_Link*>::iterator it;
for (it = links_.begin(); it != links_.end(); it++){
it->second->print_link_status();
}
map<int, GTNETS_Link*>::iterator it;
for (it = links_.begin(); it != links_.end(); it++){
it->second->print_link_status();
}
- printf(">>>>>================================<<<<<\n");
+ DEBUG0(">>>>>================================<<<<<");