コード例 #1
0
ファイル: ComputeImpl.cs プロジェクト: zhiqinghuang/ignite
        /// <summary>
        /// Executes given task on the grid projection. For step-by-step explanation of task execution process
        /// refer to <see cref="IComputeTask{A,T,R}"/> documentation.
        /// </summary>
        /// <param name="task">Task to execute.</param>
        /// <param name="taskArg">Optional task argument.</param>
        /// <returns>Task result.</returns>
        public IFuture <TR> Execute <TA, T, TR>(IComputeTask <TA, T, TR> task, TA taskArg)
        {
            IgniteArgumentCheck.NotNull(task, "task");

            var holder = new ComputeTaskHolder <TA, T, TR>((Ignite)_prj.Ignite, this, task, taskArg);

            long ptr = Marshaller.Ignite.HandleRegistry.Allocate(holder);

            UU.ComputeExecuteNative(Target, ptr, _prj.TopologyVersion);

            return(holder.Future);
        }
コード例 #2
0
        /// <summary>
        /// Executes given task on the grid projection. For step-by-step explanation of task execution process
        /// refer to <see cref="IComputeTask{A,T,R}"/> documentation.
        /// </summary>
        /// <param name="task">Task to execute.</param>
        /// <param name="taskArg">Optional task argument.</param>
        /// <returns>Task result.</returns>
        public Future <TReduceRes> Execute <TArg, TJobRes, TReduceRes>(IComputeTask <TArg, TJobRes, TReduceRes> task,
                                                                       TArg taskArg)
        {
            IgniteArgumentCheck.NotNull(task, "task");

            var holder = new ComputeTaskHolder <TArg, TJobRes, TReduceRes>((Ignite)_prj.Ignite, this, task, taskArg);

            long ptr = Marshaller.Ignite.HandleRegistry.Allocate(holder);

            var futTarget = UU.ComputeExecuteNative(Target, ptr, _prj.TopologyVersion);

            var future = holder.Future;

            future.SetTarget(futTarget);

            return(future);
        }
コード例 #3
0
        /// <summary>
        /// Executes given task on the grid projection. For step-by-step explanation of task execution process
        /// refer to <see cref="IComputeTask{A,T,R}"/> documentation.
        /// </summary>
        /// <param name="task">Task to execute.</param>
        /// <param name="taskArg">Optional task argument.</param>
        /// <returns>Task result.</returns>
        public Future <TReduceRes> Execute <TArg, TJobRes, TReduceRes>(IComputeTask <TArg, TJobRes, TReduceRes> task,
                                                                       TArg taskArg)
        {
            IgniteArgumentCheck.NotNull(task, "task");

            var holder = new ComputeTaskHolder <TArg, TJobRes, TReduceRes>((Ignite)_prj.Ignite, this, task, taskArg);

            long ptr = Marshaller.Ignite.HandleRegistry.Allocate(holder);

            var futTarget = DoOutOpObject(OpExecNative, (IBinaryStream s) =>
            {
                s.WriteLong(ptr);
                s.WriteLong(_prj.TopologyVersion);
            });

            var future = holder.Future;

            future.SetTarget(new Listenable(futTarget));

            return(future);
        }
コード例 #4
0
        private Future <TReduceRes> ExecuteClosures0 <TArg, TJobRes, TReduceRes>(
            IComputeTask <TArg, TJobRes, TReduceRes> task, IComputeJob job = null,
            IEnumerable <IComputeJob> jobs    = null, int opId = OpUnicast, int jobsCount = 0,
            Action <BinaryWriter> writeAction = null)
        {
            Debug.Assert(job != null || jobs != null);

            var holder = new ComputeTaskHolder <TArg, TJobRes, TReduceRes>((Ignite)_prj.Ignite, this, task, default(TArg));

            var taskHandle = Marshaller.Ignite.HandleRegistry.Allocate(holder);

            var jobHandles = new List <long>(job != null ? 1 : jobsCount);

            try
            {
                Exception err = null;

                try
                {
                    var futTarget = DoOutOpObject(opId, writer =>
                    {
                        writer.WriteLong(taskHandle);

                        if (job != null)
                        {
                            writer.WriteInt(1);

                            jobHandles.Add(WriteJob(job, writer));
                        }
                        else
                        {
                            writer.WriteInt(jobsCount);

                            Debug.Assert(jobs != null, "jobs != null");

                            jobHandles.AddRange(jobs.Select(jobEntry => WriteJob(jobEntry, writer)));
                        }

                        holder.JobHandles(jobHandles);

                        if (writeAction != null)
                        {
                            writeAction(writer);
                        }
                    });

                    holder.Future.SetTarget(new Listenable(futTarget));
                }
                catch (Exception e)
                {
                    err = e;
                }

                if (err != null)
                {
                    // Manual job handles release because they were not assigned to the task yet.
                    foreach (var hnd in jobHandles)
                    {
                        Marshaller.Ignite.HandleRegistry.Release(hnd);
                    }

                    holder.CompleteWithError(taskHandle, err);
                }
            }
            catch (Exception e)
            {
                // This exception means that out-op failed.
                holder.CompleteWithError(taskHandle, e);
            }

            return(holder.Future);
        }