Changeset 729 for trunk/src/user32/new/heapshared.cpp
- Timestamp:
- Aug 28, 1999, 9:33:04 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/user32/new/heapshared.cpp
r724 r729 1 /* $Id: heapshared.cpp,v 1. 1 1999-08-28 14:09:57sandervl Exp $ */1 /* $Id: heapshared.cpp,v 1.2 1999-08-28 19:32:46 sandervl Exp $ */ 2 2 /* 3 3 * Shared heap functions for OS/2 4 * 5 * Initially commit 16 kb, add more when required 6 * 7 * NOTE: Hardcoded limit of 256 KB per process (increase when required) 4 8 * 5 9 * Copyright 1999 Sander van Leeuwen (sandervl@xs4all.nl) … … 12 16 #include "heapshared.h" 13 17 14 #define INITIAL_HEAPSIZE (64*1024) 15 16 Heap_t sharedHeap = 0; 17 PVOID pSharedMem = NULL; 18 Heap_t sharedHeap = 0; 19 static PVOID pSharedMem = NULL; 20 static BYTE pageBitmap[MAX_HEAPPAGES] = {0}; 18 21 19 22 void * _LNK_CONV getmoreShared(Heap_t pHeap, size_t *size, int *clean); … … 27 30 28 31 dprintf(("USER32: InitializeSharedHeap")); 29 rc = DosAllocSharedMem(&pSharedMem, NULL, INITIAL_HEAPSIZE, PAG_READ|PAG_WRITE|PAG_COMMIT|OBJ_GIVEABLE);32 rc = DosAllocSharedMem(&pSharedMem, NULL, MAX_HEAPSIZE, PAG_READ|PAG_WRITE|OBJ_GETTABLE); 30 33 if(rc != 0) { 31 34 dprintf(("InitializeSharedHeap: DosAllocSharedMem failed with %d", rc)); 32 35 return FALSE; 33 36 } 34 sharedHeap = _ucreate(pSharedMem, INITIAL_HEAPSIZE, _BLOCK_CLEAN, 37 rc = DosSetMem(pSharedMem, INCR_HEAPSIZE, PAG_READ|PAG_WRITE|PAG_COMMIT); 38 if(rc != 0) { 39 dprintf(("InitializeSharedHeap: DosSetMem failed with %d", rc)); 40 return FALSE; 41 } 42 sharedHeap = _ucreate(pSharedMem, INCR_HEAPSIZE, _BLOCK_CLEAN, 35 43 _HEAP_REGULAR|_HEAP_SHARED, 36 44 getmoreShared, releaseShared); … … 39 47 dprintf(("InitializeSharedHeap: _ucreate failed!")); 40 48 return FALSE; 49 } 50 for(int i=0;i<INCR_HEAPSIZE/PAGE_SIZE;i++) { 51 pageBitmap[i] = 1; //mark as committed 41 52 } 42 53 return TRUE; … … 65 76 //****************************************************************************** 66 77 //****************************************************************************** 78 ULONG GetPageRangeFree(ULONG pageoffset) 79 { 80 for(int i=pageoffset;i<MAX_HEAPPAGES;i++) { 81 if(pageBitmap[i] == 1) { 82 break; 83 } 84 } 85 return i-pageoffset; 86 } 87 //****************************************************************************** 88 //****************************************************************************** 67 89 void * _LNK_CONV getmoreShared(Heap_t pHeap, size_t *size, int *clean) 68 90 { … … 71 93 PVOID newblock; 72 94 73 /* round the size up to a multiple of 64K */ 74 *size = (*size / 65536) * 65536 + 65536; 95 /* round the size up to a multiple of 4K */ 96 *size = (*size / 4096) * 4096 + 4096; 97 *size = max(*size, INCR_HEAPSIZE); 75 98 76 rc = DosAllocSharedMem(&newblock, NULL, *size, PAG_READ|PAG_WRITE|PAG_COMMIT|OBJ_GIVEABLE); 77 if(rc != 0) { 78 dprintf(("getmoreShared: DosAllocSharedMem failed with %d", rc)); 79 return NULL; 99 for(int i=0;i<MAX_HEAPPAGES;i++) 100 { 101 int nrpagesfree = GetPageRangeFree(i); 102 if(nrpagesfree >= *size/PAGE_SIZE) { 103 newblock = (PVOID)((ULONG)pSharedMem + i*PAGE_SIZE); 104 rc = DosSetMem(newblock, *size, PAG_READ|PAG_WRITE|PAG_COMMIT); 105 if(rc != 0) { 106 dprintf(("getmoreShared: DosSetMem failed with %d", rc)); 107 return NULL; 108 } 109 for(int j=i;j<i+*size/PAGE_SIZE;i++) { 110 pageBitmap[i] = 1; //mark as committed 111 } 112 113 *clean = _BLOCK_CLEAN; 114 dprintf(("USER32: getmoreShared %x %d", newblock, *size)); 115 return newblock; 116 } 117 if(nrpagesfree) 118 i += nrpagesfree-1; 80 119 } 81 *clean = _BLOCK_CLEAN; 82 83 return newblock; 120 dprintf(("USER32: getmoreShared NOTHING LEFT (%d)", *size)); 121 return NULL; 84 122 } 85 123 //****************************************************************************** … … 87 125 void _LNK_CONV releaseShared(Heap_t pHeap, void *block, size_t size) 88 126 { 89 DosFreeMem(block); 127 ULONG pagenr; 128 129 dprintf(("USER32: releaseShared %x %d", block, size)); 130 DosSetMem(block, size, PAG_READ|PAG_WRITE|PAG_DECOMMIT); 131 132 pagenr = (ULONG)block - (ULONG)pSharedMem; 133 pagenr /= PAGE_SIZE; 134 for(int i=pagenr;i<pagenr+size/PAGE_SIZE;i++) { 135 pageBitmap[i] = 0; //mark as decommitted 136 } 90 137 } 91 138 //****************************************************************************** 92 139 //****************************************************************************** 140 DWORD HeapGetSharedMemBase() 141 { 142 return (DWORD) pSharedMem; 143 } 144 //****************************************************************************** 145 //******************************************************************************
Note:
See TracChangeset
for help on using the changeset viewer.