You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by "Ian Rogers (JIRA)" <ji...@apache.org> on 2009/04/03 14:24:12 UTC
[jira] Created: (HARMONY-6138) Implementation of
hyvmem_reserve_memory in Windows is inconsistent with doc/UNIX
Implementation of hyvmem_reserve_memory in Windows is inconsistent with doc/UNIX
--------------------------------------------------------------------------------
Key: HARMONY-6138
URL: https://issues.apache.org/jira/browse/HARMONY-6138
Project: Harmony
Issue Type: Bug
Components: Classlib
Affects Versions: 5.0M8
Environment: Harmony M8, Windows Vista 32bit
Reporter: Ian Rogers
In Windows a call to hyvmem_reserve_memory with the default page size, rwx and commit, will cause the memory to be committed and no reservation to take place. As such the call will fail as the memory hasn't been reserved. The documentation says:
* \arg HYPORT_VMEM_MEMORY_MODE_COMMIT commits memory as part of the reserve
However, a separate commit is necessary following a reserve (and the first reserve must clear the commit flag). For example,
HyPortVmemIdentifier ident;
ident.pageSize = 4096;
ident.mode = HYPORT_VMEM_MEMORY_MODE_READ | HYPORT_VMEM_MEMORY_MODE_WRITE | HYPORT_VMEM_MEMORY_MODE_EXECUTE | HYPORT_VMEM_MEMORY_MODE_COMMIT;
hyvmem_reserve_memory(..., baseAddr, 4096, &ident, ident.mode, ident.pageSize);
if baseAddr is varied then on Linux many reserve/commitable pages are found, but on Windows only pages belonging to the application are found (as they are already reserved).
The offending code is:
/* Handle default page size */
if ((HYPORT_VMEM_PAGE_SIZE_DEFAULT == pageSize)
|| (PPG_vmem_pageSize[0] == pageSize))
{
DWORD allocationType;
/* Determine if a commit is required */
if (0 != (HYPORT_VMEM_MEMORY_MODE_COMMIT & mode))
{
allocationType = MEM_COMMIT;
}
else
{
/*
* If we don't reserve with PAGE_NOACCESS, CE won't give us large blocks.
* On Win32 the protection bits appear to be ignored for uncommitted memory.
*/
allocationType = MEM_RESERVE;
protection = PAGE_NOACCESS;
}
A simple fix may be to make "allocationType = MEM_COMMIT | MEM_RESERVE;" (that is at line 200 in /modules/portlib/src/main/native/port/windows/hyvmem.c ).
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.