- Timestamp:
- Aug 28, 1999, 9:33:04 PM (26 years ago)
- Location:
- trunk/src/user32/new
- Files:
-
- 4 added
- 7 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:57sandervl Exp $ */1 /* $Id: heapshared.cpp,v 1.2 1999-08-28 19:32:46 sandervl Exp $ */ 2 2 /* 3 3 * 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) 4 8 * 5 9 * Copyright 1999 Sander van Leeuwen (sandervl@xs4all.nl) … … 12 16 #include "heapshared.h" 13 17 14 #define INITIAL_HEAPSIZE (64*1024) 15 16 Heap_t sharedHeap = 0; 17 PVOID pSharedMem = NULL; 18 Heap_t sharedHeap = 0; 19 static PVOID pSharedMem = NULL; 20 static BYTE pageBitmap[MAX_HEAPPAGES] = {0}; 18 21 19 22 void * _LNK_CONV getmoreShared(Heap_t pHeap, size_t *size, int *clean); … … 27 30 28 31 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); 30 33 if(rc != 0) { 31 34 dprintf(("InitializeSharedHeap: DosAllocSharedMem failed with %d", rc)); 32 35 return FALSE; 33 36 } 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, 35 43 _HEAP_REGULAR|_HEAP_SHARED, 36 44 getmoreShared, releaseShared); … … 39 47 dprintf(("InitializeSharedHeap: _ucreate failed!")); 40 48 return FALSE; 49 } 50 for(int i=0;i<INCR_HEAPSIZE/PAGE_SIZE;i++) { 51 pageBitmap[i] = 1; //mark as committed 41 52 } 42 53 return TRUE; … … 65 76 //****************************************************************************** 66 77 //****************************************************************************** 78 ULONG 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 //****************************************************************************** 67 89 void * _LNK_CONV getmoreShared(Heap_t pHeap, size_t *size, int *clean) 68 90 { … … 71 93 PVOID newblock; 72 94 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); 75 98 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; 80 119 } 81 *clean = _BLOCK_CLEAN; 82 83 return newblock; 120 dprintf(("USER32: getmoreShared NOTHING LEFT (%d)", *size)); 121 return NULL; 84 122 } 85 123 //****************************************************************************** … … 87 125 void _LNK_CONV releaseShared(Heap_t pHeap, void *block, size_t size) 88 126 { 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 } 90 137 } 91 138 //****************************************************************************** 92 139 //****************************************************************************** 140 DWORD HeapGetSharedMemBase() 141 { 142 return (DWORD) pSharedMem; 143 } 144 //****************************************************************************** 145 //****************************************************************************** -
trunk/src/user32/new/heapshared.h
r724 r729 1 /* $Id: heapshared.h,v 1. 1 1999-08-28 14:09:58sandervl Exp $ */1 /* $Id: heapshared.h,v 1.2 1999-08-28 19:32:46 sandervl Exp $ */ 2 2 /* 3 3 * Shared heap functions for OS/2 … … 13 13 #include <umalloc.h> 14 14 15 #define PAGE_SIZE 4096 16 #define MAX_HEAPSIZE (256*1024) 17 #define MAX_HEAPPAGES (MAX_HEAPSIZE/PAGE_SIZE) 18 #define INCR_HEAPSIZE (16*1024) 19 15 20 extern Heap_t sharedHeap; 16 21 17 22 BOOL InitializeSharedHeap(); 18 23 void DestroySharedHeap(); 24 DWORD HeapGetSharedMemBase(); 19 25 20 26 void *_smalloc(size_t size); -
trunk/src/user32/new/makefile
r724 r729 1 # $Id: makefile,v 1.3 4 1999-08-28 14:09:29sandervl Exp $1 # $Id: makefile,v 1.35 1999-08-28 19:32:46 sandervl Exp $ 2 2 3 3 # … … 22 22 23 23 OBJS = user32.obj dialog.obj loadres.obj \ 24 dde.obj heapshared.obj \24 dde.obj heapshared.obj win32wndhandle.obj \ 25 25 icon.obj hook.obj hooks.obj winmenu.obj \ 26 26 usrcall.obj defwndproc.obj syscolor.obj char.obj initterm.obj \ … … 31 31 controls.obj button.obj static.obj scroll.obj listbox.obj \ 32 32 combo.obj edit.obj clipboard.obj winicon.obj \ 33 oslibutil.obj oslibmsg.obj dib.obj \33 oslibutil.obj oslibmsg.obj dib.obj oslibdos.obj \ 34 34 winprop.obj wingdi.obj oslibgdi.obj winaccel.obj winscrollbar.obj \ 35 35 nativerc.obj oslibres.obj dummy.obj \ … … 98 98 windlg.obj: windlg.cpp win32wnd.h win32dlg.h 99 99 windlgmsg.obj: windlgmsg.cpp win32class.h win32wnd.h win32dlg.h win32wndchild.h 100 win32wndhandle.obj: win32wndhandle.cpp win32wndhandle.h 100 101 101 102 pmwindow.obj: pmwindow.cpp win32class.h win32wnd.h win32dlg.h pmwindow.h win32wndchild.h $(PDWIN32_INCLUDE)\wprocess.h oslibgdi.h oslibwin.h 102 103 win32class.obj: win32class.cpp win32class.h win32wnd.h win32dlg.h gen_object.h heapshared.h oslibwin.h win32wndchild.h 103 win32wnd.obj: win32wnd.cpp win32class.h win32wnd.h win32dlg.h gen_object.h heapshared.h oslibwin.h win32wndchild.h $(PDWIN32_INCLUDE)\winres.h oslibres.h 104 win32wnd.obj: win32wnd.cpp win32class.h win32wnd.h win32dlg.h gen_object.h heapshared.h oslibwin.h win32wndchild.h $(PDWIN32_INCLUDE)\winres.h oslibres.h win32wndhandle.h oslibdos.h 104 105 win32dlg.obj: win32dlg.cpp win32class.h win32wnd.h win32dlg.h gen_object.h heapshared.h oslibwin.h win32wndchild.h 105 106 win32wndchild.obj: win32wndchild.cpp win32wndchild.h … … 110 111 oslibgdi.obj: oslibgdi.cpp oslibgdi.h 111 112 oslibres.obj: oslibres.cpp oslibwin.h oslibres.h $(PDWIN32_INCLUDE)\winconst.h 113 oslibdos.obj: oslibdos.cpp oslibdos.h 112 114 113 115 clipboard.obj: clipboard.cpp -
trunk/src/user32/new/pmwindow.cpp
r728 r729 1 /* $Id: pmwindow.cpp,v 1.2 3 1999-08-28 17:24:45 dengertExp $ */1 /* $Id: pmwindow.cpp,v 1.24 1999-08-28 19:32:46 sandervl Exp $ */ 2 2 /* 3 3 * Win32 Window Managment Code for OS/2 … … 77 77 (PFNWP)Win32WindowProc, /* Address of window procedure */ 78 78 CS_SIZEREDRAW | CS_HITTEST, 79 8)) {79 NROF_WIN32WNDBYTES)) { 80 80 dprintf(("WinRegisterClass Win32Window failed")); 81 81 return(FALSE); … … 108 108 goto RunDefWndProc; 109 109 } 110 if(msg > WIN32APP_USERMSGBASE) { 111 //win32 app user message 112 dprintf(("PMWINDOW: Message %x (%x,%x) posted to window %x", (ULONG)msg-WIN32APP_USERMSGBASE, mp1, mp2, hwnd)); 113 win32wnd->SendMessageA((ULONG)msg-WIN32APP_USERMSGBASE, (ULONG)mp1, (ULONG)mp2); 114 } 110 115 switch( msg ) 111 116 { 112 //internal messages113 case WM_WIN32_POSTMESSAGEA:114 postmsg = (POSTMSG_PACKET *)mp1;115 if(postmsg == NULL) {116 dprintf(("WM_WIN32_POSTMESSAGEA, postmsg NULL!!"));117 break;118 }119 win32wnd->SendMessageA(postmsg->Msg, postmsg->wParam, postmsg->lParam);120 free(postmsg);121 break;122 123 case WM_WIN32_POSTMESSAGEW:124 postmsg = (POSTMSG_PACKET *)mp1;125 if(postmsg == NULL) {126 dprintf(("WM_WIN32_POSTMESSAGEW, postmsg NULL!!"));127 break;128 }129 win32wnd->SendMessageW(postmsg->Msg, postmsg->wParam, postmsg->lParam);130 free(postmsg);131 break;132 133 117 //OS/2 msgs 134 118 case WM_CREATE: … … 199 183 { 200 184 Win32Window *wndAfter = Win32Window::GetWindowFromOS2Handle(pswp->hwndInsertBehind); 201 wp.hwndInsertAfter = wndAfter->getWindowHandle();185 if(wndAfter) wp.hwndInsertAfter = wndAfter->getWindowHandle(); 202 186 } 203 187 win32wnd->MsgPosChanging((LPARAM)&wp); -
trunk/src/user32/new/user32.def
r647 r729 1 ; $Id: user32.def,v 1. 5 1999-08-23 13:56:47sandervl Exp $1 ; $Id: user32.def,v 1.6 1999-08-28 19:32:46 sandervl Exp $ 2 2 3 3 ;Created by BLAST for IBM's compiler 4 LIBRARY USER32 INITINSTANCE 5 DATA MULTIPLE NONSHARED 4 LIBRARY USER32 INITINSTANCE TERMINSTANCE 5 DATA MULTIPLE NONSHARED LOADONCALL 6 CODE SHARED LOADONCALL 7 8 SEGMENTS 9 _GLOBALDATA CLASS 'DATA' SHARED LOADONCALL READWRITE 6 10 7 11 EXPORTS -
trunk/src/user32/new/win32wnd.cpp
r728 r729 1 /* $Id: win32wnd.cpp,v 1.3 3 1999-08-28 17:24:45 dengertExp $ */1 /* $Id: win32wnd.cpp,v 1.34 1999-08-28 19:32:47 sandervl Exp $ */ 2 2 /* 3 3 * Win32 Window Code for OS/2 … … 23 23 #include <assert.h> 24 24 #include <misc.h> 25 #include <handlemanager.h>26 25 #include <heapstring.h> 27 26 #include <win32wnd.h> … … 33 32 #include <oslibgdi.h> 34 33 #include <oslibres.h> 34 #include "oslibdos.h" 35 35 #include <winres.h> 36 36 #include "syscolor.h" 37 #include "win32wndhandle.h" 38 #include "heapshared.h" 37 39 38 40 #define HAS_DLGFRAME(style,exStyle) \ … … 86 88 Win32Hwnd = 0; 87 89 88 if(H MHandleAllocate(&Win32Hwnd, (ULONG)this) != 0)90 if(HwAllocateWindowHandle(&Win32Hwnd, (ULONG)this) == FALSE) 89 91 { 90 dprintf(("Win32Window::Init H MHandleAllocate failed!!"));92 dprintf(("Win32Window::Init HwAllocateWindowHandle failed!!")); 91 93 DebugInt3(); 92 94 } 93 Win32Hwnd &= 0xFFFF;94 Win32Hwnd |= 0x68000000;95 95 96 96 posx = posy = 0; … … 124 124 125 125 if(Win32Hwnd) 126 HMHandleFree(Win32Hwnd & 0xFFFF); 126 HwFreeWindowHandle(Win32Hwnd); 127 127 128 if(userWindowLong) 128 129 free(userWindowLong); … … 269 270 if(owner == NULL) 270 271 { 271 dprintf(("H MHandleTranslateToOS2couldn't find owner window %x!!!", cs->hwndParent));272 dprintf(("HwGetWindowHandleData couldn't find owner window %x!!!", cs->hwndParent)); 272 273 return FALSE; 273 274 } … … 283 284 if(owner == NULL) 284 285 { 285 dprintf(("H MHandleTranslateToOS2couldn't find owner window %x!!!", cs->hwndParent));286 dprintf(("HwGetWindowHandleData couldn't find owner window %x!!!", cs->hwndParent)); 286 287 return FALSE; 287 288 } … … 403 404 return FALSE; 404 405 } 406 //SvL: Need to store the shared memory base, or else other apps can map it into their memory space 407 if(OSLibWinSetWindowULong(OS2Hwnd, OFFSET_WIN32PM_SHAREDMEM, HeapGetSharedMemBase()) == FALSE) { 408 dprintf(("WM_CREATE: WinSetWindowULong2 %X failed!!", OS2Hwnd)); 409 return FALSE; 410 } 405 411 #if 0 406 412 if(OS2Hwnd != OS2HwndFrame) { … … 410 416 } 411 417 if(OSLibWinSetWindowULong(OS2HwndFrame, OFFSET_WIN32PM_MAGIC, WIN32PM_MAGIC) == FALSE) { 418 dprintf(("WM_CREATE: WinSetWindowULong2 %X failed!!", OS2HwndFrame)); 419 return FALSE; 420 } 421 //SvL: Need to store the shared memory base, or else other apps can map it into their memory space 422 if(OSLibWinSetWindowULong(OS2HwndFrame, OFFSET_WIN32PM_SHAREDMEM, HeapGetSharedMemBase()) == FALSE) { 412 423 dprintf(("WM_CREATE: WinSetWindowULong2 %X failed!!", OS2HwndFrame)); 413 424 return FALSE; … … 1334 1345 BOOL Win32Window::PostMessageA(ULONG msg, WPARAM wParam, LPARAM lParam) 1335 1346 { 1336 POSTMSG_PACKET *postmsg; 1337 1338 postmsg = (POSTMSG_PACKET *)malloc(sizeof(POSTMSG_PACKET)); 1339 if(postmsg == NULL) { 1340 dprintf(("Win32Window::PostMessageA: malloc returned NULL!!")); 1341 return 0; 1342 } 1343 postmsg->Msg = msg; 1344 postmsg->wParam = wParam; 1345 postmsg->lParam = lParam; 1346 return OSLibPostMessage(OS2Hwnd, WM_WIN32_POSTMESSAGEA, (ULONG)postmsg, 0); 1347 return OSLibPostMessage(OS2Hwnd, WIN32APP_USERMSGBASE+msg, wParam, lParam); 1347 1348 } 1348 1349 //****************************************************************************** … … 1350 1351 BOOL Win32Window::PostMessageW(ULONG msg, WPARAM wParam, LPARAM lParam) 1351 1352 { 1352 POSTMSG_PACKET *postmsg; 1353 1354 postmsg = (POSTMSG_PACKET *)malloc(sizeof(POSTMSG_PACKET)); 1355 if(postmsg == NULL) { 1356 dprintf(("Win32Window::PostMessageW: malloc returned NULL!!")); 1357 return 0; 1358 } 1359 postmsg->Msg = msg; 1360 postmsg->wParam = wParam; 1361 postmsg->lParam = lParam; 1362 return OSLibPostMessage(OS2Hwnd, WM_WIN32_POSTMESSAGEW, (ULONG)postmsg, 0); 1353 return OSLibPostMessage(OS2Hwnd, WIN32APP_USERMSGBASE+msg, wParam, lParam); 1363 1354 } 1364 1355 //****************************************************************************** … … 1743 1734 while(hwnd) 1744 1735 { 1745 HWND hwndClient;1746 1747 1736 wnd = GetWindowFromOS2Handle(hwnd); 1748 1737 if(wnd == NULL) { 1749 hwnd Client= OSLibWinQueryClientWindow(hwnd);1750 if(hwnd Client) wnd = GetWindowFromOS2Handle(hwndClient);1738 hwnd = OSLibWinQueryClientWindow(hwnd); 1739 if(hwnd) wnd = GetWindowFromOS2Handle(hwnd); 1751 1740 } 1752 1741 1753 if(wnd && wnd->getWindowClass()->hasClassName(lpszClass, fUnicode) && 1754 (!lpszWindow || wnd->hasWindowName(lpszWindow, fUnicode))) 1755 { 1756 OSLibWinEndEnumWindows(henum); 1757 dprintf(("FindWindowEx: Found window %x", wnd->getWindowHandle())); 1758 return wnd->getWindowHandle(); 1742 if(wnd) { 1743 LPVOID sharedmembase = (LPVOID)OSLibWinGetWindowULong(hwnd, OFFSET_WIN32PM_SHAREDMEM); 1744 1745 if(OSLibDosGetSharedMem(sharedmembase, MAX_HEAPSIZE, OSLIB_PAG_READ) != 0) { 1746 dprintf(("OSLibDosGetSharedMem returned error for %x", wnd)); 1747 break; 1748 } 1749 if(wnd->getWindowClass()->hasClassName(lpszClass, fUnicode) && 1750 (!lpszWindow || wnd->hasWindowName(lpszWindow, fUnicode))) 1751 { 1752 OSLibWinEndEnumWindows(henum); 1753 dprintf(("FindWindowEx: Found window %x", wnd->getWindowHandle())); 1754 return wnd->getWindowHandle(); 1755 } 1759 1756 } 1760 1757 hwnd = OSLibWinGetNextWindow(henum); … … 2033 2030 Win32Window *window; 2034 2031 2035 if(HIWORD(hwnd) != 0x6800) { 2036 return NULL; 2037 } 2038 2039 if(HMHandleTranslateToOS2(LOWORD(hwnd), (PULONG)&window) == NO_ERROR) { 2032 if(HwGetWindowHandleData(hwnd, (DWORD *)&window) == TRUE) { 2040 2033 return window; 2041 2034 } -
trunk/src/user32/new/win32wnd.h
r724 r729 1 /* $Id: win32wnd.h,v 1.2 7 1999-08-28 14:09:30sandervl Exp $ */1 /* $Id: win32wnd.h,v 1.28 1999-08-28 19:32:47 sandervl Exp $ */ 2 2 /* 3 3 * Win32 Window Code for OS/2 … … 23 23 class Win32Window; 24 24 25 #define OFFSET_WIN32WNDPTR 0 26 #define OFFSET_WIN32PM_MAGIC 4 25 #define OFFSET_WIN32WNDPTR 0 26 #define OFFSET_WIN32PM_MAGIC 4 27 #define OFFSET_WIN32PM_SHAREDMEM 8 28 #define NROF_WIN32WNDBYTES 12 27 29 28 30 #define WIN32PM_MAGIC 0x12345678 29 31 #define CheckMagicDword(a) (a==WIN32PM_MAGIC) 32 33 #define WIN32APP_USERMSGBASE 0x1000 30 34 31 35 typedef struct {
Note:
See TracChangeset
for help on using the changeset viewer.