Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
mark as const a method that is pure
[simgrid.git] / src / surf / trace_mgr.hpp
1 /* Copyright (c) 2004-2007, 2009-2014. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 #ifndef _SURF_TMGR_H
8 #define _SURF_TMGR_H
9
10 #include "xbt/heap.h"
11 #include "xbt/dynar.h"
12 #include "surf/maxmin.h"
13 #include "surf/datatypes.h"
14 #include "simgrid/platf_interface.h"
15 #include "simgrid/forward.h"
16
17 SG_BEGIN_DECL()
18 #include "xbt/base.h"
19 #include "xbt/swag.h"
20 #include "xbt/heap.h"
21 #include "trace_mgr.hpp"
22 #include "xbt/RngStream.h"
23
24 typedef struct tmgr_event {
25   double delta;
26   double value;
27 } s_tmgr_event_t, *tmgr_event_t;
28
29 enum e_trace_type {
30   e_trace_list, e_trace_probabilist
31 };
32
33 enum e_event_generator_type {
34   e_generator_uniform, e_generator_exponential, e_generator_weibull
35 };
36
37 typedef struct probabilist_event_generator {
38   enum e_event_generator_type type;
39   RngStream rng_stream;
40   double next_value;
41   union {
42     struct {
43       double min;
44       double max;
45     } s_uniform_parameters;
46     struct {
47       double rate;
48     } s_exponential_parameters;
49     struct {
50       double scale;
51       double shape;
52     } s_weibull_parameters;
53   };
54 } s_probabilist_event_generator_t;
55
56 typedef struct tmgr_trace {
57   enum e_trace_type type;
58   union {
59     struct {
60       xbt_dynar_t event_list;
61     } s_list;
62     struct {
63       probabilist_event_generator_t event_generator[2];
64       int is_state_trace;
65       int next_event;
66     } s_probabilist;
67   };
68 } s_tmgr_trace_t;
69
70 /* Iterator within a trace */
71 typedef struct tmgr_trace_iterator {
72   tmgr_trace_t trace;
73   unsigned int idx;
74   sg_resource_t resource;
75   int free_me;
76 } s_tmgr_trace_event_t;
77
78 XBT_PRIVATE double tmgr_event_generator_next_value(probabilist_event_generator_t generator);
79
80 /* Creation functions */
81 XBT_PUBLIC(tmgr_trace_t) tmgr_empty_trace_new(void);
82 XBT_PUBLIC(void) tmgr_trace_free(tmgr_trace_t trace);
83 /**
84  * \brief Free a trace event structure
85  *
86  * This function frees a trace_event if it can be freed, ie, if it has the free_me flag set to 1.
87  * This flag indicates whether the structure is still used somewhere or not.
88  * When the structure is freed, the argument is set to nullptr
89 */
90 XBT_PUBLIC(void) tmgr_trace_event_unref(tmgr_trace_iterator_t *trace_event);
91
92 XBT_PUBLIC(void) tmgr_finalize(void);
93
94 SG_END_DECL()
95
96 #ifdef __cplusplus
97 namespace simgrid {
98   namespace trace_mgr {
99
100 /* Future Event Set (collection of iterators over the traces)
101  * That's useful to quickly know which is the next occurring event in a set of traces. */
102 XBT_PUBLIC_CLASS future_evt_set {
103 public:
104   future_evt_set();
105   virtual ~future_evt_set();
106   double next_date() const;
107   tmgr_trace_iterator_t pop_leq(double date, double *value, simgrid::surf::Resource** resource);
108   tmgr_trace_iterator_t add_trace(tmgr_trace_t trace, double start_time, simgrid::surf::Resource *resource);
109
110 private:
111   // TODO: use a boost type for the heap (or a ladder queue)
112   xbt_heap_t p_heap = xbt_heap_new(8, xbt_free_f); /* Content: only trace_events (yep, 8 is an arbitrary value) */
113 };
114
115 }} // namespace simgrid::trace_mgr
116 #endif /* C++ only */
117
118 #endif                          /* _SURF_TMGR_H */