PVOID m_SCEContext; // status change callback routine context
BOOLEAN m_DoorBellRingInProgress; // door bell ring in progress
WORK_QUEUE_ITEM m_StatusChangeWorkItem; // work item for status change callback
- ULONG m_WorkItemActive; // work item status
+ volatile LONG m_StatusChangeWorkItemStatus; // work item status
ULONG m_SyncFramePhysAddr; // periodic frame list physical address
BUS_INTERFACE_STANDARD m_BusInterface; // pci bus interface
BOOLEAN m_PortResetInProgress[0xF]; // stores reset in progress (vbox hack)
//
if (QueueSCEWorkItem && This->m_SCECallBack != NULL)
{
- // work item is now active
- This->m_WorkItemActive = TRUE;
-
- //
- // queue work item for processing
- //
- ExQueueWorkItem(&This->m_StatusChangeWorkItem, DelayedWorkQueue);
+ if (InterlockedCompareExchange(&This->m_StatusChangeWorkItemStatus, 1, 0) == 0)
+ {
+ //
+ // queue work item for processing
+ //
+ ExQueueWorkItem(&This->m_StatusChangeWorkItem, DelayedWorkQueue);
+ }
}
}
return;
This->m_SCECallBack(This->m_SCEContext);
}
- // work item is completed
- This->m_WorkItemActive = FALSE;
+ //
+ // reset active status
+ //
+ InterlockedDecrement(&This->m_StatusChangeWorkItemStatus);
}
NTSTATUS
HD_INIT_CALLBACK* m_SCECallBack; // status change callback routine
PVOID m_SCEContext; // status change callback routine context
WORK_QUEUE_ITEM m_StatusChangeWorkItem; // work item for status change callback
+ volatile LONG m_StatusChangeWorkItemStatus; // work item active status
ULONG m_SyncFramePhysAddr; // periodic frame list physical address
ULONG m_IntervalValue; // periodic interval value
};
//
if (QueueSCEWorkItem && This->m_SCECallBack != NULL)
{
- //
- // queue work item for processing
- //
- ExQueueWorkItem(&This->m_StatusChangeWorkItem, DelayedWorkQueue);
+ if (InterlockedCompareExchange(&This->m_StatusChangeWorkItemStatus, 1, 0) == 0)
+ {
+ //
+ // queue work item for processing
+ //
+ ExQueueWorkItem(&This->m_StatusChangeWorkItem, DelayedWorkQueue);
+ }
}
}
}
This->m_SCECallBack(This->m_SCEContext);
}
+ //
+ // reset active status
+ //
+ InterlockedDecrement(&This->m_StatusChangeWorkItemStatus);
}
NTSTATUS