Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add new entry in Release_Notes.
[simgrid.git] / src / kernel / resource / profile / Profile.cpp
1 /* Copyright (c) 2004-2023. The SimGrid Team. All rights reserved.          */
2
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. */
5
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"
11
12 #include <boost/algorithm/string.hpp>
13 #include <fstream>
14 #include <memory>
15 #include <ostream>
16 #include <sstream>
17 #include <unordered_map>
18 #include <utility>
19 #include <vector>
20 #include <string>
21
22 static std::unordered_map<std::string, simgrid::kernel::profile::Profile*> trace_list;
23
24 namespace simgrid::kernel::profile {
25
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)
29 {
30   auto* event     = new Event();
31   event->profile  = this;
32   event->idx      = 0;
33   event->resource = resource;
34   event->free_me  = false;
35
36   fes_ = fes;
37
38   if (get_enough_events(0)) {
39     fes_->add_event(event_list[0].date_, event);
40   } else {
41     event->free_me  = true;
42     tmgr_trace_event_unref(&event);
43   }
44   return event;
45 }
46
47 /** @brief Gets the next event from a profile */
48 DatedValue Profile::next(Event* event)
49 {
50   double event_date  = fes_->next_date();
51
52   DatedValue dateVal = event_list.at(event->idx);
53
54   event->idx++;
55
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);
61   } else {
62     event->free_me = true;
63   }
64   return dateVal;
65 }
66
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)
69 {
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);
72   get_enough_events(0);
73 }
74
75 } // namespace simgrid::kernel::profile
76
77 void tmgr_finalize()
78 {
79   for (auto const& [_, trace] : trace_list)
80     delete trace;
81   trace_list.clear();
82 }
83
84 void tmgr_trace_event_unref(simgrid::kernel::profile::Event** event)
85 {
86   if ((*event)->free_me) {
87     delete *event;
88     *event = nullptr;
89   }
90 }