-/* Copyright (c) 2004-2019. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2004-2023. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
#include "src/kernel/resource/profile/FutureEvtSet.hpp"
+#include "src/kernel/resource/Resource.hpp"
+#include "src/kernel/resource/profile/Event.hpp"
+#include "src/kernel/resource/profile/Profile.hpp"
+#include <simgrid/s4u/Engine.hpp>
-namespace simgrid {
-namespace kernel {
-namespace profile {
+namespace simgrid::kernel::profile {
+
+simgrid::kernel::profile::FutureEvtSet future_evt_set; // FIXME: singleton antipattern
FutureEvtSet::FutureEvtSet() = default;
FutureEvtSet::~FutureEvtSet()
/** @brief Schedules an event to a future date */
void FutureEvtSet::add_event(double date, Event* evt)
{
+ if (heap_.empty())
+ s4u::Engine::on_platform_created_cb([this]() {
+ /* Handle the events of time = 0 right after the platform creation */
+ double next_event_date;
+ while ((next_event_date = this->next_date()) != -1.0) {
+ if (next_event_date > 0)
+ break;
+
+ double value = -1.0;
+ resource::Resource* resource = nullptr;
+ while (auto* event = this->pop_leq(next_event_date, &value, &resource)) {
+ if (value >= 0)
+ resource->apply_event(event, value);
+ }
+ }
+ });
+
heap_.emplace(date, evt);
}
/** @brief Retrieves the next occurring event, or nullptr if none happens before date */
Event* FutureEvtSet::pop_leq(double date, double* value, resource::Resource** resource)
{
- double event_date = next_date();
- if (event_date > date || heap_.empty())
+ if (next_date() > date || heap_.empty())
return nullptr;
Event* event = heap_.top().second;
return event;
}
-} // namespace profile
-} // namespace kernel
-} // namespace simgrid
\ No newline at end of file
+} // namespace simgrid::kernel::profile