From: Navarrop Date: Tue, 20 Sep 2011 11:18:16 +0000 (+0200) Subject: Rewrite the way to use dict_socket. X-Git-Tag: v3_6_2~79 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/617f1dfa78a7a139b7a7d6262c2b55e42e259e44 Rewrite the way to use dict_socket. Fix a segfault due to bad use of genrated key from Socket pointer. --- diff --git a/src/surf/network_ns3.c b/src/surf/network_ns3.c index 0b56f0fb7a..595dfc5da3 100644 --- a/src/surf/network_ns3.c +++ b/src/surf/network_ns3.c @@ -408,6 +408,7 @@ static void finalize(void) { ns3_finalize(); xbt_dynar_free_container(&IPV4addr); + xbt_dict_free(&dict_socket); } static double ns3_share_resources(double min) @@ -483,6 +484,7 @@ static void ns3_update_actions_state(double now, double delta) if(ns3_get_socket_is_finished(data) == 1){ xbt_dynar_push(socket_to_destroy,&key); + XBT_DEBUG("Destroy socket %p of action %p", key, action); action->generic_action.finish = now; surf_action_state_set(&(action->generic_action), SURF_ACTION_DONE); } diff --git a/src/surf/ns3/ns3_interface.cc b/src/surf/ns3/ns3_interface.cc index eed590cb9a..50d724cc3c 100644 --- a/src/surf/ns3/ns3_interface.cc +++ b/src/surf/ns3/ns3_interface.cc @@ -103,7 +103,7 @@ int ns3_initialize(const char* TcpProtocol){ Config::SetDefault ("ns3::TcpSocket::DelAckCount", UintegerValue (1)); #ifdef _HAVE_NS3_RED - XBT_INFO("Using RED version of ns3"); + XBT_DEBUG("Using RED version of ns3"); #endif if(!strcmp(TcpProtocol,"default")){ return 0; @@ -201,6 +201,7 @@ void * ns3_add_cluster(char * bw,char * lat,char *id) XBT_DEBUG("Assign IP Addresses %s to CSMA.",adr); Ipv4AddressHelper ipv4; ipv4.SetBase (adr, "255.255.0.0"); + free(adr); interfaces.Add(ipv4.Assign (devices)); if(number_of_links == 255){ @@ -224,9 +225,7 @@ static char* transformIpv4Address (Ipv4Address from){ std::stringstream sstream; sstream << from ; std::string s = sstream.str(); - size_t size = s.size() + 1; - char* IPaddr = bprintf("%s",s.c_str()); - return IPaddr; + return bprintf("%s",s.c_str()); } void * ns3_add_link(int src, e_ns3_network_element_type_t type_src, diff --git a/src/surf/ns3/ns3_simulator.cc b/src/surf/ns3/ns3_simulator.cc index 188bea1310..c705984056 100644 --- a/src/surf/ns3/ns3_simulator.cc +++ b/src/surf/ns3/ns3_simulator.cc @@ -15,6 +15,7 @@ using namespace std; xbt_dict_t dict_socket = NULL; NS3Sim SimulatorNS3; +static char socket_key[24]; static void receive_callback(Ptr localSocket); static void send_callback(Ptr localSocket, uint32_t txSpace); @@ -33,6 +34,13 @@ NS3Sim::NS3Sim(){ NS3Sim::~NS3Sim(){ } +static XBT_INLINE void transformSocketPtr (Ptr localSocket){ + std::stringstream sstream; + sstream << localSocket ; + std::string s = sstream.str(); + sprintf(socket_key,"%s",s.c_str()); +} + /* * This function create a flow from src to dst * @@ -59,6 +67,7 @@ void NS3Sim::create_flow_NS3( InetSocketAddress (Ipv4Address::GetAny(), port_number)); sink.Install (dst); + Ptr sock = Socket::CreateSocket (src, TcpSocketFactory::GetTypeId()); @@ -69,9 +78,13 @@ void NS3Sim::create_flow_NS3( mysocket->sentBytes = 0; mysocket->finished = 0; mysocket->action = action; - xbt_dict_set(dict_socket,(const char*)&sock, mysocket,NULL); + + transformSocketPtr(sock); + xbt_dict_set(dict_socket,socket_key, mysocket,free); + sock->Bind(InetSocketAddress(port_number)); - XBT_INFO("Create flow starting to %fs + %fs = %fs",start-ns3_time(), ns3_time(), start); + XBT_DEBUG("Create flow starting to %fs + %fs = %fs",start-ns3_time(), ns3_time(), start); + Simulator::Schedule (Seconds(start-ns3_time()),&StartFlow, sock, addr, port_number); // Simulator::Schedule (Seconds(0.0),&StartFlow, sock, addr, port_number); @@ -100,8 +113,13 @@ void NS3Sim::simulator_start(double min){ Simulator::Run (); } +static MySocket* get_my_socket(Ptr localSocket) { + transformSocketPtr(localSocket); + return (MySocket*)xbt_dict_get_or_null(dict_socket,socket_key); +} + static void receive_callback(Ptr localSocket){ - MySocket* mysocket = (MySocket*)xbt_dict_get_or_null(dict_socket,(char*)&localSocket); + MySocket* mysocket = get_my_socket(localSocket); if (mysocket->finished == 0){ mysocket->finished = 1; @@ -114,7 +132,7 @@ static void receive_callback(Ptr localSocket){ static void send_callback(Ptr localSocket, uint32_t txSpace){ uint8_t *data = (uint8_t*)malloc(sizeof(uint8_t)*txSpace); - MySocket* mysocket = (MySocket*)xbt_dict_get_or_null(dict_socket,(char*)&localSocket); + MySocket* mysocket = get_my_socket(localSocket); if (mysocket->remaining == 0){ //all data was already buffered (and socket was already closed), just return return; @@ -124,7 +142,7 @@ static void send_callback(Ptr localSocket, uint32_t txSpace){ { uint32_t toWrite = min ((mysocket->remaining), txSpace); toWrite = min (toWrite, localSocket->GetTxAvailable ()); - int amountSent = localSocket->Send (&data[0], toWrite, 0); + int amountSent = localSocket->Send (data, toWrite, 0); if(amountSent < 0) return; @@ -133,36 +151,39 @@ static void send_callback(Ptr localSocket, uint32_t txSpace){ XBT_DEBUG("send_cb of F[%p, %p, %d] (%d/%d) %d buffered", mysocket, mysocket->action, mysocket->totalBytes, mysocket->remaining, mysocket->totalBytes, amountSent); } + + free(data); + if ((mysocket->sentBytes) >= mysocket->totalBytes){ localSocket->Close(); } } static void datasent_callback(Ptr localSocket, uint32_t dataSent){ - MySocket* mysocket = (MySocket*)xbt_dict_get_or_null(dict_socket,(char*)&localSocket); + MySocket* mysocket = get_my_socket(localSocket); mysocket->sentBytes += dataSent; XBT_DEBUG("datasent_cb of F[%p, %p, %d] %d sent", mysocket, mysocket->action, mysocket->totalBytes, dataSent); } static void normalClose_callback(Ptr localSocket){ - MySocket* mysocket = (MySocket*)xbt_dict_get_or_null(dict_socket,(char*)&localSocket); + MySocket* mysocket = get_my_socket(localSocket); XBT_DEBUG("normalClose_cb of F[%p, %p, %d]", mysocket, mysocket->action, mysocket->totalBytes); receive_callback (localSocket); } static void errorClose_callback(Ptr localSocket){ - MySocket* mysocket = (MySocket*)xbt_dict_get_or_null(dict_socket,(char*)&localSocket); + MySocket* mysocket = get_my_socket(localSocket); XBT_DEBUG("errorClose_cb of F[%p, %p, %d]", mysocket, mysocket->action, mysocket->totalBytes); xbt_die("NS3: a socket was closed anormally"); } static void succeededConnect_callback(Ptr localSocket){ - MySocket* mysocket = (MySocket*)xbt_dict_get_or_null(dict_socket,(char*)&localSocket); + MySocket* mysocket = get_my_socket(localSocket); XBT_DEBUG("succeededConnect_cb of F[%p, %p, %d]", mysocket, mysocket->action, mysocket->totalBytes); } static void failedConnect_callback(Ptr localSocket){ - MySocket* mysocket = (MySocket*)xbt_dict_get_or_null(dict_socket,(char*)&localSocket); + MySocket* mysocket = get_my_socket(localSocket); XBT_DEBUG("failedConnect_cb of F[%p, %p, %d]", mysocket, mysocket->action, mysocket->totalBytes); xbt_die("NS3: a socket failed to connect"); } @@ -180,6 +201,6 @@ static void StartFlow(Ptr sock, sock->SetConnectCallback (MakeCallback (&succeededConnect_callback), MakeCallback (&failedConnect_callback)); sock->SetCloseCallbacks (MakeCallback (&normalClose_callback), MakeCallback (&errorClose_callback)); - MySocket* mysocket = (MySocket*)xbt_dict_get_or_null(dict_socket,(char*)&sock); + MySocket* mysocket = get_my_socket(sock); XBT_DEBUG("startFlow_cb of F[%p, %p, %d] dest=%s port=%d", mysocket, mysocket->action, mysocket->totalBytes, to, port_number); }