Example #1
0
 internal virtual IEnumerator <TOutput> GetEnumerator(ParallelMergeOptions?mergeOptions, bool suppressOrderPreservation)
 {
     // Return a dummy enumerator that will call back GetOpenedEnumerator() on 'this' QueryOperator
     // the first time the user calls MoveNext(). We do this to prevent executing the query if user
     // never calls MoveNext().
     return(new QueryOpeningEnumerator <TOutput>(this, mergeOptions, suppressOrderPreservation));
 }
Example #2
0
        //-----------------------------------------------------------------------------------
        // Combines two sets of options.
        //
        internal QuerySettings Merge(QuerySettings settings2)
        {
            if (this.TaskScheduler != null && settings2.TaskScheduler != null)
            {
                throw new InvalidOperationException(SR.ParallelQuery_DuplicateTaskScheduler);
            }

            if (this.DegreeOfParallelism != null && settings2.DegreeOfParallelism != null)
            {
                throw new InvalidOperationException(SR.ParallelQuery_DuplicateDOP);
            }

            if (this.CancellationState.ExternalCancellationToken.CanBeCanceled && settings2.CancellationState.ExternalCancellationToken.CanBeCanceled)
            {
                throw new InvalidOperationException(SR.ParallelQuery_DuplicateWithCancellation);
            }

            if (this.ExecutionMode != null && settings2.ExecutionMode != null)
            {
                throw new InvalidOperationException(SR.ParallelQuery_DuplicateExecutionMode);
            }

            if (this.MergeOptions != null && settings2.MergeOptions != null)
            {
                throw new InvalidOperationException(SR.ParallelQuery_DuplicateMergeOptions);
            }

            TaskScheduler?        tm  = this.TaskScheduler ?? settings2.TaskScheduler;
            int?                  dop = this.DegreeOfParallelism.HasValue ? this.DegreeOfParallelism : settings2.DegreeOfParallelism;
            CancellationToken     externalCancellationToken = (this.CancellationState.ExternalCancellationToken.CanBeCanceled) ? this.CancellationState.ExternalCancellationToken : settings2.CancellationState.ExternalCancellationToken;
            ParallelExecutionMode?executionMode             = this.ExecutionMode.HasValue ? this.ExecutionMode : settings2.ExecutionMode;
            ParallelMergeOptions? mergeOptions = this.MergeOptions.HasValue ? this.MergeOptions : settings2.MergeOptions;

            return(new QuerySettings(tm, dop, externalCancellationToken, executionMode, mergeOptions));
        }
        internal IEnumerator <TOutput> GetOpenedEnumerator(ParallelMergeOptions?mergeOptions, bool suppressOrder, bool forEffect, QuerySettings querySettings)
        {
            if ((((ParallelExecutionMode)querySettings.ExecutionMode.Value) == ParallelExecutionMode.Default) && this.LimitsParallelism)
            {
                return(ExceptionAggregator.WrapEnumerable <TOutput>(this.AsSequentialQuery(querySettings.CancellationState.ExternalCancellationToken), querySettings.CancellationState).GetEnumerator());
            }
            QueryResults <TOutput> queryResults = this.GetQueryResults(querySettings);

            if (!mergeOptions.HasValue)
            {
                mergeOptions = querySettings.MergeOptions;
            }
            if (querySettings.CancellationState.MergedCancellationToken.IsCancellationRequested)
            {
                if (querySettings.CancellationState.ExternalCancellationToken.IsCancellationRequested)
                {
                    throw new OperationCanceledException(querySettings.CancellationState.ExternalCancellationToken);
                }
                throw new OperationCanceledException();
            }
            bool outputOrdered = this.OutputOrdered && !suppressOrder;
            PartitionedStreamMerger <TOutput> recipient = new PartitionedStreamMerger <TOutput>(forEffect, mergeOptions.GetValueOrDefault(), querySettings.TaskScheduler, outputOrdered, querySettings.CancellationState, querySettings.QueryId);

            queryResults.GivePartitionedStream(recipient);
            if (forEffect)
            {
                return(null);
            }
            return(recipient.MergeExecutor.GetEnumerator());
        }
 internal override IEnumerator <TSource> GetEnumerator(ParallelMergeOptions?mergeOptions, bool suppressOrderPreservation)
 {
     if (_child is ScanQueryOperator <TSource> childAsScan)
     {
         return(childAsScan.Data.GetEnumerator());
     }
     return(base.GetEnumerator(mergeOptions, suppressOrderPreservation));
 }
 internal QueryOpeningEnumerator(QueryOperator <TOutput> queryOperator, ParallelMergeOptions?mergeOptions, bool suppressOrderPreservation)
 {
     this.m_topLevelDisposedFlag            = new Shared <bool>(false);
     this.m_topLevelCancellationTokenSource = new CancellationTokenSource();
     this.m_queryOperator             = queryOperator;
     this.m_mergeOptions              = mergeOptions;
     this.m_suppressOrderPreservation = suppressOrderPreservation;
 }
        internal QueryOpeningEnumerator(QueryOperator <TOutput> queryOperator, ParallelMergeOptions?mergeOptions, bool suppressOrderPreservation)
        {
            Debug.Assert(queryOperator != null);

            _queryOperator             = queryOperator;
            _mergeOptions              = mergeOptions;
            _suppressOrderPreservation = suppressOrderPreservation;
        }
 internal QuerySettings(System.Threading.Tasks.TaskScheduler taskScheduler, int? degreeOfParallelism, CancellationToken externalCancellationToken, ParallelExecutionMode? executionMode, ParallelMergeOptions? mergeOptions)
 {
     this.m_taskScheduler = taskScheduler;
     this.m_degreeOfParallelism = degreeOfParallelism;
     this.m_cancellationState = new System.Linq.Parallel.CancellationState(externalCancellationToken);
     this.m_executionMode = executionMode;
     this.m_mergeOptions = mergeOptions;
     this.m_queryId = -1;
 }
