WarSMemory.h
上传用户:surprise9
上传日期:2007-01-04
资源大小:426k
文件大小:8k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // See the "War Software Series License Agreement" for details concerning 
  2. // use and distribution.
  3. // ---
  4. // This source code, executables and programs containing source code or
  5. // binaries or proprietetary technology from the War Software Series are
  6. // NOT alloed used, viewed or tested by any governmental agencies in
  7. // any countries. This includes the government, departments, police, 
  8. // military etc.
  9. // ---
  10. // This file is intended for use with Tab space = 2
  11. // Created and maintained in MSVC Developer Studio
  12. // ---
  13. // NAME : WarSMemory.h
  14. // PURPOSE : Shared memory management
  15. // PROGRAM : 
  16. // DATE : March 9 1997
  17. // AUTHOR : Jarle Aase
  18. // ---
  19. // 
  20. // REVISION HISTORY
  21. // 
  22. #define LNAME_SHARED_MEM_SEGMENT "warlsms" // Semaphore, exclusive lock
  23. #define SHMEM_BLKS_MUTEX_NAME "warlsmm" // CSharedBlksMem mutex name
  24. #define MAX_SHARED_SEGMENT_NAME_LEN 24 // Name length of a memory segment
  25. #define SHARED_MEM_MAX_BLKS 128 // Max 128 blocks
  26. #define SMEM_NUM_BLK_SIZES 12 // 12 segment sizes
  27. #define SMEM_NUM_BLK_SIZES_BASE 16 // Smallest segment
  28. #define SHMEM_NUM_USER_PTRS 16
  29. ///////////////////////////////////////////////////////////////
  30. // Simple locking syncronization
  31. class DLL_WAR_SOFTWARE_ CGlobalLock
  32. {
  33. public:
  34. CGlobalLock(LPCSTR Name);
  35. ~CGlobalLock();
  36. CSemaphore *m_pSemaphore;
  37. CSingleLock *m_pSligleLock;
  38. };
  39. ///////////////////////////////////////////////////////////////////////////
  40. // Exceptions
  41. class DLL_WAR_SOFTWARE_ CSharedMemoryException : public CObject
  42. {
  43. public:
  44. void Trhrow(LPCSTR Name)
  45. {
  46. m_Name = Name;
  47. throw this;
  48. }
  49. LPCSTR m_Name;
  50. };
  51. ///////////////////////////////////////////////////////////////////////////
  52. // Primary MMF management
  53. struct SHARED_MEM_SEG_HDR
  54. {
  55. DWORD Size; // Size of the segment, incl. header
  56. DWORD AccessCnt; // Number of open handles
  57. char Name[MAX_SHARED_SEGMENT_NAME_LEN]; // Name of shared segment
  58. LPVOID pUserPtr[SHMEM_NUM_USER_PTRS]; 
  59. // Pointers that can be used by clients
  60. // Not used by the Smem framework
  61. };
  62. class DLL_WAR_SOFTWARE_ CSharedMemSegment : public CObject
  63. {
  64. public:
  65. CSharedMemSegment();
  66. ~CSharedMemSegment();
  67. LPVOID Create(LPCSTR Name, DWORD Size, BOOL KeepInMemory = FALSE);
  68. LPVOID GetDataPtr()
  69. {return ((char *)m_pSMH) + sizeof(SHARED_MEM_SEG_HDR);}
  70. HANDLE m_hMMFile; // Handle to memory mapped file
  71. CString m_Name;
  72. DWORD m_Size;
  73. SHARED_MEM_SEG_HDR *m_pSMH;
  74. };
  75. //////////////////////////////////////////////////////////////
  76. // Dynamic memory management
  77. // Shared memory pointer. Block no (offset into Blk)
  78. // and offset into actual memory location.
  79. // A user pointer to the memory will be:
  80. // Local Ptr + Block no + offset + header lenght of node header
  81. struct SMEM 
  82. {
  83. unsigned blk:8; // Block
  84. unsigned ofs:24; // Offset
  85. SMEM& operator = (SMEM& sm)
  86. {
  87. *(DWORD *)this = *(DWORD *)&sm;
  88. return *this;
  89. }
  90. SMEM& operator = (int ival)
  91. {
  92. ASSERT(ival == 0);
  93. *(DWORD *)this = ival;
  94. return *this;
  95. }
  96. BOOL operator != (SMEM& sm)
  97. {return (this->ofs != sm.ofs) || (this->blk != sm.blk);}
  98. BOOL operator == (SMEM& sm)
  99. {return (this->ofs == sm.ofs) && (this->blk == sm.blk);}
  100. BOOL operator != (int iVal)
  101. {return ((int)*(DWORD *)this) != iVal;}
  102. BOOL operator == (int iVal)
  103. {return ((int)*(DWORD *)this) == iVal;}
  104. int operator ! ()
  105. {return *this == 0;}
  106. operator int ()
  107. return (int)*(DWORD *)this;
  108. }
  109. operator bool ()
  110. return ((int)*(DWORD *)this) != 0;
  111. }
  112. };
  113. #define SMISNULL(sm) (sm.ofs == 0)
  114. // Header block for dynamic memory management
  115. struct SUPER_MEM_BLKS_HDR
  116. {
  117. BOOL IsInitialized;
  118. int Flags;
  119. SMEM FreeTable[SMEM_NUM_BLK_SIZES]; // Free segments, only used by the first segment
  120. // <= 16 bytes, < = 32 bytes, <= 64 bytes, <= 128, <= 256
  121. // <= 512, <= 1024 <= 2048, <= 4096, <= 8192, <= 16384, >+
  122. DWORD UserMemory; // Allocayed memory by vm_malloc
  123. DWORD PhysMemory; // Physical memory used, including heders
  124. DWORD NumNodes; // Number of nodes
  125. DWORD UsedNodes; // Nodes used
  126. DWORD SegmentSize; // Size of segment in bytes
  127. DWORD NumUsedSegments; // Super only. Number of allocated segments
  128. };
  129. // Allocated memory buffer header
  130. // These can be 'free' or used.
  131. struct VIRTUAL_MEM_NODE_HDR
  132. {
  133. unsigned isfree:1; // Is free for use
  134. unsigned hasnext:1; // Has a next node.
  135. unsigned size:24; // Physical size, including header
  136. SMEM prev; // Linked list, prev node (next node can be calculated from size)
  137. #ifdef _DEBUG
  138. unsigned short watermark[4]; // Watermark to verify free/used memory. Unused is 0xfeee, used is 0
  139. #endif
  140. };
  141. struct VIRTUAL_FREE_MEM_NODE_HDR
  142. {
  143. VIRTUAL_MEM_NODE_HDR node_hdr;
  144. SMEM nextfree; // Next free node
  145. SMEM prevfree; // Prev free node
  146. int index;
  147. };
  148. class DLL_WAR_SOFTWARE_ CSharedBlksMem : public CObject
  149. {
  150. public:
  151. static const unsigned short tag_FreeWatermark[4];
  152. static const unsigned short tag_UsedWatermark[4];
  153. CSharedBlksMem();
  154. ~CSharedBlksMem();
  155. BOOL Create(LPCSTR Name, DWORD BlkSize);
  156. #ifdef _DEBUG
  157. LPVOID __dbg__Ptr(SMEM sm);
  158. #endif
  159. LPVOID __Ptr(SMEM sm)
  160. {
  161. #ifdef _DEBUG
  162. return (LPVOID)(((char *)__dbg__Ptr(sm)));
  163. #else
  164. if (!m_Blks[sm.blk]) Rescan();
  165. return sm.ofs ? (LPVOID *)(((char *)m_Blks[sm.blk]) + sm.ofs + sizeof(VIRTUAL_MEM_NODE_HDR)) : NULL;
  166. #endif
  167. }
  168. VIRTUAL_MEM_NODE_HDR *__hdr__Ptr(SMEM sm)
  169. {
  170. #ifdef _DEBUG
  171. if (!m_Blks[sm.blk]) Rescan();
  172. VIRTUAL_MEM_NODE_HDR *p = sm.ofs ? (VIRTUAL_MEM_NODE_HDR *)(((char *)m_Blks[sm.blk]) + sm.ofs) : NULL;
  173. if (p)
  174. {
  175. ASSERT(AfxIsValidAddress(p, sizeof(VIRTUAL_MEM_NODE_HDR)));
  176. }
  177. return p;
  178. #else
  179. if (!m_Blks[sm.blk]) Rescan();
  180. return sm.ofs ? (VIRTUAL_MEM_NODE_HDR *)(((char *)m_Blks[sm.blk]) + sm.ofs) : NULL;
  181. #endif
  182. }
  183. SMEM Smem(LPVOID ptr, int blk_num)
  184. {
  185. SMEM sm;
  186. if (!m_Blks[sm.blk]) Rescan();
  187. sm.ofs = (unsigned)(((char *)ptr) - (int)m_Blks[blk_num]);
  188. sm.blk = blk_num;
  189. return sm;
  190. }
  191. BOOL sh_malloc(SMEM& me, DWORD nBytes);
  192. BOOL sh_realloc(SMEM& shm, DWORD nBytes);
  193. void sh_free(SMEM shm);
  194. // Low level
  195. BOOL Initialize();
  196. void Rescan(); // Rescan block list
  197. BOOL AllocSegment(int Index); // Allocate a segment
  198. int GetLenIndex(VIRTUAL_MEM_NODE_HDR *pNode);
  199. int GetLenIndex(int MinSize);
  200. DWORD GetNodeDataLen(VIRTUAL_MEM_NODE_HDR *pNode)
  201. { return pNode->size - sizeof(VIRTUAL_MEM_NODE_HDR);}
  202. void __LinkFree(int Segment, VIRTUAL_FREE_MEM_NODE_HDR *pNode);
  203. BOOL __FindFreeNode(SMEM& me, DWORD nBytes, int& ListIndex);
  204. void __UnlinkFree(int ListIndex, SMEM me);
  205. BOOL __AllocNewNode(SMEM& me, DWORD nBytes, int& ListIndex);
  206. BOOL __AllocNode(VIRTUAL_FREE_MEM_NODE_HDR *pNode, SMEM& me, DWORD nBytes, int ListIndex);
  207. void __CreateNewNode(
  208. DWORD Segment,
  209. VIRTUAL_FREE_MEM_NODE_HDR *pPrevNode, 
  210. VIRTUAL_FREE_MEM_NODE_HDR *pNode, 
  211. DWORD nBytes,
  212. BOOL HasNext);
  213. // Data members
  214. LPVOID m_Blks[SHARED_MEM_MAX_BLKS]; // Local process segment list
  215. CSharedMemSegment m_Segments[SHARED_MEM_MAX_BLKS]; // Local segment list
  216. HANDLE m_Mutex; // Mutex for access to malloc/free
  217. CString m_Name;
  218. DWORD m_SegmentSize;
  219. BOOL m_IsInitialized;
  220. // Diagnostics
  221. #if SMEM_DEBUG
  222. void AssertValidFreeTables();
  223. #else
  224. #define AssertValidFreeTables()
  225. #endif
  226. };
  227. // Thread syncronization
  228. struct CWRLOCK_SMHDR
  229. {
  230. BOOL IsInitialized;
  231. LONG Counter;
  232. };
  233. class DLL_WAR_SOFTWARE_ CRWLock 
  234. private:
  235. void Claim(int i);
  236. void Release(int i);
  237. HANDLE OpenEvent(LPCSTR Name, BOOL bManualReset, BOOL bInitialState);
  238. HANDLE OpenMutex(LPCSTR Name);
  239. CString CatStr(LPCSTR Name, LPCSTR ext);
  240. HANDLE hMutex;
  241. HANDLE hWriterMutex;
  242. HANDLE hReaderEvent;
  243. LPLONG pCounter;
  244. CSharedMemSegment SMemSeg;
  245. public:
  246. enum
  247. {
  248. WRITER = 0,
  249. READER  = 1
  250. };
  251. CRWLock();
  252. ~CRWLock();
  253. BOOL Create(LPCSTR Name);
  254. void ReadLock() {Claim(READER);}
  255. void WriteLock() {Claim(WRITER);}
  256. void UnlockRead() {Release(READER);}
  257. void UnlockWrite() {Release(WRITER);}
  258. };