1 /* Copyright (c) 2004-2023. 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 "src/kernel/resource/profile/Event.hpp"
8 #include "src/kernel/resource/profile/FutureEvtSet.hpp"
9 #include "src/kernel/resource/profile/StochasticDatedValue.hpp"
10 #include "xbt/asserts.h"
12 #include <boost/algorithm/string.hpp>
17 #include <unordered_map>
22 static std::unordered_map<std::string, simgrid::kernel::profile::Profile*> trace_list;
24 namespace simgrid::kernel::profile {
26 /** @brief Register this profile for that resource onto that FES,
27 * and get an iterator over the integrated trace */
28 Event* Profile::schedule(FutureEvtSet* fes, resource::Resource* resource)
30 auto* event = new Event();
31 event->profile = this;
33 event->resource = resource;
34 event->free_me = false;
38 if (get_enough_events(0)) {
39 fes_->add_event(event_list[0].date_, event);
41 event->free_me = true;
42 tmgr_trace_event_unref(&event);
47 /** @brief Gets the next event from a profile */
48 DatedValue Profile::next(Event* event)
50 double event_date = fes_->next_date();
52 DatedValue dateVal = event_list.at(event->idx);
56 if (get_enough_events(event->idx)) {
57 const DatedValue& nextDateVal = event_list[event->idx];
58 xbt_assert(nextDateVal.date_>=0);
59 xbt_assert(nextDateVal.value_>=0);
60 fes_->add_event(event_date +nextDateVal.date_, event);
62 event->free_me = true;
67 Profile::Profile(const std::string& name, const std::function<ProfileBuilder::UpdateCb>& cb, double repeat_delay)
68 : name(name), cb(cb), repeat_delay(repeat_delay)
70 xbt_assert(trace_list.find(name) == trace_list.end(), "Refusing to define trace %s twice", name.c_str());
71 trace_list.try_emplace(name, this);
75 } // namespace simgrid::kernel::profile
79 for (auto const& [_, trace] : trace_list)
84 void tmgr_trace_event_unref(simgrid::kernel::profile::Event** event)
86 if ((*event)->free_me) {