* mmap.cc (list::hash): Fix type to __ino64_t.

(list::get_hash): Ditto.
	(list::set): Add struct stat parameter.  Use that instead of calling
	fstat.
	(map::get_list_by_fd): Ditto.
	(map::add_list): Ditto.
	(mmap_is_attached_or_noreserve): Call get_list_by_fd appropriately.
	(mmap_worker): Add pameters for map list and file stat information.
	Propagate to called functions.
	(mmap64): Use fstat on files early.  Replace call to GetFileSize.
	Call get_list_by_fd and mmap_worker appropriately.
This commit is contained in:
Corinna Vinschen 2007-01-18 17:15:59 +00:00
parent 5ea0aee2ce
commit 2397d888b1
2 changed files with 47 additions and 31 deletions

View File

@ -1,9 +1,23 @@
2007-01-17 Corinna Vinschen <corinna@vinschen.de> 2007-01-18 Corinna Vinschen <corinna@vinschen.de>
* mmap.cc (list::hash): Fix type to __ino64_t.
(list::get_hash): Ditto.
(list::set): Add struct stat parameter. Use that instead of calling
fstat.
(map::get_list_by_fd): Ditto.
(map::add_list): Ditto.
(mmap_is_attached_or_noreserve): Call get_list_by_fd appropriately.
(mmap_worker): Add pameters for map list and file stat information.
Propagate to called functions.
(mmap64): Use fstat on files early. Replace call to GetFileSize.
Call get_list_by_fd and mmap_worker appropriately.
2007-01-18 Corinna Vinschen <corinna@vinschen.de>
* fhandler_procnet.cc: Drop declaration of htonl and ntohs. Include * fhandler_procnet.cc: Drop declaration of htonl and ntohs. Include
asm/byteorder.h instead. asm/byteorder.h instead.
2007-01-17 Corinna Vinschen <corinna@vinschen.de> 2007-01-18 Corinna Vinschen <corinna@vinschen.de>
* include/cygwin/in6.h: Drop inclusion of asm/byteorder.h. * include/cygwin/in6.h: Drop inclusion of asm/byteorder.h.
* fhandler_procnet.cc: Declare htonl and ntohs here. * fhandler_procnet.cc: Declare htonl and ntohs here.

View File

