private void GetItemsAndContinue(EvalResultDataItem dataItem, DkmWorkList workList, int startIndex, int count, DkmInspectionContext inspectionContext, DkmCompletionRoutine <DkmEvaluationEnumAsyncResult> completionRoutine) { var expansion = dataItem.Expansion; var value = dataItem.Value; var rows = ArrayBuilder <EvalResultDataItem> .GetInstance(); if (expansion != null) { int index = 0; expansion.GetRows(this, rows, inspectionContext, dataItem, value, startIndex, count, visitAll: false, index: ref index); } var numRows = rows.Count; Debug.Assert(count >= numRows); var results = new DkmEvaluationResult[numRows]; GetEvaluationResultsAndContinue(rows, results, 0, numRows, workList, inspectionContext, value.StackFrame, () => ContinueWithExceptionHandling( () => { completionRoutine(new DkmEvaluationEnumAsyncResult(results)); rows.Free(); }, e => completionRoutine(DkmEvaluationEnumAsyncResult.CreateErrorResult(e)))); }
internal DkmEvaluationResult[] GetItems( DkmEvaluationResultEnumContext enumContext, int startIndex, int count ) { DkmEvaluationEnumAsyncResult getItemsResult = default(DkmEvaluationEnumAsyncResult); var workList = new DkmWorkList(); enumContext.GetItems( workList, startIndex, count, r => { getItemsResult = r; } ); workList.Execute(); var exception = getItemsResult.Exception; if (exception != null) { ExceptionDispatchInfo.Capture(exception).Throw(); } return(getItemsResult.Items); }
internal DkmEvaluationResult[] GetItems(DkmEvaluationResultEnumContext enumContext, int startIndex, int count) { DkmEvaluationEnumAsyncResult getItemsResult = default(DkmEvaluationEnumAsyncResult); _resultProvider.GetItems(enumContext, null, startIndex, count, r => { getItemsResult = r; }); var exception = getItemsResult.Exception; if (exception != null) { ExceptionDispatchInfo.Capture(exception).Throw(); } return(getItemsResult.Items); }
void IDkmClrResultProvider.GetItems(DkmEvaluationResultEnumContext enumContext, DkmWorkList workList, int startIndex, int count, DkmCompletionRoutine <DkmEvaluationEnumAsyncResult> completionRoutine) { var enumContextDataItem = enumContext.GetDataItem <EnumContextDataItem>(); if (enumContextDataItem == null) { // We don't know about this result. Call next implementation enumContext.GetItems(workList, startIndex, count, completionRoutine); return; } var evaluationResult = enumContextDataItem.Result; var dataItem = evaluationResult.GetDataItem <EvalResultDataItem>(); var expansion = dataItem.Expansion; if (expansion == null) { completionRoutine(new DkmEvaluationEnumAsyncResult(new DkmEvaluationResult[0])); return; } var inspectionContext = enumContext.InspectionContext; var rows = ArrayBuilder <EvalResult> .GetInstance(); int index = 0; expansion.GetRows(this, rows, inspectionContext, dataItem, dataItem.Value, startIndex, count, visitAll: false, index: ref index); var numRows = rows.Count; Debug.Assert(count >= numRows); var results = new DkmEvaluationResult[numRows]; CompletionRoutine <Exception> onException = e => completionRoutine(DkmEvaluationEnumAsyncResult.CreateErrorResult(e)); var wl = new WorkList(workList, onException); wl.ContinueWith(() => GetEvaluationResultsAndContinue(evaluationResult, rows, results, 0, numRows, wl, inspectionContext, () => wl.ContinueWith( () => { completionRoutine(new DkmEvaluationEnumAsyncResult(results)); rows.Free(); }), onException)); }