Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
a6af8e0c94109535184d2c368e4d5b387805b7e0
[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   void *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. This flag indicates whether the structure is still used somewhere or not.
87  * \param  trace_event    Trace event structure
88  * \return 1 if the structure was freed, 0 otherwise
89 */
90 XBT_PUBLIC(int) tmgr_trace_event_free(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();
107   tmgr_trace_iterator_t pop_leq(double date, double *value, void** resource);
108   tmgr_trace_iterator_t add_trace(
109       tmgr_trace_t trace,
110       double start_time,
111       void *model);
112
113 private:
114   // TODO: use a boost type for the heap (or a ladder queue)
115   xbt_heap_t p_heap = xbt_heap_new(8, xbt_free_f); /* Content: only trace_events (yep, 8 is an arbitrary value) */
116 };
117
118 }} // namespace simgrid::trace_mgr
119 #endif /* C++ only */
120
121 #endif                          /* _SURF_TMGR_H */