source: trunk/src/user32/heapshared.cpp@ 1018

Last change on this file since 1018 was 1018, checked in by phaller, 26 years ago

Fix: fix in getmoreShared, erronous for loop index

File size: 4.8 KB
Line 
1/* $Id: heapshared.cpp,v 1.2 1999-09-23 14:24:57 phaller Exp $ */
2/*
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)
8 *
9 * Copyright 1999 Sander van Leeuwen (sandervl@xs4all.nl)
10 *
11 */
12#define INCL_BASE
13#define INCL_DOSMEMMGR
14#include <os2wrap.h>
15#include <misc.h>
16#include "heapshared.h"
17
18 Heap_t sharedHeap = 0;
19static PVOID pSharedMem = NULL;
20static BYTE pageBitmap[MAX_HEAPPAGES] = {0};
21
22void * _LNK_CONV getmoreShared(Heap_t pHeap, size_t *size, int *clean);
23void _LNK_CONV releaseShared(Heap_t pHeap, void *block, size_t size);
24
25//******************************************************************************
26//******************************************************************************
27BOOL InitializeSharedHeap()
28{
29 APIRET rc;
30
31 dprintf(("USER32: InitializeSharedHeap"));
32 rc = DosAllocSharedMem(&pSharedMem, NULL, MAX_HEAPSIZE, PAG_READ|PAG_WRITE|OBJ_GETTABLE);
33 if(rc != 0) {
34 dprintf(("InitializeSharedHeap: DosAllocSharedMem failed with %d", rc));
35 return FALSE;
36 }
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,
43 _HEAP_REGULAR|_HEAP_SHARED,
44 getmoreShared, releaseShared);
45
46 if(sharedHeap == NULL) {
47 dprintf(("InitializeSharedHeap: _ucreate failed!"));
48 return FALSE;
49 }
50 for(int i=0;i<INCR_HEAPSIZE/PAGE_SIZE;i++) {
51 pageBitmap[i] = 1; //mark as committed
52 }
53 return TRUE;
54}
55//******************************************************************************
56//******************************************************************************
57void DestroySharedHeap()
58{
59 dprintf(("USER32: DestroySharedHeap"));
60 if(sharedHeap) {
61 _uclose(sharedHeap);
62 _udestroy(sharedHeap, _FORCE);
63 sharedHeap = NULL;
64 }
65 if(pSharedMem) {
66 DosFreeMem(pSharedMem);
67 pSharedMem = NULL;
68 }
69}
70//******************************************************************************
71//******************************************************************************
72void *_smalloc(size_t size)
73{
74 return _umalloc(sharedHeap, size);
75}
76//******************************************************************************
77//******************************************************************************
78ULONG GetPageRangeFree(ULONG pageoffset)
79{
80 dprintf(("USER32: GetPageRangeFree(%08xh)\n",
81 pageoffset));
82
83 for(int i=pageoffset;i<MAX_HEAPPAGES;i++) {
84 if(pageBitmap[i] == 1) {
85 break;
86 }
87 }
88 return i-pageoffset;
89}
90//******************************************************************************
91//******************************************************************************
92void * _LNK_CONV getmoreShared(Heap_t pHeap, size_t *size, int *clean)
93{
94 APIRET rc;
95 ULONG newsize;
96 PVOID newblock;
97
98 dprintf(("USER32: getmoreShared(%08xh, %08xh, %08xh)\n",
99 pHeap,
100 *size,
101 *clean));
102
103 /* round the size up to a multiple of 4K */
104 *size = (*size / 4096) * 4096 + 4096;
105 *size = max(*size, INCR_HEAPSIZE);
106
107 for(int i=0;i<MAX_HEAPPAGES;i++)
108 {
109 int nrpagesfree = GetPageRangeFree(i);
110 if(nrpagesfree >= *size/PAGE_SIZE) {
111 newblock = (PVOID)((ULONG)pSharedMem + i*PAGE_SIZE);
112 rc = DosSetMem(newblock, *size, PAG_READ|PAG_WRITE|PAG_COMMIT);
113 if(rc != 0) {
114 dprintf(("getmoreShared: DosSetMem failed with %d", rc));
115 return NULL;
116 }
117 for(int j=0;
118 j < *size/PAGE_SIZE;
119 j++)
120 {
121 pageBitmap[i+j] = 1; //mark as committed
122 }
123
124 *clean = _BLOCK_CLEAN;
125 dprintf(("USER32: getmoreShared %x %d", newblock, *size));
126 return newblock;
127 }
128 if(nrpagesfree)
129 i += nrpagesfree-1;
130 }
131 dprintf(("USER32: getmoreShared NOTHING LEFT (%d)", *size));
132 return NULL;
133}
134//******************************************************************************
135//******************************************************************************
136void _LNK_CONV releaseShared(Heap_t pHeap, void *block, size_t size)
137{
138 ULONG pagenr;
139
140 dprintf(("USER32: releaseShared %x %d", block, size));
141 DosSetMem(block, size, PAG_READ|PAG_WRITE|PAG_DECOMMIT);
142
143 pagenr = (ULONG)block - (ULONG)pSharedMem;
144 pagenr /= PAGE_SIZE;
145 for(int i=pagenr;i<pagenr+size/PAGE_SIZE;i++) {
146 pageBitmap[i] = 0; //mark as decommitted
147 }
148}
149//******************************************************************************
150//******************************************************************************
151DWORD HeapGetSharedMemBase()
152{
153 dprintf(("USER32: HeapGetSharedMemBase()\n"));
154 return (DWORD) pSharedMem;
155}
156//******************************************************************************
157//******************************************************************************
Note: See TracBrowser for help on using the repository browser.