static VOID GetIoQueueList_ProcessQueueListEntry( PLIST_ENTRY QueueLE, PSINGLE_LIST_ENTRY SListHead, PVOID Tag ) { FxIoQueueNode* listNode; FxIoQueue* queue; // // Skip any nodes that are not queues. They can be bookmarks for // in-progress flush operations. // listNode = FxIoQueueNode::_FromListEntry(QueueLE); if (listNode->IsNodeType(FxIoQueueNodeTypeQueue) == FALSE) { return; } queue = FxIoQueue::_FromIoPkgListEntry(QueueLE); PushEntryList(SListHead, &queue->m_PowerSListEntry); // // Add a reference since the request will be touched outside of the // lock being held. We will use the enumerant value as the tag. // queue->ADDREF(Tag); }
FxIoQueue* FxPkgIo::GetNextIoQueueLocked( __in FxIoQueueNode* QueueBookmark, __in PVOID Tag ) /*++ Routine Description: Moves the provided bookmark ahead in the IO Package's queue list and returns the next available queue (if any). Return Value: NULL if there are no more queues in list else FxIoQueue* reference to the next queue in list. --*/ { PLIST_ENTRY ple = NULL; FxIoQueue* queue = NULL; FxIoQueueNode* listNode = NULL; ASSERT(QueueBookmark->IsNodeType(FxIoQueueNodeTypeBookmark)); ASSERT(IsListEmpty(&QueueBookmark->m_ListEntry) == FALSE); // // Try to advance bookmark to next location. // ple = QueueBookmark->m_ListEntry.Flink; RemoveEntryList(&QueueBookmark->m_ListEntry); InitializeListHead(&QueueBookmark->m_ListEntry); for (; ple != &m_IoQueueListHead; ple = ple->Flink) { // // Skip any nodes that are not queues. These nodes can be // bookmarks for in-progress flush operations. // listNode = FxIoQueueNode::_FromListEntry(ple); if (listNode->IsNodeType(FxIoQueueNodeTypeQueue)) { // // This entry is a real queue. // queue = FxIoQueue::_FromIoPkgListEntry(ple); queue->ADDREF(Tag); // // Insert bookmark after this entry. // InsertHeadList(ple, &QueueBookmark->m_ListEntry); break; } } return queue; }