public Thread invoke(object action_id, Action reaction, out IActionFuture future) { int partner_size = channel.RemoteSize; int value = ActionDef.action_ids[action_id]; MPI.RequestList request_list = new MPI.RequestList(); for (int i = 0; i < partner_size; i++) { MPI.Request req = channel.ImmediateSend <object>(value, i, value); request_list.Add(req); } for (int i = 0; i < partner_size; i++) { MPI.ReceiveRequest req = channel.ImmediateReceive <object>(i, value); request_list.Add(req); } ManualResetEvent sync = new ManualResetEvent(false); ActionFuture future_ = new ActionFuture(request_list, sync); future = future_; Thread t = new Thread(new ThreadStart(() => handle_request(future_, sync, reaction))); t.Start(); return(t); }
public override void main() { ITaskPort <TestTaskPortType> task_port = Task_binding.TaskPort; Console.WriteLine(this.PeerRank + ": BEFORE LEFT INVOKE"); IActionFuture action_future_0; Thread t0 = task_port.invoke(TestTaskPortType.ACTION_0, reaction0, out action_future_0); IActionFuture action_future_1; Thread t1 = task_port.invoke(TestTaskPortType.ACTION_1, reaction1, out action_future_1); IActionFuture action_future_2; Thread t2 = task_port.invoke(TestTaskPortType.ACTION_2, reaction2, out action_future_2); IActionFutureSet action_future_set = action_future_0.createSet(); action_future_set.addAction(action_future_1); action_future_set.addAction(action_future_2); // action_future_set.waitAll (); while (action_future_set.Pending.Length > 0) { IActionFuture action_future = action_future_set.waitAny(); Console.WriteLine(this.PeerRank + ": LEFT WAIT ANY"); } Console.WriteLine(this.PeerRank + ": AFTER LEFT WAIT"); t0.Join(); t1.Join(); t2.Join(); Console.WriteLine(this.PeerRank + ": AFTER LEFT INVOKE"); }
public IActionFuture waitAny() { sync_future = new AutoResetEvent(false); lock (sync_oper) foreach (IActionFuture action_future in pending_list) { action_future.registerWaitingSet(sync_future); } sync_future.WaitOne(); sync_future = null; IActionFuture f = this.testAny(); lock (sync_oper) foreach (IActionFuture action_future in pending_list) { action_future.unregisterWaitingSet(sync_future); } /* while (true) * { * Thread.Sleep (200); * f = testAny(); * if (f != null) * return f; * }*/ return(f); }
public bool visit(SWLWorkflowChoice <bool> node) { IActionFutureSet future_list = null; IDictionary <IActionFuture, SWLWorkflow <bool> > dict_action_alt = new Dictionary <IActionFuture, SWLWorkflow <bool> > (); for (int i = 0; i < node.action_list.Length; i++) { string port_name = node.guard_list [i].Item1; string action_name = node.guard_list [i].Item2; ITaskBindingKind action_port = port(port_name); IActionFuture future_handle; action_port.invoke(action_name, out future_handle); if (future_list == null) { future_list = future_handle.createSet(); } else { future_list.addAction(future_handle); } dict_action_alt [future_handle] = node.action_list [i]; } IActionFuture ready_action = future_list.waitAny(); dict_action_alt [ready_action].accept(this); return(true); }
public override void run() { int compid = Convert.ToInt32(compId); Console.WriteLine("Computing action " + action_id + " of port " + port_id + " of component " + compid + " whose handleid informed is " + handleId); ITaskBindingKind v = (ITaskBindingKind)Certifier.services.getPort(port_id); //Certifier.verify_actions.TryGetValue(compid, out v); //v.invoke (IVerify.VERIFY_PERFORM); v.invoke(action_id); IActionFutureSet future_iteration = null; IActionFuture future_conclusive = null; //v.invoke (IVerify.VERIFY_CONCLUSIVE, out future_conclusive); v.invoke("verify_conclusive", out future_conclusive); future_iteration = future_conclusive.createSet(); IActionFuture future_inconclusive = null; //v.invoke (IVerify.VERIFY_INCONCLUSIVE, out future_inconclusive); v.invoke("verify_inconclusive", out future_inconclusive); future_iteration.addAction(future_inconclusive); IActionFuture r = future_iteration.waitAny(); result = r == future_conclusive ? CerificationResult.Conclusive : CerificationResult.Inconclusive; }
public static IActionFuture PushActions(this IActionFuture future, IEnumerable <IAction> actions) { foreach (var action in actions) { PushAction(future, action); } return(future); }
public void addAction(IActionFuture new_future) { lock (sync_oper) pending_list.Add(new_future); if (sync_future != null) { new_future.registerWaitingSet(sync_future); } }
public IActionFuture waitAny() { while (true) { IActionFuture f = this.testAny(); if (f != null) { return(f); } } }
public IActionFuture testAny() { IActionFuture completed_action_future = null; lock (sync_oper) { foreach (IActionFuture action_future in pending_list) { if (action_future.test()) { completed_action_future = action_future; break; } } pending_list.Remove(completed_action_future); } return(completed_action_future); }
public Thread invoke(object action_id, Action reaction, out IActionFuture future) { Trace.WriteLineIf(this.TraceFlag == true, this.ThisFacetInstance + "/" + this.Rank + ": INVOKE ACTION " + action_id + " 0"); RequestList request_list = synchronize_action(action_id); Trace.WriteLineIf(this.TraceFlag == true, this.ThisFacetInstance + "/" + this.Rank + ": INVOKE ACTION " + action_id + " 1"); ManualResetEvent sync = new ManualResetEvent(false); ActionFuture future_ = new ActionFuture(request_list, sync); future = future_; Trace.WriteLineIf(this.TraceFlag == true, this.ThisFacetInstance + "/" + this.Rank + ": INVOKE ACTION " + action_id + " 2"); Thread t = new Thread(new ThreadStart(() => handle_request(future_, sync, reaction))); t.Start(); Trace.WriteLineIf(this.TraceFlag == true, this.ThisFacetInstance + "/" + this.Rank + ": INVOKE ACTION " + action_id + " 3"); return(t); }
public abstract void invoke(object[] action_id, Action[] reaction, out IActionFuture future);
// (2) invokes and returns a future object for further testing or waiting of action completion. public abstract void invoke(object action_id, out IActionFuture future);
public override void main() { Console.WriteLine(this.ThisFacetInstance + "/" + this.Rank + ": WORKFLOW 1"); Task_binding_data.TraceFlag = Task_gusty0.TraceFlag = Task_gusty1.TraceFlag = Task_binding_step1.TraceFlag = Task_binding_split_first.TraceFlag = Task_binding_split_next.TraceFlag = true; Task_binding_data.TraceFlag = Task_binding_step1.TraceFlag = Task_binding_split_first.TraceFlag = Task_binding_split_next.TraceFlag = true; IActionFutureSet future_iteration = null; Console.WriteLine(this.ThisFacetInstance + "/" + this.Rank + ": WORKFLOW 2-1"); IActionFuture future_split_first_chunk_ready = null; Task_binding_split_first.invoke(ITaskPortAdvance.CHUNK_READY, out future_split_first_chunk_ready); int action_id_split_first_chunk_ready = future_split_first_chunk_ready.GetHashCode(); future_iteration = future_split_first_chunk_ready.createSet(); Console.WriteLine(this.ThisFacetInstance + "/" + this.Rank + ": WORKFLOW 2-2"); IActionFuture future_split_next_chunk_ready = null; Task_binding_split_next.invoke(ITaskPortAdvance.CHUNK_READY, out future_split_next_chunk_ready); int action_id_split_next_chunk_ready = future_split_next_chunk_ready.GetHashCode(); future_iteration.addAction(future_split_next_chunk_ready); Console.WriteLine(this.ThisFacetInstance + "/" + this.Rank + ": WORKFLOW 3"); IActionFuture future_gusty0_chunk_ready = null; Task_gusty0.invoke(ITaskPortAdvance.CHUNK_READY, out future_gusty0_chunk_ready); int action_id_gusty0_chunk_ready = future_gusty0_chunk_ready.GetHashCode(); future_iteration.addAction(future_gusty0_chunk_ready); Console.WriteLine(this.ThisFacetInstance + "/" + this.Rank + ": WORKFLOW 4"); IActionFuture future_step1_chunk_ready = null; Task_binding_step1.invoke(ITaskPortAdvance.CHUNK_READY, out future_step1_chunk_ready); int action_id_step1_chunk_ready = future_step1_chunk_ready.GetHashCode(); future_iteration.addAction(future_step1_chunk_ready); Console.WriteLine(this.ThisFacetInstance + "/" + this.Rank + ": WORKFLOW 4"); IActionFuture future_gusty1_chunk_ready = null; Task_gusty1.invoke(ITaskPortAdvance.CHUNK_READY, out future_gusty1_chunk_ready); int action_id_gusty1_chunk_ready = future_gusty1_chunk_ready.GetHashCode(); future_iteration.addAction(future_gusty1_chunk_ready); Console.WriteLine(this.ThisFacetInstance + "/" + this.Rank + ": WORKFLOW 5"); IActionFuture future_data_terminate = null; Task_binding_data.invoke(ITaskPortData.TERMINATE, out future_data_terminate); future_iteration.addAction(future_data_terminate); int action_id_data_terminate = future_data_terminate.GetHashCode(); Console.WriteLine(this.ThisFacetInstance + "/" + this.Rank + ": WORKFLOW 6-1"); Task_binding_data.invoke(ITaskPortData.READ_SOURCE); Console.WriteLine(this.ThisFacetInstance + "/" + this.Rank + ": WORKFLOW 6-2"); Task_binding_split_first.invoke(ITaskPortAdvance.READ_CHUNK); Task_binding_split_first.invoke(ITaskPortAdvance.PERFORM); Console.WriteLine(this.ThisFacetInstance + "/" + this.Rank + ": WORKFLOW 7"); IList <Thread> bag_of_tasks = new List <Thread> (); bool terminate = false; do { Console.WriteLine(this.ThisFacetInstance + "/" + this.Rank + ": WORKFLOW 8 - LOOP"); IActionFuture action = future_iteration.waitAny(); int action_id = action.GetHashCode(); if (action_id == action_id_split_first_chunk_ready) { Thread t1 = new Thread((ThreadStart) delegate() { Console.WriteLine("INVOKE GUSTY0 READ_CHUNK - BEFORE"); Task_gusty0.invoke(ITaskPortAdvance.READ_CHUNK); Console.WriteLine("INVOKE GUSTY0 READ_CHUNK - AFTER"); IActionFuture future_gusty0_perform = null; Thread thread_gusty0_perform = Task_gusty0.invoke(ITaskPortAdvance.PERFORM, gusty0_perform, out future_gusty0_perform); Console.WriteLine("END INVOKE SPLITTER CHUNK_READY"); }); bag_of_tasks.Add(t1); t1.Start(); Thread t2 = new Thread((ThreadStart) delegate() { Console.WriteLine("INVOKE SPLITTER READ_CHUNK"); Task_binding_split_first.invoke(ITaskPortAdvance.READ_CHUNK); Console.WriteLine("INVOKE SPLITTER PERFORM"); Task_binding_split_first.invoke(ITaskPortAdvance.PERFORM); Console.WriteLine("INVOKE SPLITTER READ_CHUNK/PERFORM - AFTER"); IActionFuture future_split_chunk_ready_ = null; Task_binding_split_first.invoke(ITaskPortAdvance.CHUNK_READY, out future_split_chunk_ready_); action_id_split_first_chunk_ready = future_split_chunk_ready_.GetHashCode(); future_iteration.addAction(future_split_chunk_ready_); }); Console.WriteLine("THREAD LAUNCHED 1"); bag_of_tasks.Add(t2); t2.Start(); } else if (action_id == action_id_gusty0_chunk_ready) { Task_gusty0.invoke(ITaskPortAdvance.CHUNK_READY, out future_gusty0_chunk_ready); action_id_gusty0_chunk_ready = future_gusty0_chunk_ready.GetHashCode(); future_iteration.addAction(future_gusty0_chunk_ready); Thread t = new Thread((ThreadStart) delegate() { Console.WriteLine("INVOKE STEP1 READ_CHUNK - BEFORE"); // 110 executados (o 48 completou nos pares, mas não progrediu aqui (????), motivo do erro. Task_binding_step1.invoke(ITaskPortAdvance.READ_CHUNK); // Console.WriteLine("INVOKE STEP1 READ_CHUNK - AFTER"); // 47 completados IActionFuture future_step1_perform = null; Thread thread_step1_perform = Task_binding_step1.invoke(ITaskPortAdvance.PERFORM, step1_perform, out future_step1_perform); Console.WriteLine("END INVOKE GUSTY0 CHUNK_READY"); }); t.Start(); bag_of_tasks.Add(t); Console.WriteLine("THREAD LAUNCHED 2"); } else if (action_id == action_id_step1_chunk_ready) { Task_binding_step1.invoke(ITaskPortAdvance.CHUNK_READY, out future_step1_chunk_ready); action_id_step1_chunk_ready = future_step1_chunk_ready.GetHashCode(); future_iteration.addAction(future_step1_chunk_ready); Thread t = new Thread((ThreadStart) delegate() { Console.WriteLine("INVOKE GUSTY1 READ_CHUNK - BEFORE"); Task_gusty1.invoke(ITaskPortAdvance.READ_CHUNK); // **** Console.WriteLine("INVOKE GUSTY1 READ_CHUNK - AFTER"); IActionFuture future_gusty1_perform = null; Thread thread_gusty1_perform = Task_gusty1.invoke(ITaskPortAdvance.PERFORM, gusty1_perform, out future_gusty1_perform); Console.WriteLine("END INVOKE STEP1 CHUNK_READY"); }); t.Start(); bag_of_tasks.Add(t); Console.WriteLine("THREAD LAUNCHED 3"); } else if (action_id == action_id_gusty1_chunk_ready) { Task_gusty1.invoke(ITaskPortAdvance.CHUNK_READY, out future_gusty1_chunk_ready); action_id_gusty1_chunk_ready = future_gusty1_chunk_ready.GetHashCode(); future_iteration.addAction(future_gusty1_chunk_ready); Thread t = new Thread((ThreadStart) delegate() { Console.WriteLine("INVOKE SPLITTER NEXT READ_CHUNK - BEFORE"); Task_binding_split_next.invoke(ITaskPortAdvance.READ_CHUNK); // **** Console.WriteLine("INVOKE SPLITTER NEXT READ_CHUNK - AFTER"); IActionFuture future_split_perform = null; Thread thread_split_perform = Task_binding_split_next.invoke(ITaskPortAdvance.PERFORM, split_perform, out future_split_perform); Console.WriteLine("END INVOKE GUSTY1 CHUNK_READY"); }); t.Start(); bag_of_tasks.Add(t); Console.WriteLine("THREAD LAUNCHED 4"); } else if (action_id == action_id_split_next_chunk_ready) { Thread t1 = new Thread((ThreadStart) delegate() { Console.WriteLine("INVOKE GUSTY0 READ_CHUNK NEXT - BEFORE"); Task_gusty0.invoke(ITaskPortAdvance.READ_CHUNK); // Console.WriteLine("INVOKE GUSTY0 READ_CHUNK NEXT - AFTER"); IActionFuture future_gusty0_perform = null; Thread thread_gusty0_perform = Task_gusty0.invoke(ITaskPortAdvance.PERFORM, gusty0_perform, out future_gusty0_perform); Console.WriteLine("END INVOKE SPLIT NEXT CHUNK_READY"); }); bag_of_tasks.Add(t1); t1.Start(); Thread t2 = new Thread((ThreadStart) delegate() { Console.WriteLine("INVOKE SPLITTER NEXT READ_CHUNK"); Task_binding_split_next.invoke(ITaskPortAdvance.READ_CHUNK); Console.WriteLine("INVOKE SPLITTER NEXT PERFORM"); Task_binding_split_next.invoke(ITaskPortAdvance.PERFORM); Console.WriteLine("INVOKE SPLITTER NEXT READ_CHUNK/PERFORM - AFTER"); IActionFuture future_split_next_chunk_ready_ = null; Task_binding_split_next.invoke(ITaskPortAdvance.CHUNK_READY, out future_split_next_chunk_ready_); action_id_split_next_chunk_ready = future_split_next_chunk_ready_.GetHashCode(); future_iteration.addAction(future_split_next_chunk_ready_); }); Console.WriteLine("THREAD LAUNCHED 1"); bag_of_tasks.Add(t2); t2.Start(); Console.WriteLine("THREAD LAUNCHED 5"); } else if (action_id == action_id_data_terminate) { Thread t = new Thread((ThreadStart) delegate() { Console.WriteLine("INVOKE DATA WRITE_SINK - BEFORE"); Task_binding_data.invoke(ITaskPortData.WRITE_SINK); Console.WriteLine("INVOKE DATA WRITE_SINK - AFTER"); terminate = true; }); t.Start(); bag_of_tasks.Add(t); Console.WriteLine("THREAD LAUNCHED 6"); } else { Console.WriteLine("UNEXPECTED ERROR: ACTION FUTURE NOT RECOGNIZED ! "); } } while (!terminate); Console.WriteLine("WORKFLOW FINISHED ! "); foreach (Thread t in bag_of_tasks) { t.Join(); } }
public static IActionFuture PushAction <TResult>(this IActionFuture future, Func <TResult, IAction> func) { Check.NotNull(func, nameof(func)); return(PushAction <TResult>(future, func, future.Count - 1)); }
public void addAction(IActionFuture new_future) { pending_list.Add(new_future); }
public static IActionFuture PushAction(this IActionFuture future, IAction action) { Check.NotNull(action, nameof(action)); return(future.PushAction(objs => action)); }
public static IActionFuture PushActionIf <TResult>(this IActionFuture future, Func <TResult, bool> predicate, Func <TResult, IAction> func) { Check.NotNull(predicate, nameof(predicate)); return(PushAction <TResult>(future, o => predicate(o) ? func(o) : null)); }
private bool Terminate(SWLWorkflowIterate <bool> node) { if (node.exit_clause == null && node.enter_clause == null) { return(false); } Console.WriteLine("TERMINATE 1"); IActionFutureSet fs = new ActionFutureSet(); IActionFuture[] future_list = new IActionFuture[node.exit_clause.Length]; string[] enter_action_list = new string[node.exit_clause.Length]; string[] exit_action_list = new string[node.exit_clause.Length]; for (int i = 0; i < node.exit_clause.Length; i++) { Console.WriteLine("TERMINATE 2 {0}", i); string exit_action = node.exit_clause[i].action; string exit_port = node.exit_clause[i].id_port; string enter_action = node.enter_clause[i].action; string enter_port = node.enter_clause[i].id_port; Console.WriteLine("TERMINATE 3 {0} / {1}.{2} -- {3}.{4}", i, exit_port, exit_action, enter_port, enter_action); // It is supposed that both exit and enter action ports are the same; ITaskBindingKind action_port_exit = port(exit_port); ITaskBindingKind action_port_enter = port(enter_port); Debug.Assert(action_port_exit == action_port_enter, "ITERATION: EXIT and ENTER action ports are distinct ! Check !"); Console.WriteLine("TERMINATE 4 {0} {1}", action_port_exit == null, action_port_enter == null); IActionFuture f; action_port_enter.invoke(new string[2] { exit_action, enter_action }, out f); fs.addAction(f); Console.WriteLine("TERMINATE 5 {0}", i); future_list[i] = f; enter_action_list[i] = enter_action; exit_action_list[i] = exit_action; } Console.WriteLine("TERMINATE 6 -- BEFORE WAIT ALL"); fs.waitAll(); Console.WriteLine("TERMINATE 7 -- AFTER WAIT ALL"); int end_iteration = 0; //unknown=0; enter=1; exit=2 for (int i = 0; i < future_list.Length; i++) { string action_result = (string)future_list[i].Action; Console.WriteLine("TERMINATE 8 i={0} -- result={1}", i, action_result); if (action_result.Equals(enter_action_list[i]) && end_iteration == 0) { end_iteration = 1; } else if (action_result.Equals(exit_action_list[i]) && end_iteration == 0) { end_iteration = 2; } else if (action_result.Equals(enter_action_list[i]) && end_iteration == 2) { throw new Exception("ITERATE: Conflict in termination clause !"); } else if (action_result.Equals(exit_action_list[i]) && end_iteration == 1) { throw new Exception("ITERATE: Conflict in termination clause !"); } Console.WriteLine("TERMINATE 9 i={0} -- end_iteration={1}", i, end_iteration); } return(end_iteration == 2); }
public static IActionFuture PushAction <TResult>(this IActionFuture future, Func <TResult, IAction> func, int dependentResultIndex) { Check.NotNull(func, nameof(func)); return(future.PushAction(objs => func(objs[dependentResultIndex].CastTo <TResult>()))); }