From 94a045c6291f2968bd26ba207187d3aaec743450 Mon Sep 17 00:00:00 2001 From: "dp%netscape.com" Date: Wed, 25 Aug 1999 05:41:53 +0000 Subject: [PATCH] bug#11902 Changes for page manager for openVMS. Thanks to Colin Blake --- xpcom/ds/nsPageMgr.cpp | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/xpcom/ds/nsPageMgr.cpp b/xpcom/ds/nsPageMgr.cpp index 0189dd9d3616..3291cedb9d52 100644 --- a/xpcom/ds/nsPageMgr.cpp +++ b/xpcom/ds/nsPageMgr.cpp @@ -39,6 +39,9 @@ #endif #if defined(VMS) +#if defined(DEBUG) +#include +#endif #include #include #include @@ -325,14 +328,28 @@ nsPageMgr::InitPages(nsPageCount minPages, nsPageCount maxPages) struct _va_range retadr, retadr2; int status; + /* + ** The default is 32767 pages. This is quite a lot (the pages are 4k). + ** Let's at least make it configurable. + */ + + char *tmp; + tmp = getenv("VMS_PAGE_MANAGER_SIZE"); + if (tmp) + size=atoi(tmp); +#if defined(DEBUG) + printf("Requested page manager size is %d 4k pages\n",size); +#endif + /* ** $EXPREG will extend the virtual address region by the requested ** number of pages (or pagelets on Alpha). The process must have ** sufficient PGFLQUOTA for the operation, otherwise SS$_EXQUOTA will ** be returned. However, in the case of SS$_EXQUOTA, $EXPREG will have ** grown the region by the largest possible amount. In this case we will - ** take what we could get, just so long as its over our minimum - ** threshold. + ** put back the maximum amount and repeat the $EXPREG requesting half of + ** maximum (so as to leave some memory for others), just so long as its + ** over our minimum threshold. */ status = sys$expreg(size << (NS_PAGEMGR_PAGE_BITS-VA$C_PAGELET_SHIFT_SIZE), @@ -344,14 +361,28 @@ nsPageMgr::InitPages(nsPageCount minPages, nsPageCount maxPages) size = ( (int)retadr.va_range$ps_end_va - (int)retadr.va_range$ps_start_va + 1 ) >> NS_PAGEMGR_PAGE_BITS; + status=sys$deltva(&retadr,&retadr2,0); + size=size/2; if (size < minPages) { - status=sys$deltva(&retadr,&retadr2,0); return PR_FAILURE; } + status = sys$expreg( + size << (NS_PAGEMGR_PAGE_BITS-VA$C_PAGELET_SHIFT_SIZE), + &retadr,0,0); + if (status != SS$_NORMAL) { + status=sys$deltva(&retadr,&retadr2,0); + return PR_FAILURE; + } + size = ( (int)retadr.va_range$ps_end_va - + (int)retadr.va_range$ps_start_va + 1 + ) >> NS_PAGEMGR_PAGE_BITS; break; default: return PR_FAILURE; } +#if defined(DEBUG) + printf("Actual page manager size is %d 4k pages\n",size); +#endif /* We got at least something */ addr = (nsPage *)retadr.va_range$ps_start_va;