source: trunk/src/kernel32/heapcode.cpp@ 5075

Last change on this file since 5075 was 5075, checked in by sandervl, 25 years ago

heap (shared+code) changes + lx dll unload workaround

File size: 3.1 KB
Line 
1/* $Id: heapcode.cpp,v 1.3 2001-02-09 18:31:05 sandervl Exp $ */
2/*
3 * Code heap functions for OS/2
4 *
5 * Initially commit 4 kb, add more when required
6 *
7 * TODO: Not process/thread safe (initializing/destroying heap)
8 *
9 * ASSUMPTION: Rtl library takes care of protection of heap increase/decrease
10 * (from multiple threads/processes)
11 *
12 * Copyright 1999 Sander van Leeuwen (sandervl@xs4all.nl)
13 *
14 */
15#define INCL_BASE
16#define INCL_DOSMEMMGR
17#include <os2wrap.h>
18#include <misc.h>
19#include <heapcode.h>
20
21#define DBG_LOCALLOG DBG_heapcode
22#include "dbglocal.h"
23
24Heap_t codeHeap = 0;
25static PVOID pCodeMem = NULL;
26
27void * _LNK_CONV getmoreCodeMem(Heap_t pHeap, size_t *size, int *clean);
28void _LNK_CONV releaseCodeMem(Heap_t pHeap, void *block, size_t size);
29
30//******************************************************************************
31//******************************************************************************
32BOOL InitializeCodeHeap()
33{
34 APIRET rc;
35
36 dprintf(("KERNEL32: InitializeCodeHeap"));
37 rc = DosAllocMem(&pCodeMem, PAGE_SIZE, PAG_READ|PAG_WRITE|PAG_COMMIT|PAG_EXECUTE);
38 if(rc != 0) {
39 dprintf(("InitializeSharedHeap: DosAllocSharedMem failed with %d", rc));
40 return FALSE;
41 }
42 codeHeap = _ucreate(pCodeMem, PAGE_SIZE, _BLOCK_CLEAN,
43 _HEAP_REGULAR, getmoreCodeMem, releaseCodeMem);
44 if(codeHeap == NULL) {
45 DosFreeMem(pCodeMem);
46 pCodeMem = NULL;
47 dprintf(("InitializeSharedHeap: _ucreate failed!"));
48 return FALSE;
49 }
50 return TRUE;
51}
52//******************************************************************************
53//******************************************************************************
54void DestroyCodeHeap()
55{
56 dprintf(("KERNEL32: DestroyCodeHeap"));
57 if(codeHeap) {
58 _uclose(codeHeap);
59 _udestroy(codeHeap, _FORCE);
60 codeHeap = NULL;
61 }
62 if(pCodeMem) {
63 DosFreeMem(pCodeMem);
64 pCodeMem = NULL;
65 }
66}
67//******************************************************************************
68//******************************************************************************
69void * _LNK_CONV getmoreCodeMem(Heap_t pHeap, size_t *size, int *clean)
70{
71 APIRET rc;
72 PVOID newblock;
73
74 dprintf(("KERNEL32: getmoreCodeMem(%08xh, %08xh, %08xh)\n",
75 pHeap,
76 *size,
77 *clean));
78
79 /* round the size up to a multiple of 4K */
80 *size = (*size / 4096) * 4096 + 4096;
81
82 rc = DosAllocMem(&newblock, *size, PAG_READ|PAG_WRITE|PAG_COMMIT|PAG_EXECUTE);
83 if(rc != 0) {
84 dprintf(("getmoreCodeMem: DosAllocMem failed with %d", rc));
85 return FALSE;
86 }
87 *clean = _BLOCK_CLEAN;
88 dprintf(("KERNEL32: getmoreCodeMem %x %d", newblock, *size));
89 return newblock;
90}
91//******************************************************************************
92//******************************************************************************
93void _LNK_CONV releaseCodeMem(Heap_t pHeap, void *block, size_t size)
94{
95 dprintf(("KERNEL32: releaseCodeMem %x %d", block, size));
96 DosFreeMem(block);
97}
98//******************************************************************************
99//******************************************************************************
Note: See TracBrowser for help on using the repository browser.