Example #8
0
 internal QuerySettings(System.Threading.Tasks.TaskScheduler taskScheduler, int?degreeOfParallelism, CancellationToken externalCancellationToken, ParallelExecutionMode?executionMode, ParallelMergeOptions?mergeOptions)
 {
     this.m_taskScheduler       = taskScheduler;
     this.m_degreeOfParallelism = degreeOfParallelism;
     this.m_cancellationState   = new System.Linq.Parallel.CancellationState(externalCancellationToken);
     this.m_executionMode       = executionMode;
     this.m_mergeOptions        = mergeOptions;
     this.m_queryId             = -1;
 }
Example #9
0
        //---------------------------------------------------------------------------------------
        // The GetOpenedEnumerator method return an enumerator that walks the contents of a query.
        // The enumerator will be "opened", which means that PLINQ will start executing the query
        // immediately, even before the user calls MoveNext() for the first time.
        //
        internal IEnumerator <TOutput> GetOpenedEnumerator(ParallelMergeOptions?mergeOptions, bool suppressOrder, bool forEffect,
                                                           QuerySettings querySettings)
        {
            // If the top-level enumerator forces a premature merge, run the query sequentially.
            if (querySettings.ExecutionMode.Value == ParallelExecutionMode.Default && LimitsParallelism)
            {
                IEnumerable <TOutput> opSequential = AsSequentialQuery(querySettings.CancellationState.ExternalCancellationToken);
                return(ExceptionAggregator.WrapEnumerable(opSequential, querySettings.CancellationState).GetEnumerator());
            }

            QueryResults <TOutput> queryResults = GetQueryResults(querySettings);

            if (mergeOptions == null)
            {
                mergeOptions = querySettings.MergeOptions;
            }

            Contract.Assert(mergeOptions != null);

            // Top-level pre-emptive cancellation test.
            // This handles situations where cancellation has occured before execution commences
            // The handling for in-execution occurs in QueryTaskGroupState.QueryEnd()

            if (querySettings.CancellationState.MergedCancellationToken.IsCancellationRequested)
            {
                if (querySettings.CancellationState.ExternalCancellationToken.IsCancellationRequested)
                {
#if PFX_LEGACY_3_5
                    throw new OperationCanceledException2(querySettings.CancellationState.ExternalCancellationToken);
#else
                    throw new OperationCanceledException(querySettings.CancellationState.ExternalCancellationToken);
#endif
                }
                else
                {
                    throw new OperationCanceledException();
                }
            }

            bool orderedMerge = OutputOrdered && !suppressOrder;

            PartitionedStreamMerger <TOutput> merger = new PartitionedStreamMerger <TOutput>(forEffect, mergeOptions.GetValueOrDefault(),
                                                                                             querySettings.TaskScheduler,
                                                                                             orderedMerge,
                                                                                             querySettings.CancellationState,
                                                                                             querySettings.QueryId);

            queryResults.GivePartitionedStream(merger); // hook up the data flow between the operator-executors, starting from the merger.

            if (forEffect)
            {
                return(null);
            }

            return(merger.MergeExecutor.GetEnumerator());
        }
