//\r
// Initialize FIFO to cache records.\r
//\r
-STATIC \r
-EFI_LOCK mFifoLock = EFI_INITIALIZE_LOCK_VARIABLE (EFI_TPL_HIGH_LEVEL);\r
STATIC\r
-LIST_ENTRY mRecordsFifo = INITIALIZE_LIST_HEAD_VARIABLE (mRecordsFifo);\r
+LIST_ENTRY mRecordsFifo = INITIALIZE_LIST_HEAD_VARIABLE (mRecordsFifo);\r
STATIC\r
-UINTN mNumberOfRecords = 0;\r
+LIST_ENTRY mRecordsBuffer = INITIALIZE_LIST_HEAD_VARIABLE (mRecordsBuffer);\r
STATIC\r
EFI_EVENT mLogDataHubEvent;\r
//\r
\r
\r
/**\r
- Return buffer of length DATAHUB_STATUSCODE_RECORD\r
+ Return one DATAHUB_STATUSCODE_RECORD space.\r
+ The size of free record pool would be extend, if the pool is empty. \r
+\r
\r
@retval NULL Can not allocate free memeory for record.\r
@retval !NULL Point to buffer of record.\r
)\r
{\r
DATAHUB_STATUSCODE_RECORD *Record;\r
+ EFI_TPL CurrentTpl;\r
+ LIST_ENTRY *Node;\r
+ UINT32 Index;\r
+\r
+ CurrentTpl = gBS->RaiseTPL (EFI_TPL_HIGH_LEVEL);\r
+\r
+ if (!IsListEmpty (&mRecordsBuffer)) {\r
+ Node = GetFirstNode (&mRecordsBuffer);\r
+ RemoveEntryList (Node);\r
\r
- Record = (DATAHUB_STATUSCODE_RECORD *) AllocateZeroPool (sizeof (DATAHUB_STATUSCODE_RECORD));\r
- if (NULL == Record) {\r
- return NULL;\r
+ Record = CR (Node, DATAHUB_STATUSCODE_RECORD, Node, DATAHUB_STATUS_CODE_SIGNATURE);\r
+ } else {\r
+ if (CurrentTpl > EFI_TPL_NOTIFY) {\r
+ gBS->RestoreTPL (CurrentTpl);\r
+ return NULL;\r
+ }\r
+\r
+ gBS->RestoreTPL (CurrentTpl);\r
+ Record = (DATAHUB_STATUSCODE_RECORD *) AllocateZeroPool (sizeof (DATAHUB_STATUSCODE_RECORD) * 16);\r
+ if (NULL == Record) {\r
+ return NULL;\r
+ }\r
+\r
+ CurrentTpl = gBS->RaiseTPL (EFI_TPL_HIGH_LEVEL);\r
+ for (Index = 1; Index < 16; Index++) {\r
+ InsertTailList (&mRecordsBuffer, &Record[Index].Node);\r
+ }\r
}\r
- Record->Signature = DATAHUB_STATUS_CODE_SIGNATURE;\r
\r
- EfiAcquireLock (&mFifoLock);\r
+ Record->Signature = DATAHUB_STATUS_CODE_SIGNATURE;\r
InsertTailList (&mRecordsFifo, &Record->Node);\r
- mNumberOfRecords++;\r
- EfiReleaseLock (&mFifoLock);\r
+\r
+ gBS->RestoreTPL (CurrentTpl);\r
\r
return Record;\r
}\r
IN DATAHUB_STATUSCODE_RECORD *Record\r
)\r
{\r
+ EFI_TPL CurrentTpl;\r
+\r
ASSERT (Record != NULL);\r
- ASSERT (mNumberOfRecords != 0);\r
\r
- EfiAcquireLock (&mFifoLock);\r
+ CurrentTpl = gBS->RaiseTPL (EFI_TPL_HIGH_LEVEL);\r
+\r
RemoveEntryList (&Record->Node);\r
- mNumberOfRecords--;\r
- EfiReleaseLock (&mFifoLock);\r
+ InsertTailList (&mRecordsBuffer, &Record->Node);\r
\r
- FreePool (Record);\r
+ gBS->RestoreTPL (CurrentTpl);\r
}\r
\r
\r
UINT32 Size;\r
UINT64 DataRecordClass;\r
LIST_ENTRY *Node;\r
+ EFI_TPL CurrentTpl;\r
\r
//\r
// Log DataRecord in Data Hub.\r
// Journal records fifo to find all record entry.\r
//\r
//\r
+ CurrentTpl = gBS->RaiseTPL (EFI_TPL_HIGH_LEVEL);\r
+\r
for (Node = mRecordsFifo.ForwardLink; Node != &mRecordsFifo;) {\r
Record = CR (Node, DATAHUB_STATUSCODE_RECORD, Node, DATAHUB_STATUS_CODE_SIGNATURE);\r
Node = Node->ForwardLink;\r
Size\r
);\r
\r
+\r
+\r
FreeRecordBuffer (Record);\r
}\r
+\r
+ gBS->RestoreTPL (CurrentTpl);\r
}\r
\r
\r