hxalloc.h
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:8k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #ifndef __HXALLOC_H_
  36. #define __HXALLOC_H_
  37. ///////////////////
  38. // include files
  39. #include "hxtypes.h"
  40. #include "hxslist.h"
  41. #include "hxstring.h"
  42. #include "hxmap.h"
  43. #include "hxcodec.h"
  44. #include "hxthread.h"
  45. #ifdef WIN32 // for critical section
  46. #ifndef WIN32_LEAN_AND_MEAN
  47. #define WIN32_LEAN_AND_MEAN
  48. #endif
  49. #include <windows.h>
  50. #include <winreg.h>
  51. #endif
  52. //#define RUNTIME_STATISTICS
  53. // On x86 systems we'd like the buffer to be aligned to "HXALLOC_BUFFER_ALIGNMENT" bytes.
  54. // So we'll allocate (uSize + HXALLOC_BUFFER_ALIGNMENT - 1) bytes, and move the returned
  55. // buffer pointer to the correct alignment.
  56. // This number must be a power of 2.
  57. #define HXALLOC_BUFFER_ALIGNMENT 32
  58. // For more efficient memory use, these allocators can use past pool size samples
  59. // to estimate the number of buffers required, and trim appropriately:
  60. // The maximum number of buffers allocated is the maximum number of buffers in 
  61. // use over the last m_uiPoolHistoryDepth series of get calls.  The maximum 
  62. // free list size is then (max buffers in use - current buffers in use) + 1.  
  63. #define DEFAULT_POOL_HISTORY_DEPTH 30
  64. ///////////////////
  65. // private data
  66. ///////////////////
  67. // private functions
  68. class CHXMemoryAllocator;
  69. class CHXMemoryBlock;
  70. struct IHXBuffer;
  71. class CHXMemoryBlock : public IHXUnknown
  72. {
  73. public:
  74.     HX_RESULT QueryInterface(HX_IID iid, void** ppvObj);
  75.     ULONG32 AddRef();
  76.     ULONG32 Release();
  77.     CHXMemoryBlock(CHXMemoryAllocator * pAllocator,  BOOL bGlobalAlloc = FALSE);
  78.     ~CHXMemoryBlock();
  79.     virtual BOOL Allocate(ULONG32 uSize);
  80.     virtual void Free();
  81.     virtual inline ULONG32 GetLength()     { return(m_MemBufferSize); } 
  82. #if defined(_M_IX86)
  83.     virtual inline UCHAR*   GetSampleBase() { return ((UCHAR *)(((ULONG32)m_pMemBuffer + HXALLOC_BUFFER_ALIGNMENT - 1) & ~(HXALLOC_BUFFER_ALIGNMENT - 1))); }
  84. #else
  85.     virtual inline UCHAR*   GetSampleBase() { return (m_pMemBuffer); }
  86. #endif
  87.     virtual inline BOOL IsFree()     { return(m_RefCount == 0); }
  88. protected:
  89.     UCHAR * m_pMemBuffer;
  90.     ULONG32 m_MemBufferSize;
  91.     INT32 m_RefCount;
  92.     HX_BITFIELD m_bUseGlobalAlloc : 1; // Determines whether we use GlobalAlloc or new
  93.     CHXMemoryAllocator * m_pAllocator;  
  94. };
  95. class CHXMemoryAllocator : public IHX20MemoryAllocator
  96. {
  97. public:
  98.     HX_RESULT QueryInterface(HX_IID iid, void** ppvObj);
  99.     ULONG32 AddRef();
  100.     ULONG32 Release();
  101.     CHXMemoryAllocator(const char* szIdentifier,BOOL bThreadSafe=FALSE, 
  102.                        BOOL m_bUseGlobalAlloc=FALSE, 
  103.                        BOOL bEstimateFreeListSize = FALSE, 
  104.                        UINT32 uiPoolHistoryDepth = DEFAULT_POOL_HISTORY_DEPTH);
  105.     CHXMemoryAllocator(BOOL bThreadSafe=FALSE, BOOL m_bUseGlobalAlloc=FALSE,
  106.                        BOOL bEstimateFreeListSize = FALSE, 
  107.                        UINT32 uiPoolHistoryDepth = DEFAULT_POOL_HISTORY_DEPTH);
  108.     ~CHXMemoryAllocator();
  109.     UCHAR *  GetPacketBuffer(IHXUnknown ** pPacketBuffer);
  110.     HX_RESULT SetProperties(HX20ALLOCPROPS* pRequest, HX20ALLOCPROPS* pActual);
  111.     HX_RESULT GetProperties(HX20ALLOCPROPS* pProps);
  112.     CHXMemoryBlock* PacketPtrToPacketObj(UCHAR * memPtr);
  113.     UINT16 AddRefPacketPtr(UCHAR * memPtr);
  114.     UINT16 ReleasePacketPtr(UCHAR * memPtr);
  115.     void NotifyFreeBlock(CHXMemoryBlock * pMemBlock);
  116.     // if RUNTIME_STATISTICS is not defined, this function becomes an inline no-op
  117. #ifdef RUNTIME_STATISTICS
  118.     void                WriteRuntimeStats();
  119. #else
  120.     void                WriteRuntimeStats(){};
  121. #endif
  122. protected:
  123.     CHXMapPtrToPtr m_MemBlockMap;
  124.     ULONG32 m_AllocCount; // number of buffers allocated
  125.     ULONG32 m_uSize; // size of each buffer in bytes
  126.     ULONG32 m_Count; // number of buffers initially requested
  127.     CHXSimpleList m_freeList; // list of free buffers
  128.     INT32 m_ref; // reference count for lifetime control
  129.     HX_BITFIELD m_bThreadSafe : 1;
  130.     HX_BITFIELD m_bUseGlobalAlloc : 1; // Determines whether we use GlobalAlloc or new
  131.     CHXString           m_strIdentifier;
  132. #ifdef WIN32
  133.     CRITICAL_SECTION    m_critsec;
  134.     HKEY                m_hkey;
  135. #else // WIN32
  136.     HXMutex* m_pMutex;
  137. #endif // WIN32
  138.     // For more efficient memory use, these allocators can use past pool size samples
  139.     // to estimate the number of buffers required, and trim appropriately:
  140.     // The maximum number of buffers allocated is the maximum number of buffers in 
  141.     // use over the last m_uiPoolHistoryDepth series of get calls.  The maximum 
  142.     // free list size is then (max buffers in use - current buffers in use) + 1.  
  143.     BOOL                m_bEstimateFreeListSize; 
  144.     UINT32              m_uiPoolHistoryDepth;
  145.     UINT32*             m_puiBufferUseHistory; 
  146.     UINT32              m_uiCurrentHistoryIndex;
  147. };
  148. class CHXBufferMemoryAllocator : public IHX20MemoryAllocator
  149. {
  150. public:
  151.     HX_RESULT QueryInterface(HX_IID iid, void** ppvObj);
  152.     ULONG32 AddRef();
  153.     ULONG32 Release();
  154.     CHXBufferMemoryAllocator(BOOL bThreadSafe = FALSE);
  155.     ~CHXBufferMemoryAllocator();
  156.     UCHAR *  GetPacketBuffer(IHXUnknown ** pPacketBuffer);
  157.     HX_RESULT SetProperties(HX20ALLOCPROPS* pRequest, HX20ALLOCPROPS* pActual);
  158.     HX_RESULT GetProperties(HX20ALLOCPROPS* pProps);
  159.     UINT16 AddRefPacketPtr(UCHAR * memPtr);
  160.     UINT16 ReleasePacketPtr(UCHAR * memPtr);
  161.     UCHAR* AddBuffer(IHXBuffer* pBuf);
  162.     IHXBuffer* GetBuffer(UCHAR* memPtr);
  163. protected:
  164. #ifdef WIN32
  165.     CRITICAL_SECTION    m_critsec;
  166.     BOOL m_bThreadSafe;
  167. #else // WIN32
  168.     HXMutex* m_pMutex;
  169. #endif // WIN32
  170.     CHXMapPtrToPtr m_BufMap; // map IHXBuffer's to their' Buffer.
  171.     ULONG32 m_uSize; // size of each buffer in bytes
  172.     ULONG32 m_Count; // number of buffers initially requested
  173.     INT32 m_ref; // reference count for lifetime control
  174. };
  175. #endif // __HXALLOC_H_