Example #10
0
        void MergeOptions(OptionsList list)
        {
            if (list.Item1 != null)
            {
                if (options == null)
                {
                    options = list.Item1;
                }
                else
                {
                    Throw("WithMergeOptions");
                }
            }

            if (list.Item2 != null)
            {
                if (mode == null)
                {
                    mode = list.Item2;
                }
                else
                {
                    Throw("WithExecutionMode");
                }
            }

            if (list.Item3 != null)
            {
                if (token == null)
                {
                    token = list.Item3;
                }
                else
                {
                    Throw("WithCancellationToken");
                }
            }

            if (list.Item4 != -1)
            {
                if (degreeOfParallelism == null)
                {
                    degreeOfParallelism = list.Item4;
                }
                else
                {
                    Throw("WithDegreeOfParallelism");
                }
            }

            // That one is treated specially
            if (list.Item5 != null)
            {
                implementerToken = implementerToken.Chain(list.Item5);
            }
        }
Example #11
0
        internal override IEnumerator <TSource> GetEnumerator(ParallelMergeOptions?mergeOptions, bool suppressOrderPreservation)
        {
            ScanQueryOperator <TSource> child = this.m_child as ScanQueryOperator <TSource>;

            if (child != null)
            {
                return(child.Data.GetEnumerator());
            }
            return(base.GetEnumerator(mergeOptions, suppressOrderPreservation));
        }
Example #12
0
        //-----------------------------------------------------------------------------------
        // Constructs a new settings structure.
        //
        internal QuerySettings(TaskScheduler?taskScheduler, int?degreeOfParallelism,
                               CancellationToken externalCancellationToken, ParallelExecutionMode?executionMode,
                               ParallelMergeOptions?mergeOptions)
        {
            _taskScheduler       = taskScheduler;
            _degreeOfParallelism = degreeOfParallelism;
            _cancellationState   = new CancellationState(externalCancellationToken);
            _executionMode       = executionMode;
            _mergeOptions        = mergeOptions;
            _queryId             = -1;

            Debug.Assert(_cancellationState != null);
        }
        //-----------------------------------------------------------------------------------
        // Constructs a new settings structure.
        //
        internal QuerySettings(TaskScheduler taskScheduler, int?degreeOfParallelism,
                               CancellationToken externalCancellationToken, ParallelExecutionMode?executionMode,
                               ParallelMergeOptions?mergeOptions)
        {
            m_taskScheduler       = taskScheduler;
            m_degreeOfParallelism = degreeOfParallelism;
            m_cancellationState   = new CancellationState(externalCancellationToken);
            m_executionMode       = executionMode;
            m_mergeOptions        = mergeOptions;
            m_queryId             = -1;

            Contract.Assert(m_cancellationState != null);
        }
