Ignore:
Timestamp:
Oct 25, 1999, 12:53:25 AM (26 years ago)
Author:
sandervl
Message:

Shared memory mapping changes

File:
1 edited

Legend:

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

    r770 r1432  
    1 /* $Id: mmap.cpp,v 1.18 1999-09-01 00:03:51 phaller Exp $ */
     1/* $Id: mmap.cpp,v 1.19 1999-10-24 22:51:21 sandervl Exp $ */
    22
    33/*
     
    3030#include "oslibdos.h"
    3131
    32 VMutex globalmapMutex;
    33 VMutex globalviewMutex;
     32//Global DLL Data
     33#pragma data_seg(_GLOBALDATA)
     34Win32MemMapView *Win32MemMapView::mapviews = NULL;
     35Win32MemMap     *Win32MemMap::memmaps = NULL;
     36VMutex           globalmapMutex(VMUTEX_SHARED);
     37VMutex           globalviewMutex(VMUTEX_SHARED);
     38#pragma data_seg()
    3439
    3540//******************************************************************************
     
    4853  mSize      = size;
    4954  mProtFlags = fdwProtect;
     55  mProcessId  = GetCurrentProcess();
    5056
    5157  if(lpszName) {
    52         lpszMapName = (char *)malloc(strlen(lpszName)+1);
     58        lpszMapName = (char *)_smalloc(strlen(lpszName)+1);
    5359        strcpy(lpszMapName, lpszName);
    5460  }
     
    6268  if(hMemFile != -1)
    6369  {
    64         if(DuplicateHandle(GetCurrentProcess(), hMemFile, GetCurrentProcess(),
     70        if(DuplicateHandle(mProcessId, hMemFile, GetCurrentProcess(),
    6571                           &hMemFile, 0, FALSE, DUPLICATE_SAME_ACCESS) == FALSE)
    6672        {
     
    8793Win32MemMap::~Win32MemMap()
    8894{
    89   for(int i=0;i<nrMappings;i++) {
    90         Win32MemMapView::deleteView(this); //delete all views of our memory mapped file
    91   }
     95  Win32MemMapView::deleteViews(this); //delete all views of our memory mapped file
     96
    9297  mapMutex.enter();
    9398  if(lpszMapName) {
     
    95100  }
    96101  if(pMapping) {
    97         VirtualFree(pMapping, mSize, MEM_RELEASE);
     102        if(lpszMapName) {
     103                OSLibDosFreeMem(pMapping);
     104        }
     105        else    VirtualFree(pMapping, mSize, MEM_RELEASE);
     106
    98107        pMapping = NULL;
    99108  }
     
    206215}
    207216//******************************************************************************
    208 //todo: unalias memory
    209217//******************************************************************************
    210218BOOL Win32MemMap::unmapViewOfFile(Win32MemMapView *view)
     
    231239LPVOID Win32MemMap::mapViewOfFile(ULONG size, ULONG offset, ULONG fdwAccess)
    232240{
     241 DWORD processId = GetCurrentProcess();
     242
    233243  mapMutex.enter();
    234244  ULONG memFlags = (mProtFlags & (PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY));
     
    270280        //     when allocating memory with the PAG_ANY bit set. (without this
    271281        //     flag it will also crash)
    272         pMapping = VirtualAlloc(0, mSize, fAlloc, PAGE_READWRITE);
     282        if(lpszMapName) {
     283                pMapping = VirtualAllocShared(mSize, fAlloc, PAGE_READWRITE, lpszMapName);
     284        }
     285        else {
     286                pMapping = VirtualAlloc(0, mSize, fAlloc, PAGE_READWRITE);
     287        }
    273288        if(pMapping == NULL) {
    274289                dprintf(("Win32MemMap::mapFileView: VirtualAlloc %x %x %x failed!", mSize, fAlloc, memFlags));
     
    375390Win32MemMap *Win32MemMap::findMap(LPSTR lpszName)
    376391{
     392  if(lpszName == NULL)
     393        return NULL;
     394
    377395  globalmapMutex.enter();
    378396  Win32MemMap *map = memmaps;
     
    414432void Win32MemMap::deleteAll()
    415433{
    416   while(memmaps) {
    417         CloseHandle(memmaps->hMemMap);
    418   }
    419 }
    420 //******************************************************************************
    421 //******************************************************************************
    422 Win32MemMap *Win32MemMap::memmaps = NULL;
    423 
     434 Win32MemMap *map = memmaps, *nextmap;
     435 DWORD processId = GetCurrentProcess();
     436
     437  //delete all maps created by this process
     438  while(map) {
     439        nextmap = map->next;
     440        if(map->getProcessId() == processId) {
     441                CloseHandle(memmaps->hMemMap);
     442        }
     443        else {
     444                //delete all views created by this process for this map
     445                Win32MemMapView::deleteViews(map);
     446        }
     447        map = nextmap;
     448  }
     449}
    424450//******************************************************************************
    425451//******************************************************************************
     
    435461  mSize    = size;
    436462  mOffset  = offset;
     463  mProcessId = GetCurrentProcess();
    437464
    438465  switch(fdwAccess) {
     
    447474        break;
    448475  }
     476  if(map->getMemName() != NULL) {
     477        //shared memory map, so map it into our address space
     478        if(OSLibDosGetNamedSharedMem((LPVOID *)&viewaddr, map->getMemName()) != OSLIB_NOERROR) {
     479                dprintf(("new OSLibDosGetNamedSharedMem FAILED"));
     480                SetLastError(ERROR_NOT_ENOUGH_MEMORY);
     481                errorState = 1;
     482                return;
     483        }
     484  }
     485 
    449486  if(OSLibDosAliasMem(viewaddr, size, &pMapView, accessAttr) != OSLIB_NOERROR) {
    450487        dprintf(("new OSLibDosAliasMem FAILED"));
     
    506543//******************************************************************************
    507544//******************************************************************************
    508 void Win32MemMapView::deleteView(Win32MemMap *map)
    509 {
     545void Win32MemMapView::deleteViews(Win32MemMap *map)
     546{
     547  DWORD processId = GetCurrentProcess();
     548
    510549  globalviewMutex.enter();
    511   Win32MemMapView *view = mapviews;
     550  Win32MemMapView *view = mapviews, *nextview;
    512551
    513552  if(view != NULL) {
    514553        while(view) {
    515                 if(view->getParentMap() == map)
     554                nextview = view->next;
     555                if(view->getParentMap() == map && view->getProcessId() == processId)
    516556                {
    517557                        globalviewMutex.leave();
    518558                        delete view;
    519                         return;
    520                 }
    521                 view = view->next;
     559                        globalviewMutex.enter();
     560                }
     561                view = nextview;
    522562        }
    523563  }
     
    573613//******************************************************************************
    574614//******************************************************************************
    575 Win32MemMapView *Win32MemMapView::mapviews = NULL;
    576 
     615
Note: See TracChangeset for help on using the changeset viewer.