Changeset 1432 for trunk/src/kernel32/mmap.cpp
- Timestamp:
- Oct 25, 1999, 12:53:25 AM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/mmap.cpp
r770 r1432 1 /* $Id: mmap.cpp,v 1.1 8 1999-09-01 00:03:51 phallerExp $ */1 /* $Id: mmap.cpp,v 1.19 1999-10-24 22:51:21 sandervl Exp $ */ 2 2 3 3 /* … … 30 30 #include "oslibdos.h" 31 31 32 VMutex globalmapMutex; 33 VMutex globalviewMutex; 32 //Global DLL Data 33 #pragma data_seg(_GLOBALDATA) 34 Win32MemMapView *Win32MemMapView::mapviews = NULL; 35 Win32MemMap *Win32MemMap::memmaps = NULL; 36 VMutex globalmapMutex(VMUTEX_SHARED); 37 VMutex globalviewMutex(VMUTEX_SHARED); 38 #pragma data_seg() 34 39 35 40 //****************************************************************************** … … 48 53 mSize = size; 49 54 mProtFlags = fdwProtect; 55 mProcessId = GetCurrentProcess(); 50 56 51 57 if(lpszName) { 52 lpszMapName = (char *) malloc(strlen(lpszName)+1);58 lpszMapName = (char *)_smalloc(strlen(lpszName)+1); 53 59 strcpy(lpszMapName, lpszName); 54 60 } … … 62 68 if(hMemFile != -1) 63 69 { 64 if(DuplicateHandle( GetCurrentProcess(), hMemFile, GetCurrentProcess(),70 if(DuplicateHandle(mProcessId, hMemFile, GetCurrentProcess(), 65 71 &hMemFile, 0, FALSE, DUPLICATE_SAME_ACCESS) == FALSE) 66 72 { … … 87 93 Win32MemMap::~Win32MemMap() 88 94 { 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 92 97 mapMutex.enter(); 93 98 if(lpszMapName) { … … 95 100 } 96 101 if(pMapping) { 97 VirtualFree(pMapping, mSize, MEM_RELEASE); 102 if(lpszMapName) { 103 OSLibDosFreeMem(pMapping); 104 } 105 else VirtualFree(pMapping, mSize, MEM_RELEASE); 106 98 107 pMapping = NULL; 99 108 } … … 206 215 } 207 216 //****************************************************************************** 208 //todo: unalias memory209 217 //****************************************************************************** 210 218 BOOL Win32MemMap::unmapViewOfFile(Win32MemMapView *view) … … 231 239 LPVOID Win32MemMap::mapViewOfFile(ULONG size, ULONG offset, ULONG fdwAccess) 232 240 { 241 DWORD processId = GetCurrentProcess(); 242 233 243 mapMutex.enter(); 234 244 ULONG memFlags = (mProtFlags & (PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY)); … … 270 280 // when allocating memory with the PAG_ANY bit set. (without this 271 281 // 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 } 273 288 if(pMapping == NULL) { 274 289 dprintf(("Win32MemMap::mapFileView: VirtualAlloc %x %x %x failed!", mSize, fAlloc, memFlags)); … … 375 390 Win32MemMap *Win32MemMap::findMap(LPSTR lpszName) 376 391 { 392 if(lpszName == NULL) 393 return NULL; 394 377 395 globalmapMutex.enter(); 378 396 Win32MemMap *map = memmaps; … … 414 432 void Win32MemMap::deleteAll() 415 433 { 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 } 424 450 //****************************************************************************** 425 451 //****************************************************************************** … … 435 461 mSize = size; 436 462 mOffset = offset; 463 mProcessId = GetCurrentProcess(); 437 464 438 465 switch(fdwAccess) { … … 447 474 break; 448 475 } 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 449 486 if(OSLibDosAliasMem(viewaddr, size, &pMapView, accessAttr) != OSLIB_NOERROR) { 450 487 dprintf(("new OSLibDosAliasMem FAILED")); … … 506 543 //****************************************************************************** 507 544 //****************************************************************************** 508 void Win32MemMapView::deleteView(Win32MemMap *map) 509 { 545 void Win32MemMapView::deleteViews(Win32MemMap *map) 546 { 547 DWORD processId = GetCurrentProcess(); 548 510 549 globalviewMutex.enter(); 511 Win32MemMapView *view = mapviews ;550 Win32MemMapView *view = mapviews, *nextview; 512 551 513 552 if(view != NULL) { 514 553 while(view) { 515 if(view->getParentMap() == map) 554 nextview = view->next; 555 if(view->getParentMap() == map && view->getProcessId() == processId) 516 556 { 517 557 globalviewMutex.leave(); 518 558 delete view; 519 return;520 } 521 view = view->next;559 globalviewMutex.enter(); 560 } 561 view = nextview; 522 562 } 523 563 } … … 573 613 //****************************************************************************** 574 614 //****************************************************************************** 575 Win32MemMapView *Win32MemMapView::mapviews = NULL; 576 615
Note:
See TracChangeset
for help on using the changeset viewer.