Ignore:
Timestamp:
Jul 15, 2002, 4:28:53 PM (23 years ago)
Author:
sandervl
Message:

Rewrote algorithm for 64kb alignment in VirtualAlloc'ed memory; allocation changes for heap (in 64kb chunks) & PE image (align at 64kb)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/heapcode.cpp

    r5075 r8877  
    1 /* $Id: heapcode.cpp,v 1.3 2001-02-09 18:31:05 sandervl Exp $ */
     1/* $Id: heapcode.cpp,v 1.4 2002-07-15 14:28:51 sandervl Exp $ */
    22/*
    33 * Code heap functions for OS/2
    44 *
    55 * Initially commit 4 kb, add more when required
     6 *
     7 * NOTE: If high memory is ever used for this heap, then you must use VirtualAlloc!
    68 *
    79 * TODO: Not process/thread safe (initializing/destroying heap)
     
    2224#include "dbglocal.h"
    2325
    24 Heap_t  codeHeap = 0;
    25 static PVOID   pCodeMem = NULL;
     26Heap_t          codeHeap = 0;
     27static PVOID    pCodeMem = NULL;
    2628
    2729void * _LNK_CONV getmoreCodeMem(Heap_t pHeap, size_t *size, int *clean);
    28 void _LNK_CONV releaseCodeMem(Heap_t pHeap, void *block, size_t size);
     30void _LNK_CONV   releaseCodeMem(Heap_t pHeap, void *block, size_t size);
    2931
    3032//******************************************************************************
     
    3234BOOL InitializeCodeHeap()
    3335{
    34  APIRET rc;
     36    APIRET rc;
    3537
    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);
     38    dprintf(("KERNEL32: InitializeCodeHeap"));
     39   
     40    //NOTE: MUST use 64kb here or else we are at risk of running out of virtual
     41    //      memory space. (when allocating 4kb we actually get 4kb + 60k uncommited)
     42    rc = DosAllocMem(&pCodeMem, 64*1024, PAG_READ|PAG_WRITE|PAG_COMMIT|PAG_EXECUTE);
     43    if(rc != 0) {
     44        dprintf(("InitializeSharedHeap: DosAllocSharedMem failed with %d", rc));
     45        return FALSE;
     46    }
     47    codeHeap = _ucreate(pCodeMem, PAGE_SIZE, _BLOCK_CLEAN, _HEAP_REGULAR, getmoreCodeMem, releaseCodeMem);
     48    if(codeHeap == NULL) {
     49        DosFreeMem(pCodeMem);
    4650        pCodeMem = NULL;
    47         dprintf(("InitializeSharedHeap: _ucreate failed!"));
    48         return FALSE;
    49    }
    50    return TRUE;
     51            dprintf(("InitializeSharedHeap: _ucreate failed!"));
     52            return FALSE;
     53    }
     54    return TRUE;
    5155}
    5256//******************************************************************************
     
    5458void DestroyCodeHeap()
    5559{
    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   }
     60    dprintf(("KERNEL32: DestroyCodeHeap"));
     61    if(codeHeap) {
     62            _uclose(codeHeap);
     63            _udestroy(codeHeap, _FORCE);
     64            codeHeap = NULL;
     65    }
     66    if(pCodeMem) {
     67        DosFreeMem(pCodeMem);
     68        pCodeMem = NULL;
     69    }
    6670}
    6771//******************************************************************************
     
    6973void * _LNK_CONV getmoreCodeMem(Heap_t pHeap, size_t *size, int *clean)
    7074{
    71  APIRET rc;
    72  PVOID newblock;
     75    APIRET rc;
     76    PVOID newblock;
    7377
    74   dprintf(("KERNEL32: getmoreCodeMem(%08xh, %08xh, %08xh)\n",
    75           pHeap,
    76           *size,
    77           *clean));
     78    dprintf(("KERNEL32: getmoreCodeMem(%08xh, %08xh, %08xh)\n", pHeap, *size, *clean));
    7879
    79   /* round the size up to a multiple of 4K */
    80   *size = (*size / 4096) * 4096 + 4096;
     80    /* round the size up to a multiple of 64K */
     81    //NOTE: MUST use 64kb here or else we are at risk of running out of virtual
     82    //      memory space. (when allocating 4kb we actually get 4kb + 60k uncommited)
     83    *size = ( (*size / 65536) + 1) * 65536;
    8184
    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;
     85    rc = DosAllocMem(&newblock, *size, PAG_READ|PAG_WRITE|PAG_COMMIT|PAG_EXECUTE);
     86    if(rc != 0) {
     87        dprintf(("getmoreCodeMem: DosAllocMem failed with %d", rc));
     88        return FALSE;
     89    }
     90    *clean = _BLOCK_CLEAN;
     91    dprintf(("KERNEL32: getmoreCodeMem %x %d", newblock, *size));
     92    return newblock;
    9093}
    9194//******************************************************************************
     
    9396void _LNK_CONV releaseCodeMem(Heap_t pHeap, void *block, size_t size)
    9497{
    95   dprintf(("KERNEL32: releaseCodeMem %x %d", block, size));
    96   DosFreeMem(block);
     98    dprintf(("KERNEL32: releaseCodeMem %x %d", block, size));
     99    DosFreeMem(block);
    97100}
    98101//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.