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

Last change on this file since 949 was 949, checked in by sandervl, 26 years ago

Moved new user32 here

File size: 4.5 KB
Line 
1/* $Id: heapshared.cpp,v 1.1 1999-09-15 23:18:50 sandervl 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 for(int i=pageoffset;i<MAX_HEAPPAGES;i++) {
81 if(pageBitmap[i] == 1) {
82 break;
83 }
84 }
85 return i-pageoffset;
86}
87//******************************************************************************
88//******************************************************************************
89void * _LNK_CONV getmoreShared(Heap_t pHeap, size_t *size, int *clean)
90{
91 APIRET rc;
92 ULONG newsize;
93 PVOID newblock;
94
95 /* round the size up to a multiple of 4K */
96 *size = (*size / 4096) * 4096 + 4096;
97 *size = max(*size, INCR_HEAPSIZE);
98
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;
119 }
120 dprintf(("USER32: getmoreShared NOTHING LEFT (%d)", *size));
121 return NULL;
122}
123//******************************************************************************
124//******************************************************************************
125void _LNK_CONV releaseShared(Heap_t pHeap, void *block, size_t size)
126{
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 }
137}
138//******************************************************************************
139//******************************************************************************
140DWORD HeapGetSharedMemBase()
141{
142 return (DWORD) pSharedMem;
143}
144//******************************************************************************
145//******************************************************************************
Note: See TracBrowser for help on using the repository browser.