X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/617f1dfa78a7a139b7a7d6262c2b55e42e259e44..a2d035fb70a8f91afefa8f91db2f65c2389d7eae:/src/surf/ns3/ns3_simulator.cc diff --git a/src/surf/ns3/ns3_simulator.cc b/src/surf/ns3/ns3_simulator.cc index c705984056..5e2c1084ba 100644 --- a/src/surf/ns3/ns3_simulator.cc +++ b/src/surf/ns3/ns3_simulator.cc @@ -61,7 +61,7 @@ void NS3Sim::create_flow_NS3( uint32_t totalBytes, void * action) { - if(!dict_socket) dict_socket = xbt_dict_new(); + if(!dict_socket) dict_socket = xbt_dict_new_homogeneous(free); PacketSinkHelper sink ("ns3::TcpSocketFactory", InetSocketAddress (Ipv4Address::GetAny(), @@ -80,7 +80,7 @@ void NS3Sim::create_flow_NS3( mysocket->action = action; transformSocketPtr(sock); - xbt_dict_set(dict_socket,socket_key, mysocket,free); + xbt_dict_set(dict_socket,socket_key, mysocket,NULL); sock->Bind(InetSocketAddress(port_number)); XBT_DEBUG("Create flow starting to %fs + %fs = %fs",start-ns3_time(), ns3_time(), start); @@ -131,13 +131,16 @@ 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 = get_my_socket(localSocket); + if (mysocket->remaining == 0){ //all data was already buffered (and socket was already closed), just return return; } - while (mysocket->sentBytes < mysocket->totalBytes + + uint8_t *data = (uint8_t*)malloc(sizeof(uint8_t)*txSpace); + + while (mysocket->bufferedBytes < mysocket->totalBytes && localSocket->GetTxAvailable () > 0) { uint32_t toWrite = min ((mysocket->remaining), txSpace); @@ -146,15 +149,15 @@ static void send_callback(Ptr localSocket, uint32_t txSpace){ if(amountSent < 0) return; - (mysocket->sentBytes) += amountSent; - (mysocket->remaining) -= amountSent; + (mysocket->bufferedBytes) += amountSent; + (mysocket->remaining) -= amountSent; 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){ + if ((mysocket->bufferedBytes) >= mysocket->totalBytes){ localSocket->Close(); } }