Ignore:
Timestamp:
Aug 28, 1999, 9:33:04 PM (26 years ago)
Author:
sandervl
Message:

Window handle changes (now allocated in shared array) + postmessage changes + fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/user32/new/heapshared.cpp

    r724 r729  
    1 /* $Id: heapshared.cpp,v 1.1 1999-08-28 14:09:57 sandervl Exp $ */
     1/* $Id: heapshared.cpp,v 1.2 1999-08-28 19:32:46 sandervl Exp $ */
    22/*
    33 * 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)
    48 *
    59 * Copyright 1999 Sander van Leeuwen (sandervl@xs4all.nl)
     
    1216#include "heapshared.h"
    1317
    14 #define INITIAL_HEAPSIZE        (64*1024)
    15 
    16 Heap_t  sharedHeap = 0;
    17 PVOID   pSharedMem = NULL;
     18       Heap_t  sharedHeap = 0;
     19static PVOID   pSharedMem = NULL;
     20static BYTE    pageBitmap[MAX_HEAPPAGES] = {0};
    1821
    1922void * _LNK_CONV getmoreShared(Heap_t pHeap, size_t *size, int *clean);
     
    2730
    2831  dprintf(("USER32: InitializeSharedHeap"));
    29   rc = DosAllocSharedMem(&pSharedMem, NULL, INITIAL_HEAPSIZE, PAG_READ|PAG_WRITE|PAG_COMMIT|OBJ_GIVEABLE);
     32  rc = DosAllocSharedMem(&pSharedMem, NULL, MAX_HEAPSIZE, PAG_READ|PAG_WRITE|OBJ_GETTABLE);
    3033  if(rc != 0) {
    3134        dprintf(("InitializeSharedHeap: DosAllocSharedMem failed with %d", rc));
    3235        return FALSE;
    3336  }
    34   sharedHeap = _ucreate(pSharedMem, INITIAL_HEAPSIZE, _BLOCK_CLEAN,
     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,
    3543                        _HEAP_REGULAR|_HEAP_SHARED,
    3644                        getmoreShared, releaseShared);
     
    3947        dprintf(("InitializeSharedHeap: _ucreate failed!"));
    4048        return FALSE;
     49  }
     50  for(int i=0;i<INCR_HEAPSIZE/PAGE_SIZE;i++) {
     51        pageBitmap[i] = 1; //mark as committed
    4152  }
    4253  return TRUE;
     
    6576//******************************************************************************
    6677//******************************************************************************
     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//******************************************************************************
    6789void * _LNK_CONV getmoreShared(Heap_t pHeap, size_t *size, int *clean)
    6890{
     
    7193 PVOID newblock;
    7294
    73   /* round the size up to a multiple of 64K */
    74   *size = (*size / 65536) * 65536 + 65536;
     95  /* round the size up to a multiple of 4K */
     96  *size = (*size / 4096) * 4096 + 4096;
     97  *size = max(*size, INCR_HEAPSIZE);
    7598
    76   rc = DosAllocSharedMem(&newblock, NULL, *size, PAG_READ|PAG_WRITE|PAG_COMMIT|OBJ_GIVEABLE);
    77   if(rc != 0) {
    78         dprintf(("getmoreShared: DosAllocSharedMem failed with %d", rc));
    79         return NULL;
     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;
    80119  }
    81   *clean = _BLOCK_CLEAN;
    82 
    83   return newblock;
     120  dprintf(("USER32: getmoreShared NOTHING LEFT (%d)", *size));
     121  return NULL;
    84122}
    85123//******************************************************************************
     
    87125void _LNK_CONV releaseShared(Heap_t pHeap, void *block, size_t size)
    88126{
    89   DosFreeMem(block);
     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  }
    90137}
    91138//******************************************************************************
    92139//******************************************************************************
     140DWORD  HeapGetSharedMemBase()
     141{
     142  return (DWORD) pSharedMem;
     143}
     144//******************************************************************************
     145//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.