Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'mc'
[simgrid.git] / src / surf / surf_interface.hpp
1 /* Copyright (c) 2004-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_MODEL_H_
8 #define SURF_MODEL_H_
9
10 #include <xbt.h>
11 #include <string>
12 #include <vector>
13 #include <memory>
14 #include <boost/function.hpp>
15 #include <boost/intrusive/list.hpp>
16 #include "surf/trace_mgr.h"
17 #include "xbt/lib.h"
18 #include "surf/surf_routing.h"
19 #include "simgrid/platf_interface.h"
20 #include "surf/surf.h"
21 #include "surf/surf_private.h"
22 #include "internal_config.h"
23
24 #ifdef LIBSIGC
25 #include <sigc++/sigc++.h>
26 #define surf_callback(arg1, ...)  sigc::signal<arg1,__VA_ARGS__>
27 #define surf_callback_connect(callback, fun_ptr) callback.connect(sigc::ptr_fun(fun_ptr))
28 #define surf_callback_emit(callback, ...) callback.emit(__VA_ARGS__)
29 #else
30 #include <boost/signals2.hpp>
31 #define surf_callback(arg1, ...)  boost::signals2::signal<arg1(__VA_ARGS__)>
32 #define surf_callback_connect(callback, fun_ptr) callback.connect(fun_ptr)
33 #define surf_callback_emit(callback, ...) callback(__VA_ARGS__)
34 #endif
35
36 extern tmgr_history_t history;
37 #define NO_MAX_DURATION -1.0
38
39 using namespace std;
40
41 /*********
42  * Utils *
43  *********/
44
45 /* user-visible parameters */
46 extern double sg_tcp_gamma;
47 extern double sg_sender_gap;
48 extern double sg_latency_factor;
49 extern double sg_bandwidth_factor;
50 extern double sg_weight_S_parameter;
51 extern int sg_network_crosstraffic;
52 #ifdef HAVE_GTNETS
53 extern double sg_gtnets_jitter;
54 extern int sg_gtnets_jitter_seed;
55 #endif
56 extern xbt_dynar_t surf_path;
57
58 extern "C" {
59 XBT_PUBLIC(double) surf_get_clock(void);
60 }
61
62 extern double sg_sender_gap;
63 XBT_PUBLIC(int)  SURF_CPU_LEVEL;    //Surf cpu level
64
65 extern surf_callback(void, void) surfExitCallbacks;
66
67 int __surf_is_absolute_file_path(const char *file_path);
68
69 /***********
70  * Classes *
71  ***********/
72 //class Model;
73 typedef Model* ModelPtr;
74
75 //class Resource;
76 typedef Resource* ResourcePtr;
77
78 //class Action;
79 typedef Action* ActionPtr;
80
81 typedef boost::intrusive::list<Action> ActionList;
82 typedef ActionList* ActionListPtr;
83 typedef boost::intrusive::list_base_hook<> actionHook;
84
85 struct lmmTag;
86 typedef boost::intrusive::list<Action, boost::intrusive::base_hook<boost::intrusive::list_base_hook<boost::intrusive::tag<lmmTag> > > > ActionLmmList;
87 typedef ActionLmmList* ActionLmmListPtr;
88 typedef boost::intrusive::list_base_hook<boost::intrusive::tag<lmmTag> > actionLmmHook;
89
90
91 enum heap_action_type{
92   LATENCY = 100,
93   MAX_DURATION,
94   NORMAL,
95   NOTSET
96 };
97
98 /*********
99  * Trace *
100  *********/
101 /* For the trace and trace:connect tag (store their content till the end of the parsing) */
102 XBT_PUBLIC_DATA(xbt_dict_t) traces_set_list;
103 XBT_PUBLIC_DATA(xbt_dict_t) trace_connect_list_host_avail;
104 XBT_PUBLIC_DATA(xbt_dict_t) trace_connect_list_power;
105 XBT_PUBLIC_DATA(xbt_dict_t) trace_connect_list_link_avail;
106 XBT_PUBLIC_DATA(xbt_dict_t) trace_connect_list_bandwidth;
107 XBT_PUBLIC_DATA(xbt_dict_t) trace_connect_list_latency;
108
109 /*********
110  * Model *
111  *********/
112 XBT_PUBLIC_DATA(xbt_dynar_t) model_list;
113
114 /** @ingroup SURF_interface
115  * @brief SURF model interface class
116  * @details A model is an object which handle the interactions between its Resources and its Actions
117  */
118 XBT_PUBLIC_CLASS Model {
119 public:
120   /**
121    * @brief Model constructor
122    *
123    * @param name the name of the model
124    */
125   Model(const char *name);
126
127   /**
128    * @brief Model destructor
129    */
130   virtual ~Model();
131
132   virtual void addTraces() =0;
133
134   /**
135    * @brief Get the name of the current Model
136    *
137    * @return The name of the current Model
138    */
139   const char *getName() {return p_name;}
140
141   /**
142    * @brief Get the set of [actions](@ref Action) in *ready* state
143    *
144    * @return The set of [actions](@ref Action) in *ready* state
145    */
146   virtual ActionListPtr getReadyActionSet() {return p_readyActionSet;}
147
148   /**
149    * @brief Get the set of [actions](@ref Action) in *running* state
150    *
151    * @return The set of [actions](@ref Action) in *running* state
152    */
153   virtual ActionListPtr getRunningActionSet() {return p_runningActionSet;}
154
155   /**
156    * @brief Get the set of [actions](@ref Action) in *failed* state
157    *
158    * @return The set of [actions](@ref Action) in *failed* state
159    */
160   virtual ActionListPtr getFailedActionSet() {return p_failedActionSet;}
161
162   /**
163    * @brief Get the set of [actions](@ref Action) in *done* state
164    *
165    * @return The set of [actions](@ref Action) in *done* state
166    */
167   virtual ActionListPtr getDoneActionSet() {return p_doneActionSet;}
168
169   /**
170    * @brief Get the set of modified [actions](@ref Action)
171    *
172    * @return The set of modified [actions](@ref Action)
173    */
174   virtual ActionLmmListPtr getModifiedSet() {return p_modifiedSet;}
175
176   /**
177    * @brief Get the maxmin system of the current Model
178    *
179    * @return The maxmin system of the current Model
180    */
181   lmm_system_t getMaxminSystem() {return p_maxminSystem;}
182
183   /**
184    * @brief Get the update mechanism of the current Model
185    * @see e_UM_t
186    *
187    * @return [description]
188    */
189   e_UM_t getUpdateMechanism() {return p_updateMechanism;}
190
191   /**
192    * @brief Get Action heap
193    * @details [TODO]
194    *
195    * @return The Action heap
196    */
197   xbt_heap_t getActionHeap() {return p_actionHeap;}
198
199   /**
200    * @brief share the resources
201    * @details Share the resources between the actions
202    *
203    * @param now The current time of the simulation
204    * @return The delta of time till the next action will finish
205    */
206   virtual double shareResources(double now);
207   virtual double shareResourcesLazy(double now);
208   virtual double shareResourcesFull(double now);
209   double shareResourcesMaxMin(ActionListPtr running_actions,
210                                       lmm_system_t sys,
211                                       void (*solve) (lmm_system_t));
212
213   /**
214    * @brief Update state of actions
215    * @details Update action to the current time
216    *
217    * @param now The current time of the simulation
218    * @param delta The delta of time since the last update
219    */
220   virtual void updateActionsState(double now, double delta);
221   virtual void updateActionsStateLazy(double now, double delta);
222   virtual void updateActionsStateFull(double now, double delta);
223
224 protected:
225   ActionLmmListPtr p_modifiedSet;
226   lmm_system_t p_maxminSystem;
227   e_UM_t p_updateMechanism;
228   int m_selectiveUpdate;
229   xbt_heap_t p_actionHeap;
230
231 private:
232   const char *p_name;
233
234   ActionListPtr p_readyActionSet; /**< Actions in state SURF_ACTION_READY */
235   ActionListPtr p_runningActionSet; /**< Actions in state SURF_ACTION_RUNNING */
236   ActionListPtr p_failedActionSet; /**< Actions in state SURF_ACTION_FAILED */
237   ActionListPtr p_doneActionSet; /**< Actions in state SURF_ACTION_DONE */
238 };
239
240 /************
241  * Resource *
242  ************/
243
244 /** @ingroup SURF_interface
245  * @brief Resource which have a metric handled by a maxmin system
246  */
247 typedef struct {
248   double scale;             /**< The scale of the metric */
249   double peak;              /**< The peak of the metric */
250   tmgr_trace_event_t event; /**< The associated trace event associated to the metric */
251 } s_surf_metric_t;
252
253 /** @ingroup SURF_interface
254  * @brief SURF resource interface class
255  * @details A resource represent an element of a component (e.g.: a link for the network)
256  */
257 XBT_PUBLIC_CLASS Resource {
258 public:
259   /**
260    * @brief Resource constructor
261    */
262   Resource();
263
264   /**
265    * @brief Resource constructor
266    *
267    * @param model Model associated to this Resource
268    * @param name The name of the Resource
269    * @param props Dictionary of properties associated to this Resource
270    */
271   Resource(ModelPtr model, const char *name, xbt_dict_t props);
272
273   /**
274    * @brief Resource constructor
275    *
276    * @param model Model associated to this Resource
277    * @param name The name of the Resource
278    * @param props Dictionary of properties associated to this Resource
279    * @param constraint The lmm constraint associated to this Resource if it is part of a LMM component
280    */
281   Resource(ModelPtr model, const char *name, xbt_dict_t props, lmm_constraint_t constraint);
282   /**
283    * @brief Resource constructor
284    *
285    * @param model Model associated to this Resource
286    * @param name The name of the Resource
287    * @param props Dictionary of properties associated to this Resource
288    * @param stateInit the initial state of the Resource
289    */
290   Resource(ModelPtr model, const char *name, xbt_dict_t props, e_surf_resource_state_t stateInit);
291
292   /**
293    * @brief Resource destructor
294    */
295   virtual ~Resource();
296
297   /**
298    * @brief Get the Model of the current Resource
299    *
300    * @return The Model of the current Resource
301    */
302   ModelPtr getModel();
303
304   /**
305    * @brief Get the name of the current Resource
306    *
307    * @return The name of the current Resource
308    */
309   const char *getName();
310
311   /**
312    * @brief Get the properties of the current Resource
313    *
314    * @return The properties of the current Resource
315    */
316   virtual xbt_dict_t getProperties();
317
318   /**
319    * @brief Update the state of the current Resource
320    * @details [TODO]
321    *
322    * @param event_type [TODO]
323    * @param value [TODO]
324    * @param date [TODO]
325    */
326   virtual void updateState(tmgr_trace_event_t event_type, double value, double date)=0;
327
328   /**
329    * @brief Check if the current Resource is used
330    * @return true if the current Resource is used, false otherwise
331    */
332   virtual bool isUsed()=0;
333
334   /**
335    * @brief Check if the current Resource is active
336    *
337    * @return true if the current Resource is active, false otherwise
338    */
339   bool isOn();
340
341   /**
342    * @brief Turn on the current Resource
343    */
344   void turnOn();
345
346   /**
347    * @brief Turn off the current Resource
348    */
349   void turnOff();
350
351   /**
352    * @brief Get the [state](\ref e_surf_resource_state_t) of the current Resource
353    *
354    * @return The state of the currenrt Resource
355    */
356   virtual e_surf_resource_state_t getState();
357
358   /**
359    * @brief Set the [state](\ref e_surf_resource_state_t) of the current Resource
360    *
361    * @param state The new state of the current Resource
362    */
363   virtual void setState(e_surf_resource_state_t state);
364
365 private:
366   const char *p_name;
367   xbt_dict_t p_properties;
368   ModelPtr p_model;
369   bool m_running;
370   e_surf_resource_state_t m_stateCurrent;
371
372   /* LMM */
373 public:
374   /**
375    * @brief Get the lmm constraint associated to this Resource if it is part of a LMM component
376    *
377    * @return The lmm constraint associated to this Resource
378    */
379   lmm_constraint_t getConstraint();
380 private:
381   lmm_constraint_t p_constraint;
382 };
383
384 /**********
385  * Action *
386  **********/
387 void surf_action_lmm_update_index_heap(void *action, int i);
388
389 /** @ingroup SURF_interface
390  * @brief SURF action interface class
391  * @details An action is an event generated by a resource (e.g.: a communication for the network)
392  */
393 XBT_PUBLIC_CLASS Action : public actionHook, public actionLmmHook {
394 private:
395   /**
396    * @brief Common initializations for the constructors
397    */
398   void initialize(ModelPtr model, double cost, bool failed,
399                   lmm_variable_t var = NULL);
400
401 public:
402   /**
403    * @brief Action constructor
404    *
405    * @param model The Model associated to this Action
406    * @param cost The cost of the Action
407    * @param failed If the action is impossible (e.g.: execute something on a switched off workstation)
408    */
409   Action(ModelPtr model, double cost, bool failed);
410
411   /**
412    * @brief Action constructor
413    *
414    * @param model The Model associated to this Action
415    * @param cost The cost of the Action
416    * @param failed If the action is impossible (e.g.: execute something on a switched off workstation)
417    * @param var The lmm variable associated to this Action if it is part of a LMM component
418    */
419   Action(ModelPtr model, double cost, bool failed, lmm_variable_t var);
420
421   /**
422    * @brief Action destructor
423    */
424   virtual ~Action();
425
426   /**
427    * @brief Finish the action
428    */
429   void finish();
430
431   /**
432    * @brief Get the [state](\ref e_surf_action_state_t) of the current Action
433    *
434    * @return The state of the current Action
435    */
436   e_surf_action_state_t getState(); /**< get the state*/
437
438   /**
439    * @brief Set the [state](\ref e_surf_action_state_t) of the current Action
440    *
441    * @param state The new state of the current Action
442    */
443   virtual void setState(e_surf_action_state_t state);
444
445   /**
446    * @brief Get the bound of the current Action
447    *
448    * @return The bound of the current Action
449    */
450   double getBound();
451
452   /**
453    * @brief Set the bound of the current Action
454    *
455    * @param bound The new bound of the current Action
456    */
457   void setBound(double bound);
458
459   /**
460    * @brief Get the start time of the current action
461    *
462    * @return The start time of the current action
463    */
464   double getStartTime();
465
466   /**
467    * @brief Get the finish time of the current action
468    *
469    * @return The finish time of the current action
470    */
471   double getFinishTime();
472
473   /**
474    * @brief Get the data associated to the current action
475    *
476    * @return The data associated to the current action
477    */
478   void *getData() {return p_data;}
479
480   /**
481    * @brief Set the data associated to the current action
482    *
483    * @param data The new data associated to the current action
484    */
485   void setData(void* data);
486
487   /**
488    * @brief Get the maximum duration of the current action
489    *
490    * @return The maximum duration of the current action
491    */
492   double getMaxDuration() {return m_maxDuration;}
493
494   /**
495    * @brief Get the category associated to the current action
496    *
497    * @return The category associated to the current action
498    */
499   char *getCategory() {return p_category;}
500
501   /**
502    * @brief Get the cost of the current action
503    *
504    * @return The cost of the current action
505    */
506   double getCost() {return m_cost;}
507
508   /**
509    * @brief Set the cost of the current action
510    *
511    * @param cost The new cost of the current action
512    */
513   void setCost(double cost) {m_cost = cost;}
514
515   /**
516    * @brief Update the maximum duration of the current action
517    *
518    * @param delta [TODO]
519    */
520   void updateMaxDuration(double delta) {double_update(&m_maxDuration, delta,sg_surf_precision);}
521
522   /**
523    * @brief Update the remaining time of the current action
524    *
525    * @param delta [TODO]
526    */
527   void updateRemains(double delta) {double_update(&m_remains, delta, sg_maxmin_precision*sg_surf_precision);}
528
529   /**
530    * @brief Set the remaining time of the current action
531    *
532    * @param value The new remaining time of the current action
533    */
534   void setRemains(double value) {m_remains = value;}
535
536   /**
537    * @brief Set the finish time of the current action
538    *
539    * @param value The new Finush time of the current action
540    */
541   void setFinishTime(double value) {m_finish = value;}
542
543   /**
544    * @brief Add a reference to the current action
545    */
546   void ref();
547
548   /**
549    * @brief Remove a reference to the current action
550    * @details If the Action has no more reference, we destroy it
551    *
552    * @return true if the action was destroyed and false if someone still has references on it
553    */
554   virtual int unref();
555
556   /**
557    * @brief Cancel the current Action if running
558    */
559   virtual void cancel();
560
561   /**
562    * @brief Recycle an Action
563    */
564   virtual void recycle(){};
565
566   /**
567    * @brief Suspend the current Action
568    */
569   virtual void suspend();
570
571   /**
572    * @brief Resume the current Action
573    */
574   virtual void resume();
575
576   /**
577    * @brief Check if the current action is running
578    *
579    * @return true if the current Action is suspended, false otherwise
580    */
581   virtual bool isSuspended();
582
583   /**
584    * @brief Set the maximum duration of the current Action
585    *
586    * @param duration The new maximum duration of the current Action
587    */
588   virtual void setMaxDuration(double duration);
589
590   /**
591    * @brief Set the priority of the current Action
592    *
593    * @param priority The new priority of the current Action
594    */
595   virtual void setPriority(double priority);
596
597 #ifdef HAVE_TRACING
598   /**
599    * @brief Set the category of the current Action
600    *
601    * @param category The new category of the current Action
602    */
603   void setCategory(const char *category);
604 #endif
605
606   /**
607    * @brief Get the remaining time of the current action after updating the resource
608    *
609    * @return The remaining time
610    */
611   virtual double getRemains();
612
613   /**
614    * @brief Get the remaining time of the current action without updating the resource
615    *
616    * @return The remaining time
617    */
618   double getRemainsNoUpdate();
619
620   /**
621    * @brief Get the priority of the current Action
622    *
623    * @return The priority of the current Action
624    */
625   double getPriority() {return m_priority;};
626
627   /**
628    * @brief Get the state set in which the action is
629    *
630    * @return The state set in which the action is
631    */
632   ActionListPtr getStateSet() {return p_stateSet;};
633
634   s_xbt_swag_hookup_t p_stateHookup;
635
636   ModelPtr getModel() {return p_model;}
637
638 protected:
639   ActionListPtr p_stateSet;
640   double m_priority; /**< priority (1.0 by default) */
641   int    m_refcount;
642   double m_remains; /**< How much of that cost remains to be done in the currently running task */
643   double m_maxDuration; /*< max_duration (may fluctuate until the task is completed) */
644   double m_finish; /**< finish time : this is modified during the run and fluctuates until the task is completed */
645
646 private:
647   bool m_failed;
648   double m_start; /**< start time  */
649   char *p_category;               /**< tracing category for categorized resource utilization monitoring */
650
651   #ifdef HAVE_LATENCY_BOUND_TRACKING
652   int m_latencyLimited;               /**< Set to 1 if is limited by latency, 0 otherwise */
653   #endif
654   double    m_cost;
655   ModelPtr p_model;
656   void *p_data; /**< for your convenience */
657
658   /* LMM */
659 public:
660   virtual void updateRemainingLazy(double now);
661   void heapInsert(xbt_heap_t heap, double key, enum heap_action_type hat);
662   void heapRemove(xbt_heap_t heap);
663   void updateIndexHeap(int i);
664   lmm_variable_t getVariable() {return p_variable;}
665   double getLastUpdate() {return m_lastUpdate;}
666   void refreshLastUpdate() {m_lastUpdate = surf_get_clock();}
667   enum heap_action_type getHat() {return m_hat;}
668   bool is_linked() {return actionLmmHook::is_linked();}
669   void gapRemove();
670
671 protected:
672   lmm_variable_t p_variable;
673   double m_lastValue;
674   double m_lastUpdate;
675   int m_suspended;
676   int m_indexHeap;
677   enum heap_action_type m_hat;
678 };
679
680 #endif /* SURF_MODEL_H_ */