* mmap.cc: Do bookkeeping in 4K pages, rather than in 64K chunks.

This commit is contained in:
Corinna Vinschen 2007-01-09 11:18:57 +00:00
parent d234d96e67
commit d5b45d2f38
2 changed files with 26 additions and 18 deletions

View File

@ -1,3 +1,7 @@
2007-01-09 Corinna Vinschen <corinna@vinschen.de>
* mmap.cc: Do bookkeeping in 4K pages, rather than in 64K chunks.
2007-01-07 Corinna Vinschen <corinna@vinschen.de> 2007-01-07 Corinna Vinschen <corinna@vinschen.de>
* security.h (setacl): Add parameter for writability flag. * security.h (setacl): Add parameter for writability flag.

View File

@ -1,7 +1,7 @@
/* mmap.cc /* mmap.cc
Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005,
2006 Red Hat, Inc. 2006, 2007 Red Hat, Inc.
This file is part of Cygwin. This file is part of Cygwin.
@ -36,7 +36,9 @@ details. */
expect to be able to access this part the same way as the file pages. */ expect to be able to access this part the same way as the file pages. */
#define __PROT_FILLER 0x4000000 #define __PROT_FILLER 0x4000000
#define PAGE_CNT(bytes) howmany((bytes),getpagesize()) /* Stick with 4K pages for bookkeeping, otherwise we just get confused
when trying to do file mappings with trailing filler pages correctly. */
#define PAGE_CNT(bytes) howmany((bytes),getsystempagesize())
#define PGBITS (sizeof (DWORD)*8) #define PGBITS (sizeof (DWORD)*8)
#define MAPSIZE(pages) howmany ((pages), PGBITS) #define MAPSIZE(pages) howmany ((pages), PGBITS)
@ -602,8 +604,9 @@ mmap_record::map_pages (_off64_t off, DWORD len)
if ((off = find_unused_pages (len)) == (DWORD)-1) if ((off = find_unused_pages (len)) == (DWORD)-1)
return 0L; return 0L;
if (!noreserve () if (!noreserve ()
&& !VirtualProtect (get_address () + off * getpagesize (), && !VirtualProtect (get_address () + off * getsystempagesize (),
len * getpagesize (), gen_protect (), &old_prot)) len * getsystempagesize (), gen_protect (),
&old_prot))
{ {
__seterrno (); __seterrno ();
return (_off64_t)-1; return (_off64_t)-1;
@ -611,7 +614,7 @@ mmap_record::map_pages (_off64_t off, DWORD len)
while (len-- > 0) while (len-- > 0)
MAP_SET (off + len); MAP_SET (off + len);
return off * getpagesize (); return off * getsystempagesize ();
} }
bool bool
@ -620,7 +623,7 @@ mmap_record::map_pages (caddr_t addr, DWORD len)
debug_printf ("map_pages (addr=%x, len=%u)", addr, len); debug_printf ("map_pages (addr=%x, len=%u)", addr, len);
DWORD old_prot; DWORD old_prot;
DWORD off = addr - get_address (); DWORD off = addr - get_address ();
off /= getpagesize (); off /= getsystempagesize ();
len = PAGE_CNT (len); len = PAGE_CNT (len);
/* First check if the area is unused right now. */ /* First check if the area is unused right now. */
for (DWORD l = 0; l < len; ++l) for (DWORD l = 0; l < len; ++l)
@ -630,8 +633,9 @@ mmap_record::map_pages (caddr_t addr, DWORD len)
return false; return false;
} }
if (!noreserve () if (!noreserve ()
&& !VirtualProtect (get_address () + off * getpagesize (), && !VirtualProtect (get_address () + off * getsystempagesize (),
len * getpagesize (), gen_protect (), &old_prot)) len * getsystempagesize (), gen_protect (),
&old_prot))
{ {
__seterrno (); __seterrno ();
return false; return false;
@ -646,16 +650,15 @@ mmap_record::unmap_pages (caddr_t addr, DWORD len)
{ {
DWORD old_prot; DWORD old_prot;
DWORD off = addr - get_address (); DWORD off = addr - get_address ();
off /= getpagesize ();
len = PAGE_CNT (len);
if (noreserve () if (noreserve ()
&& !VirtualFree (get_address () + off * getpagesize (), && !VirtualFree (get_address () + off, len, MEM_DECOMMIT))
len * getpagesize (), MEM_DECOMMIT))
debug_printf ("VirtualFree in unmap_pages () failed, %E"); debug_printf ("VirtualFree in unmap_pages () failed, %E");
else if (!VirtualProtect (get_address () + off * getpagesize (), else if (!VirtualProtect (get_address () + off, len, PAGE_NOACCESS,
len * getpagesize (), PAGE_NOACCESS, &old_prot)) &old_prot))
debug_printf ("VirtualProtect in unmap_pages () failed, %E"); debug_printf ("VirtualProtect in unmap_pages () failed, %E");
off /= getsystempagesize ();
len = PAGE_CNT (len);
for (; len-- > 0; ++off) for (; len-- > 0; ++off)
MAP_CLR (off); MAP_CLR (off);
/* Return TRUE if all pages are free'd which may result in unmapping /* Return TRUE if all pages are free'd which may result in unmapping
@ -671,7 +674,7 @@ mmap_record::access (caddr_t address)
{ {
if (address < get_address () || address >= get_address () + get_len ()) if (address < get_address () || address >= get_address () + get_len ())
return 0; return 0;
DWORD off = (address - get_address ()) / getpagesize (); DWORD off = (address - get_address ()) / getsystempagesize ();
return MAP_ISSET (off); return MAP_ISSET (off);
} }
@ -740,8 +743,9 @@ list::search_record (_off64_t off, DWORD len)
{ {
for (int i = 0; i < nrecs; ++i) for (int i = 0; i < nrecs; ++i)
if (off >= recs[i].get_offset () if (off >= recs[i].get_offset ()
&& off + len <= recs[i].get_offset () && off + len
+ (PAGE_CNT (recs[i].get_len ()) * getpagesize ())) <= recs[i].get_offset ()
+ (PAGE_CNT (recs[i].get_len ()) * getsystempagesize ()))
return recs + i; return recs + i;
} }
return NULL; return NULL;
@ -761,7 +765,7 @@ list::search_record (caddr_t addr, DWORD len, caddr_t &m_addr, DWORD &m_len,
if (recs[i].filler ()) if (recs[i].filler ())
high += recs[i].get_len (); high += recs[i].get_len ();
else else
high += (PAGE_CNT (recs[i].get_len ()) * getpagesize ()); high += (PAGE_CNT (recs[i].get_len ()) * getsystempagesize ());
high = (addr + len < high) ? addr + len : high; high = (addr + len < high) ? addr + len : high;
if (low < high) if (low < high)
{ {