@ -510,15 +510,15 @@ class list
mmap_record *recs; mmap_record *recs;
int nrecs, maxrecs; int nrecs, maxrecs;
int fd; int fd;
DWORD hash; __ino64_t hash;
public: public:
int get_fd () const { return fd; } int get_fd () const { return fd; }
DWORD get_hash () const { return hash; } __ino64_t get_hash () const { return hash; }
mmap_record *get_record (int i) { return i >= nrecs ? NULL : recs + i; } mmap_record *get_record (int i) { return i >= nrecs ? NULL : recs + i; }
bool anonymous () const { return fd == -1; } bool anonymous () const { return fd == -1; }
void set (int nfd); void set (int nfd, struct __stat64 *st);
mmap_record *add_record (mmap_record r); mmap_record *add_record (mmap_record r);
bool del_record (int i); bool del_record (int i);
void free_recs () { if (recs) cfree (recs); } void free_recs () { if (recs) cfree (recs); }
@ -536,8 +536,8 @@ class map
public: public:
list *get_list (unsigned i) { return i >= nlists ? NULL : lists + i; } list *get_list (unsigned i) { return i >= nlists ? NULL : lists + i; }
list *get_list_by_fd (int fd); list *get_list_by_fd (int fd, struct __stat64 *st);
list *add_list (int fd); list *add_list (int fd, struct __stat64 *st);
void del_list (unsigned i); void del_list (unsigned i);
}; };
@ -784,7 +784,7 @@ list::search_record (caddr_t addr, DWORD len, caddr_t &m_addr, DWORD &m_len,
} }
void void
list::set (int nfd) list::set (int nfd, struct __stat64 *st)
{ {
fd = nfd; fd = nfd;
if (!anonymous ()) if (!anonymous ())
@ -792,9 +792,7 @@ list::set (int nfd)
/* The fd isn't sufficient since it could already be the fd of another /* The fd isn't sufficient since it could already be the fd of another
file. So we use the inode number as evaluated by fstat to identify file. So we use the inode number as evaluated by fstat to identify
the file. */ the file. */
struct stat st; hash = st ? st->st_ino : (__ino64_t) 0;
fstat (nfd, &st);
hash = st.st_ino;
} }
nrecs = maxrecs = 0; nrecs = maxrecs = 0;
recs = NULL; recs = NULL;
@ -862,7 +860,7 @@ list::try_map (void *addr, size_t len, int flags, _off64_t off)
} }
list * list *
map::get_list_by_fd (int fd) map::get_list_by_fd (int fd, struct __stat64 *st)
{ {
unsigned i; unsigned i;
for (i = 0; i < nlists; i++) for (i = 0; i < nlists; i++)
@ -872,15 +870,14 @@ map::get_list_by_fd (int fd)
/* The fd isn't sufficient since it could already be the fd of another /* The fd isn't sufficient since it could already be the fd of another
file. So we use the inode number as evaluated by fstat to identify file. So we use the inode number as evaluated by fstat to identify
the file. */ the file. */
struct stat st; if (fd != -1 && st && lists[i].get_hash () == st->st_ino)
if (fd != -1 && !fstat (fd, &st) && lists[i].get_hash () == st.st_ino)
return lists + i; return lists + i;
} }
return 0; return 0;
} }
list * list *
map::add_list (int fd) map::add_list (int fd, struct __stat64 *st)
{ {
if (nlists == maxlists) if (nlists == maxlists)
{ {
@ -894,7 +891,7 @@ map::add_list (int fd)
maxlists += 5; maxlists += 5;
lists = new_lists; lists = new_lists;
} }
lists[nlists].set (fd); lists[nlists].set (fd, st);
return lists + nlists++; return lists + nlists++;
} }
@ -931,7 +928,7 @@ map::del_list (unsigned i)
mmap_region_status mmap_region_status
mmap_is_attached_or_noreserve (void *addr, size_t len) mmap_is_attached_or_noreserve (void *addr, size_t len)
{ {
list *map_list = mmapped_areas.get_list_by_fd (-1); list *map_list = mmapped_areas.get_list_by_fd (-1, NULL);
size_t pagesize = getpagesize (); size_t pagesize = getpagesize ();
caddr_t start_addr = (caddr_t) rounddown ((uintptr_t) addr, pagesize); caddr_t start_addr = (caddr_t) rounddown ((uintptr_t) addr, pagesize);
@ -972,15 +969,15 @@ mmap_is_attached_or_noreserve (void *addr, size_t len)
} }
static caddr_t static caddr_t
mmap_worker (fhandler_base *fh, caddr_t base, size_t len, int prot, int flags, mmap_worker (list *map_list, fhandler_base *fh, caddr_t base, size_t len,
int fd, _off64_t off) int prot, int flags, int fd, _off64_t off, struct __stat64 *st)
{ {
list *map_list;
HANDLE h = fh->mmap (&base, len, prot, flags, off); HANDLE h = fh->mmap (&base, len, prot, flags, off);
if (h == INVALID_HANDLE_VALUE) if (h == INVALID_HANDLE_VALUE)
return NULL; return NULL;
if (!(map_list = mmapped_areas.get_list_by_fd (fd)) if (!map_list
&& !(map_list = mmapped_areas.add_list (fd))) && !(map_list = mmapped_areas.get_list_by_fd (fd, st))
&& !(map_list = mmapped_areas.add_list (fd, st)))
{ {
fh->munmap (h, base, len); fh->munmap (h, base, len);
return NULL; return NULL;
@ -1006,6 +1003,7 @@ mmap64 (void *addr, size_t len, int prot, int flags, int fd, _off64_t off)
list *map_list = NULL; list *map_list = NULL;
size_t orig_len = 0; size_t orig_len = 0;
caddr_t base = NULL; caddr_t base = NULL;
struct __stat64 st;
DWORD pagesize = getpagesize (); DWORD pagesize = getpagesize ();
DWORD checkpagesize; DWORD checkpagesize;
@ -1130,9 +1128,12 @@ mmap64 (void *addr, size_t len, int prot, int flags, int fd, _off64_t off)
} }
} }
DWORD high; if (fh->fstat (&st))
DWORD low = GetFileSize (fh->get_handle (), &high); {
_off64_t fsiz = ((_off64_t)high << 32) + low; __seterrno ();
goto out;
}
_off64_t fsiz = st.st_size;
/* Don't allow file mappings beginning beyond EOF since Windows can't /* Don't allow file mappings beginning beyond EOF since Windows can't
handle that POSIX like, unless MAP_AUTOGROW flag is set, which handle that POSIX like, unless MAP_AUTOGROW flag is set, which
@ -1200,7 +1201,7 @@ go_ahead:
if (noreserve (flags) && (!anonymous (flags) || !priv (flags))) if (noreserve (flags) && (!anonymous (flags) || !priv (flags)))
flags &= ~MAP_NORESERVE; flags &= ~MAP_NORESERVE;
map_list = mmapped_areas.get_list_by_fd (fd); map_list = mmapped_areas.get_list_by_fd (fd, &st);
/* Test if an existing anonymous mapping can be recycled. */ /* Test if an existing anonymous mapping can be recycled. */
if (map_list && anonymous (flags)) if (map_list && anonymous (flags))
@ -1254,7 +1255,8 @@ go_ahead:
addr = newaddr; addr = newaddr;
} }
base = mmap_worker (fh, (caddr_t) addr, len, prot, flags, fd, off); base = mmap_worker (map_list, fh, (caddr_t) addr, len, prot, flags, fd, off,
&st);
if (!base) if (!base)
goto out; goto out;
@ -1286,8 +1288,8 @@ go_ahead:
prot |= __PROT_FILLER; prot |= __PROT_FILLER;
flags &= MAP_SHARED | MAP_PRIVATE; flags &= MAP_SHARED | MAP_PRIVATE;
flags |= MAP_ANONYMOUS | MAP_FIXED; flags |= MAP_ANONYMOUS | MAP_FIXED;
at_base = mmap_worker (&fh_anonymous, at_base, valid_page_len, at_base = mmap_worker (NULL, &fh_anonymous, at_base,
prot, flags, -1, 0); valid_page_len, prot, flags, -1, 0, NULL);
if (!at_base) if (!at_base)
{ {
fh->munmap (fh->get_handle (), base, len); fh->munmap (fh->get_handle (), base, len);
@ -1300,8 +1302,8 @@ go_ahead:
{ {
prot = PROT_READ | PROT_WRITE | __PROT_ATTACH; prot = PROT_READ | PROT_WRITE | __PROT_ATTACH;
flags = MAP_ANONYMOUS | MAP_NORESERVE | MAP_FIXED; flags = MAP_ANONYMOUS | MAP_NORESERVE | MAP_FIXED;
at_base = mmap_worker (&fh_anonymous, at_base, sigbus_page_len, at_base = mmap_worker (NULL, &fh_anonymous, at_base,
prot, flags, -1, 0); sigbus_page_len, prot, flags, -1, 0, NULL);
if (!at_base) if (!at_base)
debug_printf ("Warning: Mapping beyond EOF failed, %E"); debug_printf ("Warning: Mapping beyond EOF failed, %E");
} }