Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
0f17aa7dd1ca45a3b4153bbbc9daea6b05796d79
[simgrid.git] / src / kernel / resource / profile / Profile.cpp
1 /* Copyright (c) 2004-2022. 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 "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"
12
13 #include <boost/algorithm/string.hpp>
14 #include <fstream>
15 #include <memory>
16 #include <ostream>
17 #include <sstream>
18 #include <unordered_map>
19 #include <utility>
20 #include <vector>
21 #include <string>
22
23 static std::unordered_map<std::string, simgrid::kernel::profile::Profile*> trace_list;
24
25 namespace simgrid {
26 namespace kernel {
27 namespace profile {
28
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)
32 {
33   auto* event     = new Event();
34   event->profile  = this;
35   event->idx      = 0;
36   event->resource = resource;
37   event->free_me  = false;
38
39   fes_ = fes;
40
41   if(event_list.empty())
42     cb(event_list);
43
44   if(event_list.empty()) {
45     event->free_me  = true;
46     tmgr_trace_event_unref(&event);
47   } else {
48     fes_->add_event(event_list[0].date_, event);
49   }
50   return event;
51 }
52
53 /** @brief Gets the next event from a profile */
54 DatedValue Profile::next(Event* event)
55 {
56   double event_date  = fes_->next_date();
57
58   DatedValue dateVal = event_list.at(event->idx);
59
60   event->idx++;
61
62   if (event->idx == event_list.size())
63     cb(event_list);
64   if(event->idx>=event_list.size())
65     event->free_me = true;
66   else {
67     const DatedValue& nextDateVal = event_list.at(event->idx);
68     xbt_assert(nextDateVal.date_>=0);
69     xbt_assert(nextDateVal.value_>=0);
70     fes_->add_event(event_date +nextDateVal.date_, event);
71   }
72   return dateVal;
73 }
74
75 Profile::Profile(const std::string& name, const std::function<ProfileBuilder::UpdateCb>& cb, double repeat_delay)
76     : name(name), cb(cb), repeat_delay(repeat_delay)
77 {
78   xbt_assert(trace_list.find(name) == trace_list.end(), "Refusing to define trace %s twice", name.c_str());
79   trace_list.insert({name,this});
80   cb(event_list);
81 }
82
83 } // namespace profile
84 } // namespace kernel
85 } // namespace simgrid
86
87 void tmgr_finalize()
88 {
89   for (auto const& kv : trace_list)
90     delete kv.second;
91   trace_list.clear();
92 }
93
94 void tmgr_trace_event_unref(simgrid::kernel::profile::Event** event)
95 {
96   if ((*event)->free_me) {
97     delete *event;
98     *event = nullptr;
99   }
100 }