Example #14
0
		public QueryOptions (ParallelMergeOptions? options,
		                     ParallelExecutionMode? mode,
		                     CancellationToken token,
		                     bool useStrip,
		                     bool? behindOrderGuard,
		                     int partitionCount,
		                     CancellationToken implementerToken)
		{
			Options = options;
			Mode = mode;
			Token = token;
			UseStrip = useStrip;
			BehindOrderGuard = behindOrderGuard;
			PartitionCount = partitionCount;
			PartitionerSettings = null;
			ImplementerToken = implementerToken;
		}
Example #15
0
        public QueryOptions(ParallelMergeOptions?options,
                            ParallelExecutionMode?mode,
                            CancellationToken token,
                            bool useStrip,
                            bool?behindOrderGuard,
                            int partitionCount,
                            CancellationToken implementerToken,
                            bool shouldBeSequential)
        {
            Options             = options;
            Mode                = mode;
            Token               = token;
            UseStrip            = useStrip;
            BehindOrderGuard    = behindOrderGuard;
            PartitionCount      = partitionCount;
            PartitionerSettings = null;
            ImplementerToken    = implementerToken;
            ShouldBeSequential  = shouldBeSequential;

            MergeTokens(token, implementerToken);
        }
Example #16
0
        //-----------------------------------------------------------------------------------
        // Constructs a new settings structure.
        //
        internal QuerySettings(TaskScheduler taskScheduler, int? degreeOfParallelism,
            CancellationToken externalCancellationToken, ParallelExecutionMode? executionMode,
            ParallelMergeOptions? mergeOptions)
        {
            _taskScheduler = taskScheduler;
            _degreeOfParallelism = degreeOfParallelism;
            _cancellationState = new CancellationState(externalCancellationToken);
            _executionMode = executionMode;
            _mergeOptions = mergeOptions;
            _queryId = -1;

            Contract.Assert(_cancellationState != null);
        }
 public IEnumerator <TOutput> GetEnumerator(ParallelMergeOptions?mergeOptions)
 {
     return(this.GetEnumerator(mergeOptions, false));
 }
Example #18
0
		void MergeOptions (OptionsList list)
		{
			if (list.Item1 != null) {
				if (options == null)
					options = list.Item1;
				else
					Throw ("WithMergeOptions");
			}

			if (list.Item2 != null) {
				if (mode == null)
					mode = list.Item2;
				else
					Throw ("WithExecutionMode");
			}

			if (list.Item3 != null) {
				if (token == null)
					token = list.Item3;
				else
					Throw ("WithCancellationToken");
			}

			if (list.Item4 != -1) {
				if (degreeOfParallelism == null)
					degreeOfParallelism = list.Item4;
				else
					Throw ("WithDegreeOfParallelism");
			}

			// That one is treated specially
			if (list.Item5 != null) {
				implementerToken = implementerToken.Chain (list.Item5);
			}
		}
Example #19
0
 public IEnumerator <TOutput> GetEnumerator(ParallelMergeOptions?mergeOptions)
 {
     // Pass through the value supplied for pipelining, and do not suppress
     // order preservation by default.
     return(GetEnumerator(mergeOptions, false));
 }
 internal virtual IEnumerator <TOutput> GetEnumerator(ParallelMergeOptions?mergeOptions, bool suppressOrderPreservation)
 {
     return(new QueryOpeningEnumerator <TOutput>((QueryOperator <TOutput>) this, mergeOptions, suppressOrderPreservation));
 }
 internal override IEnumerator <TElement> GetEnumerator(ParallelMergeOptions?mergeOptions, bool suppressOrderPreservation)
 {
     return(this.m_data.GetEnumerator());
 }