class Host;
}
namespace surf {
+ class Resource;
class Cpu;
class NetCard;
class As;
}
typedef simgrid::s4u::Host simgrid_Host;
+typedef simgrid::surf::As surf_As;
typedef simgrid::surf::Cpu surf_Cpu;
typedef simgrid::surf::NetCard surf_NetCard;
-typedef simgrid::surf::As surf_As;
typedef simgrid::surf::Link Link;
+typedef simgrid::surf::Resource surf_Resource;
typedef simgrid::trace_mgr::future_evt_set sg_future_evt_set;
#else
typedef struct simgrid_Host simgrid_Host;
+typedef struct surf_As surf_As;
typedef struct surf_Cpu surf_Cpu;
typedef struct surf_NetCard surf_NetCard;
-typedef struct surf_As surf_As;
+typedef struct surf_Resource surf_Resource;
typedef struct Link Link;
typedef struct future_evt_set sg_future_evt_set;
#endif
typedef simgrid_Host* sg_host_t;
+typedef surf_As *AS_t;
typedef surf_Cpu *surf_cpu_t;
typedef surf_NetCard *sg_netcard_t;
-typedef surf_As *AS_t;
+typedef surf_Resource *sg_resource_t;
typedef sg_future_evt_set *sg_future_evt_set_t;
// Types which are in fact dictelmt:
while ((next_event_date = future_evt_set->next_date()) != -1.0) {
if (next_event_date > NOW)
break;
- while ((event = future_evt_set->pop_leq(next_event_date,
- &value,
- (void **) &resource))) {
+
+ while ((event = future_evt_set->pop_leq(next_event_date, &value, &resource))) {
if (value >= 0){
resource->updateState(event, value, NOW);
}
break;
}
- if ((surf_min == -1.0) || (next_event_date > NOW + surf_min)) break;
+ if ((surf_min == -1.0) || (next_event_date > NOW + surf_min))
+ break;
XBT_DEBUG("Updating models (min = %g, NOW = %g, next_event_date = %g)", surf_min, NOW, next_event_date);
- while ((event = future_evt_set->pop_leq(next_event_date,
- &value,
- (void **) &resource))) {
+
+ while ((event = future_evt_set->pop_leq(next_event_date, &value, &resource))) {
if (resource->isUsed() || xbt_dict_get_or_null(watched_hosts_lib, resource->getName())) {
surf_min = next_event_date - NOW;
XBT_DEBUG
free(trace);
}
-/** Register a new trace into the future event set, and get an iterator over the integrated trace */
+/** @brief Registers a new trace into the future event set, and get an iterator over the integrated trace */
tmgr_trace_iterator_t simgrid::trace_mgr::future_evt_set::add_trace(
- tmgr_trace_t trace,
- double start_time,
- void *resource)
+ tmgr_trace_t trace, double start_time, surf::Resource *resource)
{
tmgr_trace_iterator_t trace_iterator = NULL;
return trace_iterator;
}
+/** @brief returns the date of the next occurring event (pure function) */
double simgrid::trace_mgr::future_evt_set::next_date()
{
if (xbt_heap_size(p_heap))
return -1.0;
}
+/** @brief Retrieves the next occurring event, or NULL if none happens before #date */
tmgr_trace_iterator_t simgrid::trace_mgr::future_evt_set::pop_leq(
- double date,
- double *value,
- void** resource)
+ double date, double *value, simgrid::surf::Resource **resource)
{
double event_date = next_date();
tmgr_trace_iterator_t trace_iterator = NULL;
typedef struct tmgr_trace_iterator {
tmgr_trace_t trace;
unsigned int idx;
- void *resource;
+ sg_resource_t resource;
int free_me;
} s_tmgr_trace_event_t;
future_evt_set();
virtual ~future_evt_set();
double next_date();
- tmgr_trace_iterator_t pop_leq(double date, double *value, void** resource);
- tmgr_trace_iterator_t add_trace(
- tmgr_trace_t trace,
- double start_time,
- void *model);
+ tmgr_trace_iterator_t pop_leq(double date, double *value, simgrid::surf::Resource** resource);
+ tmgr_trace_iterator_t add_trace(tmgr_trace_t trace, double start_time, simgrid::surf::Resource *resource);
private:
// TODO: use a boost type for the heap (or a ladder queue)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
+#include "src/surf/network_cm02.hpp"
#include "src/surf/trace_mgr.hpp"
XBT_LOG_NEW_DEFAULT_CATEGORY(surf_test,
"Messages specific for surf example");
+class DummyTestResource
+ : public simgrid::surf::Resource {
+public:
+ DummyTestResource(const char *name) : Resource(nullptr,name) {}
+ bool isUsed() override {return false;}
+ void updateState(tmgr_trace_iterator_t it, double date, double value) {}
+};
+
static void test(void)
{
simgrid::trace_mgr::future_evt_set *fes = new simgrid::trace_mgr::future_evt_set();
tmgr_trace_t trace_B = tmgr_trace_new_from_file("trace_B.txt");
double next_event_date = -1.0;
double value = -1.0;
- char *resource = NULL;
- char *host_A = strdup("Host A");
- char *host_B = strdup("Host B");
+ simgrid::surf::Resource *resource = NULL;
+ simgrid::surf::Resource *hostA = new DummyTestResource("Host A");
+ simgrid::surf::Resource *hostB = new DummyTestResource("Host B");
- fes->add_trace(trace_A, 1.0, host_A);
- fes->add_trace(trace_B, 0.0, host_B);
+ fes->add_trace(trace_A, 1.0, hostA);
+ fes->add_trace(trace_B, 0.0, hostB);
while ((next_event_date = fes->next_date()) != -1.0) {
XBT_DEBUG("%g" " : \n", next_event_date);
- while (fes->pop_leq(next_event_date, &value, (void **) &resource)) {
- XBT_DEBUG("\t %s : " "%g" "\n", resource, value);
+ while (fes->pop_leq(next_event_date, &value, &resource)) {
+ XBT_DEBUG("\t %s : " "%g" "\n", resource->getName(), value);
}
if (next_event_date > 1000)
break;
}
delete fes;
- free(host_B);
- free(host_A);
+ delete hostA;
+ delete hostB;
}
int main(int argc, char **argv)