summaryrefslogtreecommitdiff
path: root/AVStream/avscamera/sys/WorkItem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'AVStream/avscamera/sys/WorkItem.cpp')
-rw-r--r--AVStream/avscamera/sys/WorkItem.cpp167
1 files changed, 167 insertions, 0 deletions
diff --git a/AVStream/avscamera/sys/WorkItem.cpp b/AVStream/avscamera/sys/WorkItem.cpp
new file mode 100644
index 00000000..9bb0d795
--- /dev/null
+++ b/AVStream/avscamera/sys/WorkItem.cpp
@@ -0,0 +1,167 @@
+/**************************************************************************
+
+ A/V Stream Camera Sample
+
+ Copyright (c) 2014, Microsoft Corporation.
+
+ File:
+
+ workitem.cpp
+
+ Abstract:
+
+ This module contains an implementation for KWorkItem.
+
+ A KWorkItem inherits from CRef and is reference counted. The object
+ cannot be destroyed until all references are released. This includes
+ the reference held when the workitem is in flight. This allows you
+ to store the workitem in an object that has a lifecycle shorter than
+ the parent device object.
+
+ History:
+
+ created 5/30/2014
+
+**************************************************************************/
+
+#include "Common.h"
+
+KWorkItem::
+KWorkItem(
+ _In_ PDEVICE_OBJECT DeviceObj,
+ _In_ PIO_WORKITEM_ROUTINE Callback,
+ _In_ PVOID Context,
+ _In_ WORK_QUEUE_TYPE QueueType
+)
+ : m_Callback( Callback )
+ , m_Context ( Context )
+ , m_QueueType( QueueType )
+/*++
+
+Routine Description:
+
+ Constructor.
+
+ Sets up callback handler for the workitem and performs initialization.
+
+Arguments:
+
+ None.
+
+Return Value:
+
+ None.
+
+--*/
+{
+ m_WorkItem = IoAllocateWorkItem( DeviceObj );
+}
+
+
+KWorkItem::
+~KWorkItem()
+/*++
+
+Routine Description:
+
+ Destructor.
+
+ Blocks until all references are released, then frees the workitem.
+
+Arguments:
+
+ None.
+
+Return Value:
+
+ None.
+
+--*/
+{
+ // Make sure the work item has been run down.
+ Wait();
+
+ // Now delete it.
+ if( m_WorkItem )
+ {
+ IoFreeWorkItem( m_WorkItem );
+ }
+}
+
+BOOLEAN
+KWorkItem::
+Start()
+/*++
+
+Routine Description:
+
+ Enqueue this workitem and acquires a reference on the object.
+
+Arguments:
+
+ None.
+
+Return Value:
+
+ TRUE - a workitem was scheduled.
+
+--*/
+{
+ // Make sure construction succeeded.
+ if( m_WorkItem )
+ {
+ // Make sure the work item isn't already in flight and acquire the lock.
+ // This is to make sure this KWorkItem doesn't get destroyed until
+ // the callback is complete.
+ if( Acquire() )
+ {
+ // Schedule the work item.
+ IoQueueWorkItem( m_WorkItem, &KWorkItem::Handler, m_QueueType, this );
+
+ // Note: Release() is called in Handler.
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+VOID
+KWorkItem::
+Handler(
+ _In_ PDEVICE_OBJECT IoObject,
+ _In_opt_ PVOID Context
+)
+/*++
+
+Routine Description:
+
+ Callback thunking function.
+
+ Calls the callback handler registered in the constructor, if one exists.
+ Releases the reference on this object.
+
+Arguments:
+
+ IoObject -
+ The parent device object.
+ Context -
+ An optional context object.
+
+Return Value:
+
+ void
+
+--*/
+{
+ // Get our "this" pointer (Me).
+ KWorkItem *Me = (KWorkItem *) Context;
+
+ // Invoke the callback if one exists.
+ if( Me->m_Callback )
+ {
+ Me->m_Callback( IoObject, Me->m_Context );
+ }
+
+ // Unlock the work item; allow for destruction or re-enqueing.
+ Me->Release();
+}