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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: mmapmgr.h,v 1.5.32.3 2004/07/09 01:44:53 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #ifndef _MMAPMGR_H_
  50. #define _MMAPMGR_H_
  51. #include "hxtypes.h"
  52. #include "hxcom.h"
  53. #include "hxbuffer.h"
  54. #include "hxslist.h"
  55. #include "hxengin.h"
  56. #include "hxcomm.h"
  57. #include "hxmap.h"
  58. struct IHXScheduler;
  59. struct IHXDescriptorRegistration;
  60. #define NUMBER_OF_REAP_BUCKETS 3
  61. #define MMAP_EXCEPTION                                  0xfffffff1
  62. #define MMAP_EOF_EXCEPTION   0xfffffff2
  63. #define NUM_PTES 128
  64. #if defined(_UNIX) || defined(_SYMBIAN)
  65. #define FILE_IDENTIFIER int
  66. #else
  67. #define FILE_IDENTIFIER HANDLE
  68. #endif
  69. #if defined _WIN32 || defined(HELIX_FEATURE_THREADSAFE_MEMMAP_IO)
  70. #define _MMM_NEED_MUTEX
  71. #endif
  72. class MMMCallback;
  73. class MemoryMapManager : public IUnknown
  74. {
  75. public:
  76.     MemoryMapManager(IUnknown* pContext, BOOL bDisableMemoryMappedIO = 0,
  77.     UINT32 ulChunkSize = 0);
  78.     virtual ~MemoryMapManager();
  79.     void*   OpenMap(FILE_IDENTIFIER Descriptor, IUnknown* pContext);
  80.     void    CloseMap(void* pHandle);
  81. #ifdef _WIN32
  82.     void    AttemptCloseMapNow(void* pHandle);
  83. #endif
  84.     void*   GetMMHandle(FILE_IDENTIFIER Descriptor);
  85.     UINT32  GetBlock(REF(IHXBuffer*) pBuffer, void* pHandle,
  86. UINT32 ulOffset, UINT32 ulSize);
  87.     static void DestroyFileInfo(void* pHandle);
  88.     STDMETHOD(QueryInterface)   (THIS_
  89.  REFIID riid,
  90.  void** ppvObj);
  91.     STDMETHOD_(ULONG32,AddRef)  (THIS);
  92.     STDMETHOD_(ULONG32,Release) (THIS);
  93.     void ProcessIdle(void);
  94.     MMMCallback*    m_pMMMCallback;
  95.     friend class MMMCallback;
  96.     struct _FileInfo;
  97.     struct _PageTableLevel1;
  98.     struct _PageTableEntry
  99.     {
  100. UINT32     ulPageRefCount;
  101. UINT32     ulSize;
  102. void*     pPage;
  103. /* Page is active (i.e. this entry is valid) */
  104. unsigned char     bActive : 1;
  105. /* Page should be reaped in CheckAndReapPageTableEntry() */
  106. unsigned char     bReapMe : 1;
  107. /* Page is dead and will be reaped by refcount==0 */
  108. unsigned char     bDeadPage : 1;
  109. UINT8     usReapListNumber : 8;
  110. LISTPOSITION     ReapListPosition;
  111. struct _FileInfo*     pInfo;
  112. struct _PageTableLevel1*    pParent;
  113. #ifdef _WIN32
  114. _PageTableEntry*     m_pNextPTE;
  115. _PageTableEntry*     m_pPrevPTE;
  116. #endif
  117.     };
  118.     struct _PageTableLevel1
  119.     {
  120. struct _PageTableEntry     pEntry[NUM_PTES];
  121. UINT32     ulNumberOfPageTableEntriesInUse;
  122. struct _PageTableLevel1**   pMyEntryInParentsPageTable;
  123.     };
  124. #define FILEINFO_KEY_SIZE   32
  125.     struct _FileInfo
  126.     {
  127. FILE_IDENTIFIER     Descriptor;
  128. UINT32          ulSize;
  129. UINT32          ulRefCount;
  130. UINT32          ulUseCount;
  131. char          pKey[FILEINFO_KEY_SIZE]; /* Flawfinder: ignore */
  132. MemoryMapManager*        pMgr;
  133. struct _PageTableLevel1*    pPageTable[NUM_PTES];
  134. IHXDescriptorRegistration* pDescReg;
  135. #ifdef _WIN32
  136. _PageTableEntry*     m_pPTEList;
  137. #endif
  138.     };
  139.     static BOOL CheckAndReapPageTableEntry(struct _PageTableEntry* pPTE);
  140. private:
  141.     class Buffer : public IHXBuffer
  142.     {
  143.     public:
  144. FAST_CACHE_MEM
  145. Buffer(struct _PageTableEntry* pEntry, UCHAR* pData, ULONG32 ulLength);
  146. virtual ~Buffer();
  147. STDMETHOD(QueryInterface)   (THIS_
  148.                                      REFIID riid,
  149.                                      void** ppvObj);
  150. STDMETHOD_(ULONG32,AddRef)  (THIS);
  151. STDMETHOD_(ULONG32,Release) (THIS);
  152. STDMETHOD(Get)              (THIS_
  153.                                     REF(UCHAR*) pData, 
  154.                                     REF(ULONG32) ulLength);
  155. STDMETHOD(Set)              (THIS_
  156.                                     const UCHAR* pData, 
  157.                                     ULONG32 ulLength);
  158. STDMETHOD(SetSize)          (THIS_
  159.                                     ULONG32 ulLength);
  160. STDMETHOD_(ULONG32,GetSize) (THIS);
  161. STDMETHOD_(UCHAR*,GetBuffer)(THIS);
  162.     private:
  163. LONG32     m_lRefCount;
  164. ULONG32     m_ulLength;
  165. UCHAR*     m_pData;
  166. #ifdef _WINDOWS
  167. _PageTableEntry*     m_pPTE;
  168. #else
  169. class MemoryMapManager::_PageTableEntry*   m_pPTE;
  170. #endif
  171.     };
  172.     void EmptyReapBuckets();
  173.     CHXSimpleList ReapBuckets[NUMBER_OF_REAP_BUCKETS];
  174.     CHXMapStringToOb* m_pDevINodeToFileInfoMap;
  175.     UINT8 m_ulActiveReapList;
  176.     IHXScheduler* m_pScheduler;
  177.     UINT32 m_ulChunkSize;
  178.     INT32 m_lRefCount;
  179.     CallbackHandle m_PendingHandle;
  180.     /*
  181.      * Buffer needs to call back into here
  182.      * on delete.
  183.      */
  184.     friend class MemoryMapManager::Buffer;
  185.     void LockMutex();
  186.     void UnlockMutex();
  187. #ifdef _MMM_NEED_MUTEX
  188.     IHXMutex* m_pMutex;
  189. #ifdef _DEBUG
  190.     BOOL m_bHaveMutex;
  191. #endif
  192. #endif
  193.     IHXFastAlloc* m_pFastAlloc;
  194.     BOOL m_bDisableMemoryMappedIO;
  195. };
  196. class MMMCallback : public IHXCallback
  197. {
  198. public:
  199.    
  200.     MemoryMapManager* m_pMMM;
  201.     CallbackHandle m_hPendingHandle;
  202. MMMCallback(MemoryMapManager* pMMM);
  203. ~MMMCallback();
  204.     /*
  205.      * IUnknown methods
  206.      */
  207.     STDMETHOD(QueryInterface) (THIS_
  208. REFIID riid,
  209. void** ppvObj);
  210.     STDMETHOD_(ULONG32,AddRef) (THIS);
  211.     STDMETHOD_(ULONG32,Release) (THIS);
  212.     /*
  213.      * IHXCallback methods
  214.      */
  215.     STDMETHOD(Func) (THIS);
  216. protected:
  217.     LONG32 m_lRefCount;
  218. };
  219. #ifdef _MMM_NEED_MUTEX
  220. /*
  221.  * If you are in here your os has one mmapmgr for the whole 
  222.  * server.
  223.  */
  224. inline void
  225. MemoryMapManager::LockMutex()
  226. {
  227.     AddRef();
  228.     if (m_pMutex)
  229.     {
  230. m_pMutex->Lock();
  231.     }
  232. #ifdef _DEBUG
  233.     m_bHaveMutex = TRUE;
  234. #endif
  235. }
  236. inline void
  237. MemoryMapManager::UnlockMutex()
  238. {
  239. #ifdef _DEBUG
  240.     m_bHaveMutex = FALSE;
  241. #endif
  242.     if (m_pMutex)
  243.     {
  244. m_pMutex->Unlock();
  245.     }
  246.     Release();
  247. }
  248. #else
  249. /*
  250.  * If you are in here then each server process has its
  251.  * own mmapmgr.
  252.  */
  253. inline void
  254. MemoryMapManager::LockMutex()
  255. {
  256. }
  257. inline void
  258. MemoryMapManager::UnlockMutex()
  259. {
  260. }
  261. #endif
  262. #endif /* _MMAPMGR_H_ */