From acb292ef96c6533590b4adcfb7c6187f798f0f39 Mon Sep 17 00:00:00 2001 From: Frederic Suter Date: Tue, 17 Oct 2017 10:31:12 +0200 Subject: [PATCH 1/1] kill LAST dict in internals !!! hey, agier, there are some leaks in ns3 that are captured by CI. --- src/surf/network_ns3.cpp | 29 ++++++++++++++--------------- src/surf/ns3/ns3_simulator.cpp | 6 +++--- src/surf/ns3/ns3_simulator.hpp | 7 ++----- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/surf/network_ns3.cpp b/src/surf/network_ns3.cpp index c2a7839630..0272a646c6 100644 --- a/src/surf/network_ns3.cpp +++ b/src/surf/network_ns3.cpp @@ -27,7 +27,7 @@ std::vector IPV4addr; * Crude globals * *****************/ -extern xbt_dict_t flowFromSock; +extern std::map flowFromSock; static ns3::InternetStackHelper stack; static ns3::NodeContainer nodes; @@ -142,7 +142,6 @@ namespace surf { NetworkNS3Model::NetworkNS3Model() : NetworkModel() { NetPointNs3::EXTENSION_ID = simgrid::kernel::routing::NetPoint::extension_create(); - flowFromSock = xbt_dict_new_homogeneous([](void* p) { delete static_cast(p); }); ns3_initialize(ns3_tcp_model.get().c_str()); simgrid::kernel::routing::NetPoint::onCreation.connect([](simgrid::kernel::routing::NetPoint* pt) { @@ -162,7 +161,6 @@ NetworkNS3Model::~NetworkNS3Model() { for (auto const& addr : IPV4addr) free(addr); IPV4addr.clear(); - xbt_dict_free(&flowFromSock); } LinkImpl* NetworkNS3Model::createLink(const std::string& name, double bandwidth, double latency, @@ -200,7 +198,7 @@ double NetworkNS3Model::nextOccuringEvent(double now) void NetworkNS3Model::updateActionsState(double now, double delta) { - static xbt_dynar_t socket_to_destroy = xbt_dynar_new(sizeof(char*),nullptr); + static std::vector socket_to_destroy; /* If there are no running flows, advance the NS3 simulator and return */ if (getRunningActionSet()->empty()) { @@ -211,10 +209,10 @@ void NetworkNS3Model::updateActionsState(double now, double delta) return; } - xbt_dict_cursor_t cursor = nullptr; - char *ns3Socket; - SgFlow *sgFlow; - xbt_dict_foreach(flowFromSock,cursor,ns3Socket,sgFlow){ + std::string ns3Socket; + for (auto elm : flowFromSock) { + ns3Socket = elm.first; + SgFlow* sgFlow = elm.second; NetworkNS3Action * action = sgFlow->action_; XBT_DEBUG("Processing socket %p (action %p)",sgFlow,action); action->setRemains(action->getCost() - sgFlow->sentBytes_); @@ -234,20 +232,21 @@ void NetworkNS3Model::updateActionsState(double now, double delta) } if(sgFlow->finished_){ - xbt_dynar_push(socket_to_destroy,&ns3Socket); + socket_to_destroy.push_back(ns3Socket); XBT_DEBUG("Destroy socket %p of action %p", ns3Socket, action); action->finish(Action::State::done); } } - while (not xbt_dynar_is_empty(socket_to_destroy)) { - xbt_dynar_pop(socket_to_destroy,&ns3Socket); - + while (not socket_to_destroy.empty()) { + ns3Socket = socket_to_destroy.back(); + socket_to_destroy.pop_back(); + SgFlow* flow = flowFromSock.at(ns3Socket); if (XBT_LOG_ISENABLED(ns3, xbt_log_priority_debug)) { - SgFlow* flow = static_cast(xbt_dict_get(flowFromSock, ns3Socket)); XBT_DEBUG ("Removing socket %p of action %p", ns3Socket, flow->action_); } - xbt_dict_remove(flowFromSock, ns3Socket); + delete flow; + flowFromSock.erase(ns3Socket); } } @@ -357,7 +356,7 @@ void ns3_create_flow(simgrid::s4u::Host* src, simgrid::s4u::Host* dst, ns3::Ptr sock = ns3::Socket::CreateSocket(src_node, ns3::TcpSocketFactory::GetTypeId()); - xbt_dict_set(flowFromSock, transformSocketPtr(sock), new SgFlow(TotalBytes, action), nullptr); + flowFromSock.insert({transformSocketPtr(sock), new SgFlow(TotalBytes, action)}); sock->Bind(ns3::InetSocketAddress(port_number)); diff --git a/src/surf/ns3/ns3_simulator.cpp b/src/surf/ns3/ns3_simulator.cpp index 329680848e..f41d1e8cf0 100644 --- a/src/surf/ns3/ns3_simulator.cpp +++ b/src/surf/ns3/ns3_simulator.cpp @@ -4,13 +4,12 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "src/surf/ns3/ns3_simulator.hpp" -#include "xbt/dict.h" #include "xbt/log.h" #include "xbt/sysdep.h" #include -xbt_dict_t flowFromSock = nullptr; // ns3::sock -> SgFlow +std::map flowFromSock; // ns3::sock -> SgFlow static void receive_callback(ns3::Ptr socket); static void datasent_callback(ns3::Ptr socket, uint32_t dataSent); @@ -26,7 +25,8 @@ SgFlow::SgFlow(uint32_t totalBytes, simgrid::surf::NetworkNS3Action* action) static SgFlow* getFlowFromSocket(ns3::Ptr socket) { - return (SgFlow*)xbt_dict_get_or_null(flowFromSock, transformSocketPtr(socket)); + auto it = flowFromSock.find(transformSocketPtr(socket)); + return (it == flowFromSock.end()) ? nullptr : it->second; } static void receive_callback(ns3::Ptr socket) diff --git a/src/surf/ns3/ns3_simulator.hpp b/src/surf/ns3/ns3_simulator.hpp index c007c2592d..f339e6468f 100644 --- a/src/surf/ns3/ns3_simulator.hpp +++ b/src/surf/ns3/ns3_simulator.hpp @@ -33,14 +33,11 @@ public: void StartFlow(ns3::Ptr sock, const char* to, uint16_t port_number); -static inline const char* transformSocketPtr(ns3::Ptr localSocket) +static inline std::string transformSocketPtr(ns3::Ptr localSocket) { - static char key[24]; std::stringstream sstream; sstream << localSocket; - snprintf(key, 24, "%s", sstream.str().c_str()); - - return key; + return sstream.str(); } #endif -- 2.20.1