summaryrefslogtreecommitdiff
path: root/network/trans/WFPSampler/lib/HelperFunctions_ThreadPools.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'network/trans/WFPSampler/lib/HelperFunctions_ThreadPools.cpp')
-rw-r--r--network/trans/WFPSampler/lib/HelperFunctions_ThreadPools.cpp179
1 files changed, 179 insertions, 0 deletions
diff --git a/network/trans/WFPSampler/lib/HelperFunctions_ThreadPools.cpp b/network/trans/WFPSampler/lib/HelperFunctions_ThreadPools.cpp
new file mode 100644
index 00000000..eb2e35a0
--- /dev/null
+++ b/network/trans/WFPSampler/lib/HelperFunctions_ThreadPools.cpp
@@ -0,0 +1,179 @@
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2012 Microsoft Corporation. All Rights Reserved.
+//
+// Module Name:
+// HelperFunctions_ThreadPools.cpp
+//
+// Abstract:
+// This module contains functions for assisting in operations pertaining to Thread Pools.
+//
+// Author:
+// Dusty Harper (DHarper)
+//
+// Revision History:
+//
+// [ Month ][Day] [Year] - [Revision]-[ Comments ]
+// May 01, 2010 - 1.0 - Creation
+//
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#include "HelperFunctions_Include.h" /// .
+
+/**
+ @helper_function="HlprThreadPoolDataPurge"
+
+ Purpose: Cleanup a THREADPOOL_DATA object. <br>
+ <br>
+ Notes: <br>
+ <br>
+ MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/MS682036.aspx <br>
+ HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/MS682033.aspx <br>
+ HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/MS682030.aspx <br>
+ HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/MS682576.aspx <br>
+*/
+inline VOID HlprThreadPoolDataPurge(_Inout_ THREADPOOL_DATA* pThreadPoolData)
+{
+ ASSERT(pThreadPoolData);
+
+ if(pThreadPoolData->pCleanupGroup)
+ {
+ CloseThreadpoolCleanupGroupMembers(pThreadPoolData->pCleanupGroup,
+ FALSE,
+ 0);
+
+ CloseThreadpoolCleanupGroup(pThreadPoolData->pCleanupGroup);
+ }
+
+ if(pThreadPoolData->pThreadPool)
+ CloseThreadpool(pThreadPoolData->pThreadPool);
+
+ DestroyThreadpoolEnvironment(&(pThreadPoolData->callbackEnvironment));
+
+ ZeroMemory(pThreadPoolData,
+ sizeof(THREADPOOL_DATA));
+
+ return;
+}
+
+/**
+ @helper_function="HlprThreadPoolDataDestroy"
+
+ Purpose: Cleanup and free a THREADPOOL_DATA object. <br>
+ <br>
+ Notes: <br>
+ <br>
+ MSDN_Ref: <br>
+*/
+_Success_(*ppThreadPoolData == 0)
+inline VOID HlprThreadPoolDataDestroy(_Inout_ THREADPOOL_DATA** ppThreadPoolData)
+{
+ ASSERT(ppThreadPoolData);
+
+ if(*ppThreadPoolData)
+ HlprThreadPoolDataPurge(*ppThreadPoolData);
+
+ HLPR_DELETE(*ppThreadPoolData);
+
+ return;
+}
+
+/**
+ @helper_function="HlprThreadPoolDataPurge"
+
+ Purpose: Cleanup a THREADPOOL_DATA object. <br>
+ <br>
+ Notes: The caller is responsible for freeing any allocated memory using
+ HlprThreadPoolDataPurge(). <br>
+ <br>
+ MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/MS683486.aspx <br>
+ HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/MS682456.aspx <br>
+ HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/MS682462.aspx <br>
+ HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/MS686261.aspx <br>
+ HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/MS686255.aspx <br>
+
+*/
+_Success_(return == NO_ERROR)
+UINT32 HlprThreadPoolDataPopulate(_Inout_ THREADPOOL_DATA* pThreadPoolData,
+ _In_ const PTP_CLEANUP_GROUP_CANCEL_CALLBACK pGroupCancelFn)
+{
+ ASSERT(pThreadPoolData);
+
+ UINT32 status = NO_ERROR;
+
+ InitializeThreadpoolEnvironment(&(pThreadPoolData->callbackEnvironment));
+
+ pThreadPoolData->pThreadPool = CreateThreadpool(0);
+ if(pThreadPoolData->pThreadPool == 0)
+ {
+ status = GetLastError();
+
+ HlprLogError(L"HlprThreadPoolDataPopulate : CreateThreadPool() [status: %#x]",
+ status);
+
+ HLPR_BAIL;
+ }
+
+ pThreadPoolData->pCleanupGroup = CreateThreadpoolCleanupGroup();
+ if(pThreadPoolData->pCleanupGroup == 0)
+ {
+ status = GetLastError();
+
+ HlprLogError(L"HlprThreadPoolDataPopulate : CreateThreadPool() [status: %#x]",
+ status);
+
+ HLPR_BAIL;
+ }
+
+ SetThreadpoolCallbackPool(&(pThreadPoolData->callbackEnvironment),
+ pThreadPoolData->pThreadPool);
+
+ SetThreadpoolCallbackCleanupGroup(&(pThreadPoolData->callbackEnvironment),
+ pThreadPoolData->pCleanupGroup,
+ pGroupCancelFn);
+
+ HLPR_BAIL_LABEL:
+
+ if(status != NO_ERROR)
+ HlprThreadPoolDataPurge(pThreadPoolData);
+
+ return status;
+}
+
+/**
+ @helper_function="HlprThreadPoolDataDestroy"
+
+ Purpose: Allocate and populate a THREADPOOL_DATA object. <br>
+ <br>
+ Notes: The caller is responsible for freeing any allocated memory using
+ HlprThreadPoolDataDestroy(). <br>
+ <br>
+ MSDN_Ref: <br>
+*/
+_At_(*ppThreadPoolData, _Pre_ _Null_)
+_When_(return != NO_ERROR, _At_(*ppThreadPoolData, _Post_ _Null_))
+_When_(return == NO_ERROR, _At_(*ppThreadPoolData, _Post_ _Notnull_))
+_Success_(return == NO_ERROR)
+UINT32 HlprThreadPoolDataCreate(_Outptr_ THREADPOOL_DATA** ppThreadPoolData,
+ _In_ const PTP_CLEANUP_GROUP_CANCEL_CALLBACK pGroupCancelFn)
+{
+ ASSERT(ppThreadPoolData);
+
+ UINT32 status = NO_ERROR;
+
+ HLPR_NEW(*ppThreadPoolData,
+ THREADPOOL_DATA);
+ HLPR_BAIL_ON_ALLOC_FAILURE(*ppThreadPoolData,
+ status);
+
+ status = HlprThreadPoolDataPopulate(*ppThreadPoolData,
+ pGroupCancelFn);
+
+ HLPR_BAIL_LABEL:
+
+ if(status != NO_ERROR)
+ HlprThreadPoolDataDestroy(ppThreadPoolData);
+
+
+ return status;
+}