Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

306 lines
8.8 KiB

  1. /*==========================================================================
  2. *
  3. * Copyright (C) 2000-2000 Microsoft Corporation. All Rights Reserved.
  4. *
  5. * File: Pools.cpp
  6. * Content: Pool utility functions
  7. *
  8. *
  9. * History:
  10. * Date By Reason
  11. * ==== == ======
  12. * 01/20/2000 jtk Derived from Utils.h
  13. ***************************************************************************/
  14. #include "dnmdmi.h"
  15. #undef DPF_SUBCOMP
  16. #define DPF_SUBCOMP DN_SUBCOMP_MODEM
  17. //**********************************************************************
  18. // Constant definitions
  19. //**********************************************************************
  20. //**********************************************************************
  21. // Macro definitions
  22. //**********************************************************************
  23. //**********************************************************************
  24. // Structure definitions
  25. //**********************************************************************
  26. //**********************************************************************
  27. // Variable definitions
  28. //**********************************************************************
  29. //
  30. // pool for com endpoints
  31. //
  32. CFixedPool g_ComEndpointPool;
  33. CFixedPool g_ModemCommandDataPool;
  34. CFixedPool g_ComPortPool;
  35. CFixedPool g_ModemEndpointPool;
  36. CFixedPool g_ModemPortPool;
  37. CFixedPool g_ModemThreadPoolPool;
  38. CFixedPool g_ModemReadIODataPool;
  39. CFixedPool g_ModemWriteIODataPool;
  40. CFixedPool g_ModemThreadPoolJobPool;
  41. CFixedPool g_ModemTimerEntryPool;
  42. #define COMEP_POOL_INITED 0x00000001
  43. #define CMDDATA_POOL_INITED 0x00000002
  44. #define COMPORT_POOL_INITED 0x00000004
  45. #define MODEMEP_POOL_INITED 0x00000008
  46. #define MODEMPORT_POOL_INITED 0x00000010
  47. #define THREADPOOL_POOL_INITED 0x00000020
  48. #define READIODATA_POOL_INITED 0x00000040
  49. #define WRITEIODATA_POOL_INITED 0x00000080
  50. #define THREADJOB_POOL_INITED 0x00000100
  51. #define TIMERENTRY_POOL_INITED 0x00000200
  52. DWORD g_dwModemInitFlags = 0;
  53. //**********************************************************************
  54. // Function prototypes
  55. //**********************************************************************
  56. //**********************************************************************
  57. // Function definitions
  58. //**********************************************************************
  59. //**********************************************************************
  60. // ------------------------------
  61. // ModemInitializePools - initialize pools
  62. //
  63. // Entry: Nothing
  64. //
  65. // Exit: Boolean indicating success
  66. // TRUE = success
  67. // FALSE = failure
  68. // ------------------------------
  69. #undef DPF_MODNAME
  70. #define DPF_MODNAME "ModemInitializePools"
  71. BOOL ModemInitializePools( void )
  72. {
  73. if (!g_ComEndpointPool.Initialize(sizeof(CModemEndpoint), CModemEndpoint::PoolAllocFunction, CModemEndpoint::PoolInitFunction, CModemEndpoint::PoolReleaseFunction, CModemEndpoint::PoolDeallocFunction))
  74. {
  75. goto Failure;
  76. }
  77. g_dwModemInitFlags |= COMEP_POOL_INITED;
  78. if (!g_ModemCommandDataPool.Initialize(sizeof(CModemCommandData), CModemCommandData::PoolAllocFunction, CModemCommandData::PoolInitFunction, CModemCommandData::PoolReleaseFunction, CModemCommandData::PoolDeallocFunction))
  79. {
  80. goto Failure;
  81. }
  82. g_dwModemInitFlags |= CMDDATA_POOL_INITED;
  83. if (!g_ComPortPool.Initialize(sizeof(CDataPort), CDataPort::PoolAllocFunction, CDataPort::PoolInitFunction, CDataPort::PoolReleaseFunction, CDataPort::PoolDeallocFunction))
  84. {
  85. goto Failure;
  86. }
  87. g_dwModemInitFlags |= COMPORT_POOL_INITED;
  88. if (!g_ModemEndpointPool.Initialize(sizeof(CModemEndpoint), CModemEndpoint::PoolAllocFunction, CModemEndpoint::PoolInitFunction, CModemEndpoint::PoolReleaseFunction, CModemEndpoint::PoolDeallocFunction))
  89. {
  90. goto Failure;
  91. }
  92. g_dwModemInitFlags |= MODEMEP_POOL_INITED;
  93. if (!g_ModemPortPool.Initialize(sizeof(CDataPort), CDataPort::PoolAllocFunction, CDataPort::PoolInitFunction, CDataPort::PoolReleaseFunction, CDataPort::PoolDeallocFunction))
  94. {
  95. goto Failure;
  96. }
  97. g_dwModemInitFlags |= MODEMPORT_POOL_INITED;
  98. if (!g_ModemThreadPoolPool.Initialize(sizeof(CModemThreadPool), CModemThreadPool::PoolAllocFunction, CModemThreadPool::PoolInitFunction, NULL, CModemThreadPool::PoolDeallocFunction))
  99. {
  100. goto Failure;
  101. }
  102. g_dwModemInitFlags |= THREADPOOL_POOL_INITED;
  103. if (!g_ModemReadIODataPool.Initialize(sizeof(CModemReadIOData), CModemReadIOData::PoolAllocFunction, CModemReadIOData::PoolInitFunction, CModemReadIOData::PoolReleaseFunction, CModemReadIOData::PoolDeallocFunction))
  104. {
  105. goto Failure;
  106. }
  107. g_dwModemInitFlags |= READIODATA_POOL_INITED;
  108. if (!g_ModemWriteIODataPool.Initialize(sizeof(CModemWriteIOData), CModemWriteIOData::PoolAllocFunction, CModemWriteIOData::PoolInitFunction, CModemWriteIOData::PoolReleaseFunction, CModemWriteIOData::PoolDeallocFunction))
  109. {
  110. goto Failure;
  111. }
  112. g_dwModemInitFlags |= WRITEIODATA_POOL_INITED;
  113. if (!g_ModemThreadPoolJobPool.Initialize(sizeof(THREAD_POOL_JOB), ThreadPoolJob_Alloc, ThreadPoolJob_Get, ThreadPoolJob_Release, NULL))
  114. {
  115. goto Failure;
  116. }
  117. g_dwModemInitFlags |= THREADJOB_POOL_INITED;
  118. if (!g_ModemTimerEntryPool.Initialize(sizeof(TIMER_OPERATION_ENTRY), ModemTimerEntry_Alloc, ModemTimerEntry_Get, ModemTimerEntry_Release, ModemTimerEntry_Dealloc))
  119. {
  120. goto Failure;
  121. }
  122. g_dwModemInitFlags |= TIMERENTRY_POOL_INITED;
  123. return TRUE;
  124. Failure:
  125. ModemDeinitializePools();
  126. return FALSE;
  127. }
  128. //**********************************************************************
  129. //**********************************************************************
  130. // ------------------------------
  131. // ModemDeinitializePools - deinitialize the pools
  132. //
  133. // Entry: Nothing
  134. //
  135. // Exit: Nothing
  136. // ------------------------------
  137. #undef DPF_MODNAME
  138. #define DPF_MODNAME "ModemDeinitializePools"
  139. void ModemDeinitializePools( void )
  140. {
  141. if (g_dwModemInitFlags & COMEP_POOL_INITED)
  142. {
  143. g_ComEndpointPool.DeInitialize();
  144. }
  145. // NOTE: WriteIOData's keep CommandData structures on them while they are in the pool
  146. // If we don't clean up the WriteIOData pool first, we will have outstanding items in the
  147. // CommandData pool.
  148. if (g_dwModemInitFlags & WRITEIODATA_POOL_INITED)
  149. {
  150. g_ModemWriteIODataPool.DeInitialize();
  151. }
  152. if (g_dwModemInitFlags & CMDDATA_POOL_INITED)
  153. {
  154. g_ModemCommandDataPool.DeInitialize();
  155. }
  156. if (g_dwModemInitFlags & COMPORT_POOL_INITED)
  157. {
  158. g_ComPortPool.DeInitialize();
  159. }
  160. if (g_dwModemInitFlags & MODEMEP_POOL_INITED)
  161. {
  162. g_ModemEndpointPool.DeInitialize();
  163. }
  164. if (g_dwModemInitFlags & MODEMPORT_POOL_INITED)
  165. {
  166. g_ModemPortPool.DeInitialize();
  167. }
  168. if (g_dwModemInitFlags & THREADPOOL_POOL_INITED)
  169. {
  170. g_ModemThreadPoolPool.DeInitialize();
  171. }
  172. if (g_dwModemInitFlags & READIODATA_POOL_INITED)
  173. {
  174. g_ModemReadIODataPool.DeInitialize();
  175. }
  176. if (g_dwModemInitFlags & THREADJOB_POOL_INITED)
  177. {
  178. g_ModemThreadPoolJobPool.DeInitialize();
  179. }
  180. if (g_dwModemInitFlags & TIMERENTRY_POOL_INITED)
  181. {
  182. g_ModemTimerEntryPool.DeInitialize();
  183. }
  184. g_dwModemInitFlags = 0;
  185. }
  186. //**********************************************************************
  187. //**********************************************************************
  188. // ------------------------------
  189. // CreateDataPort - create a data port
  190. //
  191. // Entry: Nothing
  192. //
  193. // Exit: Pointer to DataPort
  194. // ------------------------------
  195. #undef DPF_MODNAME
  196. #define DPF_MODNAME "CreateDataPort"
  197. CDataPort *CreateDataPort( DATA_PORT_POOL_CONTEXT *pPoolContext )
  198. {
  199. CDataPort *pReturn;
  200. pReturn = NULL;
  201. switch ( pPoolContext->pSPData->GetType() )
  202. {
  203. case TYPE_SERIAL:
  204. {
  205. pReturn = (CDataPort*)g_ComPortPool.Get( pPoolContext );
  206. break;
  207. }
  208. case TYPE_MODEM:
  209. {
  210. pReturn = (CDataPort*)g_ModemPortPool.Get( pPoolContext );
  211. break;
  212. }
  213. default:
  214. {
  215. DNASSERT( FALSE );
  216. break;
  217. }
  218. }
  219. return pReturn;
  220. }
  221. //**********************************************************************
  222. //**********************************************************************
  223. // ------------------------------
  224. // CreateEndpoint - create an endpoint
  225. //
  226. // Entry: Nothing
  227. //
  228. // Exit: Pointer to Endpoint
  229. // ------------------------------
  230. #undef DPF_MODNAME
  231. #define DPF_MODNAME "CreateEndpoint"
  232. CModemEndpoint *CreateEndpoint( ENDPOINT_POOL_CONTEXT *const pPoolContext )
  233. {
  234. CModemEndpoint *pReturn;
  235. pReturn = NULL;
  236. switch ( pPoolContext->pSPData->GetType() )
  237. {
  238. case TYPE_SERIAL:
  239. {
  240. pPoolContext->fModem = FALSE;
  241. pReturn = (CModemEndpoint*)g_ComEndpointPool.Get( pPoolContext );
  242. break;
  243. }
  244. case TYPE_MODEM:
  245. {
  246. pPoolContext->fModem = TRUE;
  247. pReturn = (CModemEndpoint*)g_ModemEndpointPool.Get( pPoolContext );
  248. break;
  249. }
  250. default:
  251. {
  252. DNASSERT( FALSE );
  253. break;
  254. }
  255. }
  256. return pReturn;
  257. }
  258. //**********************************************************************