Changeset 8877 for trunk/src/kernel32/heapshared.cpp
- Timestamp:
- Jul 15, 2002, 4:28:53 PM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/heapshared.cpp
r5564 r8877 1 /* $Id: heapshared.cpp,v 1. 8 2001-04-22 09:00:19sandervl Exp $ */1 /* $Id: heapshared.cpp,v 1.9 2002-07-15 14:28:51 sandervl Exp $ */ 2 2 /* 3 3 * Shared heap functions for OS/2 … … 39 39 BOOL InitializeSharedHeap() 40 40 { 41 APIRET rc;41 APIRET rc; 42 42 43 if(pSharedMem == NULL) { 44 rc = DosAllocSharedMem(&pSharedMem, NULL, MAX_HEAPSIZE, PAG_READ|PAG_WRITE|OBJ_GETTABLE); 45 if(rc != 0) { 46 dprintf(("InitializeSharedHeap: DosAllocSharedMem failed with %d", rc)); 47 return FALSE; 48 } 49 rc = DosSetMem(pSharedMem, INCR_HEAPSIZE, PAG_READ|PAG_WRITE|PAG_COMMIT); 50 if(rc != 0) { 51 DosFreeMem(pSharedMem); 52 dprintf(("InitializeSharedHeap: DosSetMem failed with %d", rc)); 53 return FALSE; 54 } 55 sharedHeap = _ucreate(pSharedMem, INCR_HEAPSIZE, _BLOCK_CLEAN, 56 _HEAP_REGULAR|_HEAP_SHARED, 57 getmoreShared, releaseShared); 43 if(pSharedMem == NULL) { 44 rc = DosAllocSharedMem(&pSharedMem, NULL, MAX_HEAPSIZE, PAG_READ|PAG_WRITE|OBJ_GETTABLE); 45 if(rc != 0) { 46 dprintf(("InitializeSharedHeap: DosAllocSharedMem failed with %d", rc)); 47 return FALSE; 48 } 49 rc = DosSetMem(pSharedMem, INCR_HEAPSIZE, PAG_READ|PAG_WRITE|PAG_COMMIT); 50 if(rc != 0) { 51 DosFreeMem(pSharedMem); 52 dprintf(("InitializeSharedHeap: DosSetMem failed with %d", rc)); 53 return FALSE; 54 } 55 sharedHeap = _ucreate(pSharedMem, INCR_HEAPSIZE, _BLOCK_CLEAN, _HEAP_REGULAR|_HEAP_SHARED, 56 getmoreShared, releaseShared); 58 57 59 if(sharedHeap == NULL) {60 DosFreeMem(pSharedMem);61 dprintf(("InitializeSharedHeap: _ucreate failed!"));62 return FALSE;63 }64 dprintf(("KERNEL32: First InitializeSharedHeap %x %x", pSharedMem, sharedHeap));65 for(int i=0;i<INCR_HEAPSIZE/PAGE_SIZE;i++) {66 pageBitmap[i] = 1; //mark as committed67 }68 }69 else {70 if(DosGetSharedMem(pSharedMem, PAG_READ|PAG_WRITE) != 0) {71 dprintf(("InitializeSharedHeap: DosGetSharedMem failed!"));72 return FALSE;73 }74 dprintf(("KERNEL32: InitializeSharedHeap %x %x refcount %d", pSharedMem, sharedHeap, refCount));75 if(_uopen(sharedHeap) != 0) {76 dprintf(("InitializeSharedHeap: unable to open shared heap!"));77 return FALSE;78 }79 }80 refCount++;81 return TRUE;58 if(sharedHeap == NULL) { 59 DosFreeMem(pSharedMem); 60 dprintf(("InitializeSharedHeap: _ucreate failed!")); 61 return FALSE; 62 } 63 dprintf(("KERNEL32: First InitializeSharedHeap %x %x", pSharedMem, sharedHeap)); 64 for(int i=0;i<INCR_HEAPSIZE/PAGE_SIZE;i++) { 65 pageBitmap[i] = 1; //mark as committed 66 } 67 } 68 else { 69 if(DosGetSharedMem(pSharedMem, PAG_READ|PAG_WRITE) != 0) { 70 dprintf(("InitializeSharedHeap: DosGetSharedMem failed!")); 71 return FALSE; 72 } 73 dprintf(("KERNEL32: InitializeSharedHeap %x %x refcount %d", pSharedMem, sharedHeap, refCount)); 74 if(_uopen(sharedHeap) != 0) { 75 dprintf(("InitializeSharedHeap: unable to open shared heap!")); 76 return FALSE; 77 } 78 } 79 refCount++; 80 return TRUE; 82 81 } 83 82 //****************************************************************************** … … 85 84 void DestroySharedHeap() 86 85 { 87 dprintf(("KERNEL32: DestroySharedHeap %d", refCount));88 if(--refCount == 0) {89 if(sharedHeap) {90 _uclose(sharedHeap);91 _udestroy(sharedHeap, _FORCE);92 sharedHeap = NULL;93 }94 if(pSharedMem) {95 DosFreeMem(pSharedMem);96 pSharedMem = NULL;97 }98 }99 else {100 _uclose(sharedHeap);101 }86 dprintf(("KERNEL32: DestroySharedHeap %d", refCount)); 87 if(--refCount == 0) { 88 if(sharedHeap) { 89 _uclose(sharedHeap); 90 _udestroy(sharedHeap, _FORCE); 91 sharedHeap = NULL; 92 } 93 if(pSharedMem) { 94 DosFreeMem(pSharedMem); 95 pSharedMem = NULL; 96 } 97 } 98 else { 99 _uclose(sharedHeap); 100 } 102 101 } 103 102 //****************************************************************************** … … 105 104 ULONG GetPageRangeFree(ULONG pageoffset) 106 105 { 107 dprintf(("KERNEL32: GetPageRangeFree(%08xh)\n", 108 pageoffset)); 106 dprintf(("KERNEL32: GetPageRangeFree(%08xh)", pageoffset)); 109 107 110 for(int i=pageoffset;i<MAX_HEAPPAGES;i++) {111 112 break;113 }114 }115 return i-pageoffset;108 for(int i=pageoffset;i<MAX_HEAPPAGES;i++) { 109 if(pageBitmap[i] == 1) { 110 break; 111 } 112 } 113 return i-pageoffset; 116 114 } 117 115 //****************************************************************************** … … 119 117 void * _LNK_CONV getmoreShared(Heap_t pHeap, size_t *size, int *clean) 120 118 { 121 APIRET rc;122 ULONG newsize;123 PVOID newblock;119 APIRET rc; 120 ULONG newsize; 121 PVOID newblock; 124 122 125 dprintf(("KERNEL32: getmoreShared(%08xh, %08xh, %08xh)\n", 126 pHeap, 127 *size, 128 *clean)); 123 dprintf(("KERNEL32: getmoreShared(%08xh, %08xh, %08xh)\n", pHeap, *size, *clean)); 129 124 130 /* round the size up to a multiple of 4K */131 // *size = (*size / 4096) * 4096 + 4096;132 // @@@PH speed improvement133 *size = (*size + 4096) & 0xFFFFF000;134 *size = max(*size, INCR_HEAPSIZE);125 /* round the size up to a multiple of 4K */ 126 // *size = (*size / 4096) * 4096 + 4096; 127 // @@@PH speed improvement 128 *size = (*size + 4096) & 0xFFFFF000; 129 *size = max(*size, INCR_HEAPSIZE); 135 130 136 for(int i=0;i<MAX_HEAPPAGES;i++)137 {138 int nrpagesfree = GetPageRangeFree(i);139 if(nrpagesfree >= *size/PAGE_SIZE) {140 newblock = (PVOID)((ULONG)pSharedMem + i*PAGE_SIZE);141 rc = DosSetMem(newblock, *size, PAG_READ|PAG_WRITE|PAG_COMMIT);142 if(rc != 0) {143 dprintf(("getmoreShared: DosSetMem failed with %d", rc));144 return NULL;145 }146 for(int j=0;j < *size/PAGE_SIZE; j++)147 148 pageBitmap[i+j] = 1; //mark as committed149 }131 for(int i=0;i<MAX_HEAPPAGES;i++) 132 { 133 int nrpagesfree = GetPageRangeFree(i); 134 if(nrpagesfree >= *size/PAGE_SIZE) { 135 newblock = (PVOID)((ULONG)pSharedMem + i*PAGE_SIZE); 136 rc = DosSetMem(newblock, *size, PAG_READ|PAG_WRITE|PAG_COMMIT); 137 if(rc != 0) { 138 dprintf(("getmoreShared: DosSetMem failed with %d", rc)); 139 return NULL; 140 } 141 for(int j=0;j < *size/PAGE_SIZE; j++) 142 { 143 pageBitmap[i+j] = 1; //mark as committed 144 } 150 145 151 *clean = _BLOCK_CLEAN;152 dprintf(("KERNEL32: getmoreShared %x %d", newblock, *size));153 return newblock;154 }155 if(nrpagesfree)156 i += nrpagesfree-1;157 }158 dprintf(("KERNEL32: getmoreShared NOTHING LEFT (%d)", *size));159 return NULL;146 *clean = _BLOCK_CLEAN; 147 dprintf(("KERNEL32: getmoreShared %x %d", newblock, *size)); 148 return newblock; 149 } 150 if(nrpagesfree) 151 i += nrpagesfree-1; 152 } 153 dprintf(("KERNEL32: getmoreShared NOTHING LEFT (%d)", *size)); 154 return NULL; 160 155 } 161 156 //****************************************************************************** … … 163 158 void _LNK_CONV releaseShared(Heap_t pHeap, void *block, size_t size) 164 159 { 165 ULONG pagenr;160 ULONG pagenr; 166 161 167 dprintf(("KERNEL32: releaseShared %x %d", block, size));168 DosSetMem(block, size, PAG_READ|PAG_WRITE|PAG_DECOMMIT);162 dprintf(("KERNEL32: releaseShared %x %d", block, size)); 163 DosSetMem(block, size, PAG_READ|PAG_WRITE|PAG_DECOMMIT); 169 164 170 pagenr = (ULONG)block - (ULONG)pSharedMem;171 pagenr /= PAGE_SIZE;172 for(int i=pagenr;i<pagenr+size/PAGE_SIZE;i++) {173 pageBitmap[i] = 0; //mark as decommitted174 }165 pagenr = (ULONG)block - (ULONG)pSharedMem; 166 pagenr /= PAGE_SIZE; 167 for(int i=pagenr;i<pagenr+size/PAGE_SIZE;i++) { 168 pageBitmap[i] = 0; //mark as decommitted 169 } 175 170 } 176 171 //****************************************************************************** … … 178 173 DWORD HeapGetSharedMemBase() 179 174 { 180 dprintf(("KERNEL32: HeapGetSharedMemBase()\n"));181 return (DWORD) pSharedMem;175 dprintf(("KERNEL32: HeapGetSharedMemBase()\n")); 176 return (DWORD) pSharedMem; 182 177 } 183 178 //******************************************************************************
Note:
See TracChangeset
for help on using the changeset viewer.