Source code of Windows XP (NT5)
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.

255 lines
5.5 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000-2001 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // TaskKeepMTAAlive.cpp
  7. //
  8. // Description:
  9. // Keep MTA Alive Task implementation.
  10. //
  11. // Maintained By:
  12. // Galen Barbee (GalenB) 17-APR-2000
  13. //
  14. //////////////////////////////////////////////////////////////////////////////
  15. #include "pch.h"
  16. #include "TaskKeepMTAAlive.h"
  17. DEFINE_THISCLASS("CTaskKeepMTAAlive")
  18. // ************************************************************************
  19. //
  20. // Constructor / Destructor
  21. //
  22. // ************************************************************************
  23. //////////////////////////////////////////////////////////////////////////////
  24. //
  25. // HRESULT
  26. // CTaskKeepMTAAlive::S_HrCreateInstance(
  27. // IUnknown ** ppunkOut
  28. // )
  29. //
  30. //////////////////////////////////////////////////////////////////////////////
  31. HRESULT
  32. CTaskKeepMTAAlive::S_HrCreateInstance(
  33. IUnknown ** ppunkOut
  34. )
  35. {
  36. TraceFunc( "" );
  37. Assert( ppunkOut != NULL );
  38. HRESULT hr;
  39. CTaskKeepMTAAlive * ptkmtaa = new CTaskKeepMTAAlive;
  40. // Self terminating - no need to track
  41. TraceMemoryDelete( ptkmtaa, FALSE );
  42. if ( ptkmtaa != NULL )
  43. {
  44. hr = THR( ptkmtaa->Init() );
  45. if ( SUCCEEDED( hr ) )
  46. {
  47. hr = THR( ptkmtaa->TypeSafeQI( IUnknown, ppunkOut ) );
  48. }
  49. ptkmtaa->Release();
  50. }
  51. else
  52. {
  53. hr = E_OUTOFMEMORY;
  54. }
  55. HRETURN( hr );
  56. } // S_HrCreateInstance()
  57. //////////////////////////////////////////////////////////////////////////////
  58. //
  59. // CTaskKeepMTAAlive::CTaskKeepMTAAlive( void )
  60. //
  61. //////////////////////////////////////////////////////////////////////////////
  62. CTaskKeepMTAAlive::CTaskKeepMTAAlive( void )
  63. : m_cRef( 1 )
  64. {
  65. TraceFunc( "" );
  66. InterlockedIncrement( &g_cObjects );
  67. Assert( m_fStop == false );
  68. TraceFuncExit();
  69. } // CTaskKeepMTAAlive()
  70. //////////////////////////////////////////////////////////////////////////////
  71. //
  72. // STDMETHODIMP
  73. // CTaskKeepMTAAlive::Init( void )
  74. //
  75. //////////////////////////////////////////////////////////////////////////////
  76. STDMETHODIMP
  77. CTaskKeepMTAAlive::Init( void )
  78. {
  79. TraceFunc( "" );
  80. HRESULT hr = S_OK;
  81. HRETURN( hr );
  82. } // Init()
  83. //////////////////////////////////////////////////////////////////////////////
  84. //
  85. // CTaskKeepMTAAlive::~CTaskKeepMTAAlive()
  86. //
  87. //////////////////////////////////////////////////////////////////////////////
  88. CTaskKeepMTAAlive::~CTaskKeepMTAAlive()
  89. {
  90. TraceFunc( "" );
  91. InterlockedDecrement( &g_cObjects );
  92. TraceFuncExit();
  93. } // ~CTaskKeepMTAAlive()
  94. // ************************************************************************
  95. //
  96. // IUnknown
  97. //
  98. // ************************************************************************
  99. //////////////////////////////////////////////////////////////////////////////
  100. //
  101. // STDMETHODIMP
  102. // CTaskKeepMTAAlive::QueryInterface(
  103. // REFIID riid,
  104. // LPVOID *ppv
  105. // )
  106. //
  107. //////////////////////////////////////////////////////////////////////////////
  108. STDMETHODIMP
  109. CTaskKeepMTAAlive::QueryInterface(
  110. REFIID riid,
  111. LPVOID *ppv
  112. )
  113. {
  114. TraceQIFunc( riid, ppv );
  115. HRESULT hr = E_NOINTERFACE;
  116. if ( IsEqualIID( riid, IID_IUnknown ) )
  117. {
  118. *ppv = static_cast< IDoTask * >( this );
  119. hr = S_OK;
  120. } // if: IUnknown
  121. else if ( IsEqualIID( riid, IID_IDoTask ) )
  122. {
  123. *ppv = TraceInterface( __THISCLASS__, IDoTask, this, 0 );
  124. hr = S_OK;
  125. } // else if: IDoTask
  126. if ( SUCCEEDED( hr ) )
  127. {
  128. ((IUnknown*) *ppv)->AddRef();
  129. } // if: success
  130. QIRETURN( hr, riid );
  131. } // QueryInterface()
  132. //////////////////////////////////////////////////////////////////////////////
  133. //
  134. // STDMETHODIMP_(ULONG)
  135. // CTaskKeepMTAAlive::AddRef( void )
  136. //
  137. //////////////////////////////////////////////////////////////////////////////
  138. STDMETHODIMP_(ULONG)
  139. CTaskKeepMTAAlive::AddRef( void )
  140. {
  141. TraceFunc( "[IUnknown]" );
  142. InterlockedIncrement( &m_cRef );
  143. RETURN( m_cRef );
  144. } // AddRef()
  145. //////////////////////////////////////////////////////////////////////////////
  146. //
  147. // STDMETHODIMP_(ULONG)
  148. // CTaskKeepMTAAlive::Release( void )
  149. //
  150. //////////////////////////////////////////////////////////////////////////////
  151. STDMETHODIMP_(ULONG)
  152. CTaskKeepMTAAlive::Release( void )
  153. {
  154. TraceFunc( "[IUnknown]" );
  155. InterlockedDecrement( &m_cRef );
  156. if ( m_cRef )
  157. RETURN( m_cRef );
  158. TraceDo( delete this );
  159. RETURN( 0 );
  160. } // Release()
  161. //****************************************************************************
  162. //
  163. // IDoTask
  164. //
  165. //****************************************************************************
  166. //////////////////////////////////////////////////////////////////////////////
  167. //
  168. // STDMETHODIMP
  169. // CTaskKeepMTAAlive::BeginTask()
  170. //
  171. //////////////////////////////////////////////////////////////////////////////
  172. STDMETHODIMP
  173. CTaskKeepMTAAlive::BeginTask()
  174. {
  175. TraceFunc( "[IDoTask]" );
  176. HRESULT hr = S_OK;
  177. MSG msg;
  178. while ( GetMessage( &msg, NULL, 0, 0 ) && !m_fStop )
  179. {
  180. DispatchMessage( &msg );
  181. }
  182. HRETURN( hr );
  183. } //*** BeginTask
  184. //////////////////////////////////////////////////////////////////////////////
  185. //
  186. // STDMETHODIMP
  187. // CTaskKeepMTAAlive::StopTask( void )
  188. //
  189. //////////////////////////////////////////////////////////////////////////////
  190. STDMETHODIMP
  191. CTaskKeepMTAAlive::StopTask( void )
  192. {
  193. TraceFunc( "[IDoTask]" );
  194. HRESULT hr = S_OK;
  195. m_fStop = true;
  196. HRETURN( hr );
  197. } //*** StopTask