* Crude globals *
*****************/
-extern xbt_dict_t flowFromSock;
+extern std::map<std::string, SgFlow*> flowFromSock;
static ns3::InternetStackHelper stack;
static ns3::NodeContainer nodes;
NetworkNS3Model::NetworkNS3Model() : NetworkModel() {
NetPointNs3::EXTENSION_ID = simgrid::kernel::routing::NetPoint::extension_create<NetPointNs3>();
- flowFromSock = xbt_dict_new_homogeneous([](void* p) { delete static_cast<SgFlow*>(p); });
ns3_initialize(ns3_tcp_model.get().c_str());
simgrid::kernel::routing::NetPoint::onCreation.connect([](simgrid::kernel::routing::NetPoint* pt) {
for (auto const& addr : IPV4addr)
free(addr);
IPV4addr.clear();
- xbt_dict_free(&flowFromSock);
}
LinkImpl* NetworkNS3Model::createLink(const std::string& name, double bandwidth, double latency,
void NetworkNS3Model::updateActionsState(double now, double delta)
{
- static xbt_dynar_t socket_to_destroy = xbt_dynar_new(sizeof(char*),nullptr);
+ static std::vector<std::string> socket_to_destroy;
/* If there are no running flows, advance the NS3 simulator and return */
if (getRunningActionSet()->empty()) {
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_);
}
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<SgFlow*>(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);
}
}
ns3::Ptr<ns3::Socket> 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));