TaskAllocator.cpp
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:5k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* TaskAllocator.cpp - COM/DCOM TaskAllocator class implementation */
  2. /*
  3. modification history
  4. --------------------
  5. 01r,17dec01,nel  Add include symbol for diab.
  6. 01q,23oct01,nel  SPR#71142. Add call to comSysRealloc to Realloc method.
  7. 01p,13jul01,dbs  remove NEW macro usage
  8. 01o,27jun01,dbs  fix include paths and names
  9. 01n,19aug99,aim  TASK_LOCK now uses mutex
  10. 01m,19aug99,aim  added TraceCall header
  11. 01l,05aug99,aim  added mutex
  12. 01k,16jul99,aim  undef Free if defined
  13. 01j,17jun99,dbs  use NEW not new
  14. 01i,17jun99,aim  added standard OPERATOR_NEW_AND_DELETE
  15. 01h,02jun99,dbs  use new OS-specific macros
  16. 01g,28may99,dbs  simplify allocator strategy
  17. 01f,27may99,dbs  change to vxdcomTarget.h
  18. 01e,05may99,dbs  fix TASK_LOCK macros under Win32, trim old code out
  19. 01d,29apr99,dbs  fix warnings under -Wall
  20. 01c,29apr99,dbs  use main COM allocator
  21. 01b,26apr99,aim  added TRACE_CALL
  22. 01a,20apr99,dbs  created during Grand Renaming
  23. */
  24. /*
  25.   DESCRIPTION:
  26.   TaskAllocator -- 
  27. */
  28. #include "TaskAllocator.h"
  29. #include "private/comMisc.h"
  30. #include "private/comSysLib.h"
  31. #include "TraceCall.h"
  32. /* Include symbol for diab */
  33. extern "C" int include_vxcom_TaskAllocator (void)
  34.     {
  35.     return 0;
  36.     }
  37. ////////////////////////////////////////////////////////////////////////////
  38. //
  39. // Global Variables -- the pointer 'pSysAllocator' points to the
  40. // IMalloc interface of the current system allocator. In future, there
  41. // may be one per application (one per PD, for example), but right now
  42. // there can only be one ;-)
  43. //
  44. ////////////////////////////////////////////////////////////////////////////
  45. IMalloc* pSysAllocator = 0;
  46. static VxMutex coGetMallocLock;
  47. ////////////////////////////////////////////////////////////////////////////
  48. //
  49. VxTaskAllocator::VxTaskAllocator ()
  50.   : m_dwRefCount (0),
  51.     m_mutex ()
  52.     {
  53.     TRACE_CALL;
  54.     }
  55. ////////////////////////////////////////////////////////////////////////////
  56. //
  57. VxTaskAllocator::~VxTaskAllocator ()
  58.     {
  59.     TRACE_CALL;
  60.     }
  61. ////////////////////////////////////////////////////////////////////////////
  62. //
  63. ULONG VxTaskAllocator::AddRef ()
  64.     {
  65.     TRACE_CALL;
  66.     VxCritSec cs (m_mutex);
  67.     return ++m_dwRefCount;
  68.     }
  69. ////////////////////////////////////////////////////////////////////////////
  70. //
  71. ULONG VxTaskAllocator::Release ()
  72.     {
  73.     TRACE_CALL;
  74.     VxCritSec cs (m_mutex);
  75.     if (--m_dwRefCount)
  76. return m_dwRefCount;
  77.     delete this;
  78.     return 0;
  79.     }
  80. ////////////////////////////////////////////////////////////////////////////
  81. //
  82. HRESULT VxTaskAllocator::QueryInterface
  83.     (
  84.     REFIID riid,
  85.     void** ppv
  86.     )
  87.     {
  88.     TRACE_CALL;
  89.     // Is it one of our own interfaces?
  90.     if ((riid == IID_IUnknown) || (riid == IID_IMalloc))
  91. {
  92. *ppv = this;
  93.         AddRef ();
  94. return S_OK;
  95. }
  96.     return E_NOINTERFACE;
  97.     }
  98. ////////////////////////////////////////////////////////////////////////////
  99. //
  100. void* VxTaskAllocator::Alloc (ULONG cb)
  101.     {
  102.     TRACE_CALL;
  103.     return comSysAlloc (cb);
  104.     }
  105. ////////////////////////////////////////////////////////////////////////////
  106. //
  107. void* VxTaskAllocator::Realloc (void *pv, ULONG cb)
  108.     {
  109.     TRACE_CALL;
  110.     return comSysRealloc (pv, cb);
  111.     }
  112. ////////////////////////////////////////////////////////////////////////////
  113. //
  114. // resolve clashes in networking headers
  115. #ifdef Free
  116. #undef Free
  117. #endif
  118. void VxTaskAllocator::Free (void *pv)
  119.     {
  120.     TRACE_CALL;
  121.     comSysFree (pv);
  122.     }
  123. ////////////////////////////////////////////////////////////////////////////
  124. //
  125. ULONG VxTaskAllocator::GetSize (void *pv)
  126.     {
  127.     TRACE_CALL;
  128.     return (ULONG) -1;
  129.     }
  130. ////////////////////////////////////////////////////////////////////////////
  131. //
  132. int VxTaskAllocator::DidAlloc (void *pv)
  133.     {
  134.     TRACE_CALL;
  135.     return -1;
  136.     }
  137. ////////////////////////////////////////////////////////////////////////////
  138. //
  139. void VxTaskAllocator::HeapMinimize ()
  140.     {
  141.     TRACE_CALL;
  142.     }
  143. ////////////////////////////////////////////////////////////////////////////
  144. //
  145. // comCoGetMalloc - gets a pointer to the task-allocator for the current
  146. // task, which is always the system allocator. If there is already one
  147. // then it simply adds a reference for it, if not then it creates one
  148. // afresh...
  149. //
  150. HRESULT comCoGetMalloc 
  151.     (
  152.     DWORD               dwMemContext,   // MUST BE 1
  153.     IMalloc**           ppMalloc        // output ptr
  154.     )
  155.     {
  156.     TRACE_CALL;
  157.     HRESULT hr = S_OK;
  158.     
  159.     VxCritSec cs (coGetMallocLock);
  160.     
  161.     // Make sure context is valid
  162.     if (dwMemContext != 1)
  163. return E_INVALIDARG;
  164.     // Check for existing allocator...
  165.     if (! pSysAllocator)
  166. {
  167. // Must create a new one, always keep one extra ref (from QI)
  168. // so it never gets destroyed...
  169. VxTaskAllocator* pa = new VxTaskAllocator ();
  170. if (pa)
  171.     hr = pa->QueryInterface (IID_IMalloc,
  172.      (void**) &pSysAllocator);
  173. else
  174.     hr = E_OUTOFMEMORY;
  175. }
  176.     // Hand out a reference to the existing allocator...
  177.     if (SUCCEEDED (hr))
  178. {
  179. pSysAllocator->AddRef ();
  180. *ppMalloc = pSysAllocator;
  181. }
  182.     return hr;
  183.     }