Ignore:
Timestamp:
Jul 17, 2001, 2:10:22 PM (24 years ago)
Author:
sandervl
Message:

heap changes/fixes

File:
1 edited

Legend:

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

    r6184 r6354  
    1 /* $Id: os2heap.cpp,v 1.19 2001-07-06 13:47:19 sandervl Exp $ */
     1/* $Id: os2heap.cpp,v 1.20 2001-07-17 12:10:21 sandervl Exp $ */
    22
    33/*
     
    2020#include <stdlib.h>
    2121#include <string.h>
     22#include <umalloc.h>
    2223
    2324#include "win32type.h"
     
    4142VMutex heaplistmutex;   //protects linked lists of heaps
    4243
     44void * _LNK_CONV getmoreHeapMem(Heap_t pHeap, size_t *size, int *clean);
     45void _LNK_CONV   releaseHeapMem(Heap_t pHeap, void *block, size_t size);
     46
    4347//******************************************************************************
    4448//******************************************************************************
     
    5458
    5559  this->dwMaximumSize = dwMaximumSize;
    56   this->dwInitialSize = dwInitialSize;
     60  this->dwInitialSize = (dwInitialSize) ? dwInitialSize : 0x4000;
    5761  this->flOptions     = flOptions;
    5862
     
    7781
    7882  heaplistmutex.leave();
     83
     84  APIRET rc;
     85
     86  rc = DosAllocMem((PPVOID)&pInitialHeapMem, dwInitialSize, PAG_READ|PAG_WRITE|PAG_COMMIT);
     87  if(rc != 0) {
     88        dprintf(("OS2Heap::OS2Heap: DosAllocSharedMem failed with %d", rc));
     89        DebugInt3();
     90  }
     91  uheap = _ucreate(pInitialHeapMem, dwInitialSize, _BLOCK_CLEAN,
     92                   _HEAP_REGULAR, getmoreHeapMem, releaseHeapMem);
     93  if(uheap == NULL) {
     94        DosFreeMem(pInitialHeapMem);
     95        pInitialHeapMem = NULL;
     96        dprintf(("OS2Heap::OS2Heap: _ucreate failed!"));
     97        DebugInt3();
     98  }
    7999}
    80100//******************************************************************************
     
    116136  }
    117137  heaplistmutex.leave();
     138
     139  if(uheap) {
     140        _uclose(uheap);
     141        _udestroy(uheap, _FORCE);
     142        uheap = NULL;
     143  }
     144  if(pInitialHeapMem) {
     145        DosFreeMem(pInitialHeapMem);
     146        pInitialHeapMem = NULL;
     147  }
     148
    118149  dprintf(("dtr OS2Heap, hPrimaryHeap = %X done\n", hPrimaryHeap));
    119150}
     
    126157
    127158//  dprintf(("OS2Heap::Alloc\n"));
    128   lpMem = malloc(dwBytes + HEAP_OVERHEAD);
     159  lpMem = _umalloc(uheap, dwBytes + HEAP_OVERHEAD);
    129160  if(lpMem == NULL) {
    130161      dprintf(("OS2Heap::Alloc, lpMem == NULL"));
     
    274305BOOL OS2Heap::Validate(DWORD dwFlags, LPCVOID lpMem)
    275306{
    276   dprintf(("OS2Heap::Validate, %X %X - stub? (TRUE)\n", dwFlags, lpMem));
     307  HEAPELEM *helem = GET_HEAPOBJ(lpMem);
     308
     309  dprintf(("OS2Heap::Validate, %X %X", dwFlags, lpMem));
     310
     311  if(lpMem == NULL) {
     312        dprintf(("OS2Heap::Validate lpMem == NULL\n"));
     313        return(FALSE);
     314  }
     315  /* verify lpMem address */
     316  if (lpMem >= (LPVOID)ulMaxAddr || lpMem < (LPVOID)0x10000)
     317  {
     318        dprintf(("OS2Heap::Validate BAD HEAP POINTER:%X\n", lpMem));
     319        return FALSE;
     320  }
     321
     322  if(helem->magic != MAGIC_NR_HEAP)
     323  {
     324        dprintf(("OS2Heap::Validate BAD HEAP POINTER:%X\n", lpMem));
     325        return FALSE;
     326  }
    277327  return(TRUE);
    278328}
     
    307357//******************************************************************************
    308358OS2Heap *OS2Heap::heap = NULL;
     359
     360//******************************************************************************
     361//******************************************************************************
     362void * _LNK_CONV getmoreHeapMem(Heap_t pHeap, size_t *size, int *clean)
     363{
     364 APIRET rc;
     365 PVOID newblock;
     366
     367  dprintf(("KERNEL32: getmoreHeapMem(%08xh, %08xh, %08xh)", pHeap, *size, *clean));
     368
     369  /* round the size up to a multiple of 4K */
     370  *size = (*size / 4096) * 4096 + 4096;
     371
     372  rc = DosAllocMem(&newblock, *size, PAG_READ|PAG_WRITE|PAG_COMMIT|PAG_EXECUTE);
     373  if(rc != 0) {
     374        dprintf(("getmoreHeapMem: DosAllocMem failed with %d", rc));
     375        return FALSE;
     376  }
     377  *clean = _BLOCK_CLEAN;
     378  dprintf(("KERNEL32: getmoreHeapMem %x %d", newblock, *size));
     379  return newblock;
     380}
     381//******************************************************************************
     382//******************************************************************************
     383void _LNK_CONV releaseHeapMem(Heap_t pHeap, void *block, size_t size)
     384{
     385  dprintf(("KERNEL32: releaseHeapMem %x %x %d", pHeap, block, size));
     386  DosFreeMem(block);
     387}
     388//******************************************************************************
     389//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.