Exemplo n.º 1
0
        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);
            }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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;
        }
Exemplo n.º 6
0
 public static IActionFuture PushActions(this IActionFuture future, IEnumerable <IAction> actions)
 {
     foreach (var action in actions)
     {
         PushAction(future, action);
     }
     return(future);
 }
Exemplo n.º 7
0
        public void addAction(IActionFuture new_future)
        {
            lock (sync_oper)
                pending_list.Add(new_future);

            if (sync_future != null)
            {
                new_future.registerWaitingSet(sync_future);
            }
        }
Exemplo n.º 8
0
 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);
            }
Exemplo n.º 10
0
        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);
Exemplo n.º 13
0
        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();
            }
        }
Exemplo n.º 14
0
 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));
 }
Exemplo n.º 15
0
 public void addAction(IActionFuture new_future)
 {
     pending_list.Add(new_future);
 }
Exemplo n.º 16
0
 public static IActionFuture PushAction(this IActionFuture future, IAction action)
 {
     Check.NotNull(action, nameof(action));
     return(future.PushAction(objs => action));
 }
Exemplo n.º 17
0
 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);
        }
Exemplo n.º 19
0
 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>())));
 }