Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
peersimgrid release 1.0
[simgrid.git] / contrib / psg / src / psgsim / PSGProcessController.java
diff --git a/contrib/psg/src/psgsim/PSGProcessController.java b/contrib/psg/src/psgsim/PSGProcessController.java
new file mode 100644 (file)
index 0000000..d587691
--- /dev/null
@@ -0,0 +1,68 @@
+package psgsim;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import org.simgrid.msg.Host;
+import org.simgrid.msg.MsgException;
+
+import peersim.core.Control;
+
+/**
+ * This class executes all controls object scheduled in the
+ * {@link PSGPlatform#controlStepMap} collection.
+ * 
+ * @author Khaled Baati 10/12/2014
+ * @version version 1.1
+ */
+public class PSGProcessController extends org.simgrid.msg.Process {
+       
+       private Map<Control, Double> controlStepMapTmp = new LinkedHashMap<Control, Double>();
+
+       public PSGProcessController(Host host, String name, String[] args) {
+               super(host, name, null);
+       }
+
+       @Override
+       public void main(String[] args) throws MsgException {
+               Double nextControlEvent;
+               for (Map.Entry<Control, Double> entry : PSGPlatform.controlStepMap
+                               .entrySet()) {
+                       controlStepMapTmp.put(entry.getKey(), entry.getValue());
+               }
+               while (PSGPlatform.getTime() <= PSGPlatform.getDuration()) {
+                       for (Map.Entry<Control, Double> entrytmp : controlStepMapTmp
+                                       .entrySet()) {
+                               Control cle = entrytmp.getKey();
+                               Double valeur = entrytmp.getValue();
+                               if (PSGPlatform.getTime() % valeur == 0) {
+                                       cle.execute();
+                                       if (PSGPlatform.getTime() != 0)
+                                               for (Map.Entry<Control, Double> entry : PSGPlatform.controlStepMap
+                                                               .entrySet()) {
+                                                       if (cle == entry.getKey())
+                                                               controlStepMapTmp.replace(cle, valeur, valeur
+                                                                               + entry.getValue());
+
+                                               }
+                               }
+                       }
+                       nextControlEvent = next();
+                       if (nextControlEvent + PSGPlatform.getTime() >= PSGPlatform.getDuration()) {
+                               break;
+                       } else {
+                               waitFor(nextControlEvent);
+                       }
+               }
+       }
+
+       private Double next() {
+               Double min = controlStepMapTmp.values().iterator().next();
+               for (Map.Entry<Control, Double> entry : controlStepMapTmp.entrySet()) {
+                       Double valeur = (entry.getValue() - PSGPlatform.getClock());
+                       if (min > valeur)
+                               min = valeur;
+               }
+
+               return min;
+       }
+}
\ No newline at end of file