//************************************************************************* // Method: onCreateFault // Description: Called when a ui pane creates a fault // // Parameters: // dataNode - the node to create // // Return Value: none //************************************************************************* void FaultPaneDataArray::onCreateFault(DisplayableDataNode *dataNode) { FaultPaneDataNode *faultNode = dynamic_cast <FaultPaneDataNode*> (dataNode); if (!faultNode) return; //retain a copy in dataarray for use when project pane makes a datanode copy faultNode->DataArray = faultNode; if (!faultNode->CreatedDelegate) return; else if (faultNode->processID == processID) { FaultFunctionDB *faultDB = FaultFunctionDB::GetInstance(); IList *faults = faultDB->Faults; for (int i=0; i<faults->Count; i++) { Fault *fault = dynamic_cast <Fault*> (faults->Item[i]); if (FaultsMatch(faultNode, fault)) { faultNode->FaultID = fault->FaultID; faultNode->ID = String::Concat(faultNode->processID.ToString(), faultNode->threadID.ToString(), faultNode->FaultID.ToString()); break; } } if (faultNode->FaultID == -1) return; //if we are switching to a new fault, then delete the old one. if (FindFaultNode(faultNode->Type, faultNode->threadID)) { internalDelete = true; onDeleteFault(faultNode); internalDelete = false; } if (!this->itemList->Contains(faultNode->ID)) { ArrayList *list = new ArrayList(); list->Add(__box(faultNode->threadID)); Array *threadList = list->ToArray(); holoScriptApp->InjectFault(threadList, faultNode->FaultID); CreateDataNode(faultNode); Object *args[] = __gc new Object*[1]; args[0] = faultNode; faultNode->CreatedDelegate->DynamicInvoke(args); } else return; } }
EFI_STATUS GetPeiPerformance ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable, IN UINT64 Ticker ) /*++ Routine Description: Transfer PEI performance data to gauge data node. Arguments: ImageHandle - Standard entry point parameter SystemTable - Standard entry point parameter Ticker - Start tick Returns: EFI_OUT_OF_RESOURCES - No enough resource to create data node. EFI_SUCCESS - Transfer done successfully. --*/ { EFI_STATUS Status; VOID *HobList; EFI_HOB_GUID_DATA_PERFORMANCE_LOG *LogHob; PEI_PERFORMANCE_MEASURE_LOG_ENTRY *LogEntry; UINT32 Index; EFI_PERF_DATA_LIST *Node; UINT64 TimerValue; Node = CreateDataNode (0, PEI_TOK, NULL); if (!Node) { return EFI_OUT_OF_RESOURCES; } if (Ticker != 0) { TimerValue = Ticker; } else { GetTimerValue (&TimerValue); } (Node->GaugeData).EndTick = TimerValue; InsertTailList (&mPerfDataHead, &(Node->Link)); EfiLibGetSystemConfigurationTable (&gEfiHobListGuid, &HobList); do { Status = GetNextGuidHob (&HobList, &gEfiPeiPerformanceHobGuid, (VOID **) &LogHob, NULL); if (EFI_ERROR (Status)) { break; } for (Index = 0; Index < LogHob->NumberOfEntries; Index++) { LogEntry = &(LogHob->Log[Index]); Node = CreateDataNode (0, LogEntry->DescriptionString, NULL); if (!Node) { return EFI_OUT_OF_RESOURCES; } (Node->GaugeData).StartTick = LogEntry->StartTimeCount; EfiCopyMem (&(Node->GaugeData.GuidName), &LogEntry->Name, sizeof (EFI_GUID)); InsertTailList (&mPerfDataHead, &(Node->Link)); (Node->GaugeData).EndTick = LogEntry->StopTimeCount; } } while (!EFI_ERROR (Status)); return EFI_SUCCESS; }
EFI_STATUS EFIAPI StartGauge ( IN EFI_PERFORMANCE_PROTOCOL *This, IN EFI_HANDLE Handle, IN UINT16 *Token, IN UINT16 *Host, IN UINT64 Ticker ) /*++ Routine Description: Create a guage data node and initialized it. Arguments: This - Calling context Handle - Handle of gauge data Token - Token of gauge data Host - Host of gauge data Ticker - Set gauge data's StartTick. If 0, StartTick is current timer. Returns: EFI_SUCCESS - Successfully create and initialized a guage data node. EFI_OUT_OF_RESOURCES - No enough resource to create a guage data node. --*/ { EFI_PERFORMANCE_INSTANCE *PerfInstance; EFI_PERF_DATA_LIST *Node; UINT64 TimerValue; TimerValue = 0; PerfInstance = EFI_PERFORMANCE_FROM_THIS (This); Node = CreateDataNode (Handle, Token, Host); if (!Node) { return EFI_OUT_OF_RESOURCES; } if (Ticker != 0) { TimerValue = Ticker; } else { GetTimerValue (&TimerValue); } Node->GaugeData.StartTick = TimerValue; if (!EfiStrCmp (Token, DXE_TOK)) { PerfInstance->Phase = DXE_PHASE; } if (!EfiStrCmp (Token, SHELL_TOK)) { PerfInstance->Phase = SHELL_PHASE; } Node->GaugeData.Phase = PerfInstance->Phase; InsertTailList (&mPerfDataHead, &(Node->Link)); return EFI_SUCCESS; }