1 /* Copyright (c) 2004-2022. The SimGrid Team. All rights reserved. */
3 /* This program is free software; you can redistribute it and/or modify it
4 * under the terms of the license (GNU LGPL) which comes with this package. */
6 #include "src/kernel/resource/profile/Profile.hpp"
7 #include "xbt/asserts.h"
8 #include "src/kernel/resource/profile/Event.hpp"
9 #include "src/kernel/resource/profile/FutureEvtSet.hpp"
10 #include "src/kernel/resource/profile/StochasticDatedValue.hpp"
11 #include "src/surf/surf_interface.hpp"
13 #include <boost/algorithm/string.hpp>
18 #include <unordered_map>
23 static std::unordered_map<std::string, simgrid::kernel::profile::Profile*> trace_list;
29 /** @brief Register this profile for that resource onto that FES,
30 * and get an iterator over the integrated trace */
31 Event* Profile::schedule(FutureEvtSet* fes, resource::Resource* resource)
33 auto* event = new Event();
34 event->profile = this;
36 event->resource = resource;
37 event->free_me = false;
41 if(event_list.empty())
44 if(event_list.empty()) {
45 event->free_me = false;
47 //FIXME: This is a bug, but keep old behaviour for now
48 //fes_->add_event(0, event);
49 fes_->add_event(event_list[0].date_, event);
54 /** @brief Gets the next event from a profile */
55 DatedValue Profile::next(Event* event)
57 double event_date = fes_->next_date();
59 DatedValue dateVal = event_list.at(event->idx);
63 if (event->idx == event_list.size())
65 if(event->idx>=event_list.size())
66 event->free_me = true;
68 DatedValue& nextDateVal=event_list.at(event->idx);
69 xbt_assert(nextDateVal.date_>=0);
70 xbt_assert(nextDateVal.value_>=0);
71 fes_->add_event(event_date +nextDateVal.date_, event);
76 Profile::Profile(const std::string& name, const std::function<ProfileBuilder::UpdateCb>& cb, double repeat_delay): name(name),cb(std::move(cb)),repeat_delay(repeat_delay) {
77 xbt_assert(trace_list.find(name) == trace_list.end(), "Refusing to define trace %s twice", name.c_str());
78 trace_list.insert({name,this});
82 } // namespace profile
84 } // namespace simgrid
88 for (auto const& kv : trace_list)
93 void tmgr_trace_event_unref(simgrid::kernel::profile::Event** event)
95 if ((*event)->free_me) {