* mmap.cc: Move fh_paging_file from some functions to be
a global static variable. (class mmap_record): Add `devtype_' member to remember the device type of the file. Add declaration for methods `get_device', `alloc_fh' and `free_fh'. (mmap_record::mmap_record): Initialize `devtype_' correctly. (mmap_record::alloc_fh): New method. (mmap_record::free_fh): Ditto. (munmap): Use new mmap_record::alloc_fh and mmap_record::free_fh methods to create a correct fhandler. (msync): Ditto. (fixup_mmaps_after_fork): Ditto.
This commit is contained in:
parent
881afbda5a
commit
7ade56ca6a
|
@ -1,3 +1,18 @@
|
||||||
|
Mon Apr 16 19:19:00 2001 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* mmap.cc: Move fh_paging_file from some functions to be
|
||||||
|
a global static variable.
|
||||||
|
(class mmap_record): Add `devtype_' member to remember
|
||||||
|
the device type of the file. Add declaration for methods
|
||||||
|
`get_device', `alloc_fh' and `free_fh'.
|
||||||
|
(mmap_record::mmap_record): Initialize `devtype_' correctly.
|
||||||
|
(mmap_record::alloc_fh): New method.
|
||||||
|
(mmap_record::free_fh): Ditto.
|
||||||
|
(munmap): Use new mmap_record::alloc_fh and mmap_record::free_fh
|
||||||
|
methods to create a correct fhandler.
|
||||||
|
(msync): Ditto.
|
||||||
|
(fixup_mmaps_after_fork): Ditto.
|
||||||
|
|
||||||
Mon Apr 16 16:01:00 2001 Corinna Vinschen <corinna@vinschen.de>
|
Mon Apr 16 16:01:00 2001 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* grp.cc (getgroups): If `allow_ntsec' is set, use the process token
|
* grp.cc (getgroups): If `allow_ntsec' is set, use the process token
|
||||||
|
|
|
@ -17,6 +17,7 @@ details. */
|
||||||
#include "fhandler.h"
|
#include "fhandler.h"
|
||||||
#include "dtable.h"
|
#include "dtable.h"
|
||||||
#include "cygerrno.h"
|
#include "cygerrno.h"
|
||||||
|
#include "cygheap.h"
|
||||||
#include "sync.h"
|
#include "sync.h"
|
||||||
#include "sigproc.h"
|
#include "sigproc.h"
|
||||||
#include "pinfo.h"
|
#include "pinfo.h"
|
||||||
|
@ -42,6 +43,7 @@ class mmap_record
|
||||||
private:
|
private:
|
||||||
int fdesc_;
|
int fdesc_;
|
||||||
HANDLE mapping_handle_;
|
HANDLE mapping_handle_;
|
||||||
|
int devtype_;
|
||||||
DWORD access_mode_;
|
DWORD access_mode_;
|
||||||
DWORD offset_;
|
DWORD offset_;
|
||||||
DWORD size_to_map_;
|
DWORD size_to_map_;
|
||||||
|
@ -50,14 +52,25 @@ class mmap_record
|
||||||
|
|
||||||
public:
|
public:
|
||||||
mmap_record (int fd, HANDLE h, DWORD ac, DWORD o, DWORD s, caddr_t b) :
|
mmap_record (int fd, HANDLE h, DWORD ac, DWORD o, DWORD s, caddr_t b) :
|
||||||
fdesc_ (fd), mapping_handle_ (h), access_mode_ (ac), offset_ (o),
|
fdesc_ (fd),
|
||||||
size_to_map_ (s), base_address_ (b) , map_map_ (NULL) { ; }
|
mapping_handle_ (h),
|
||||||
|
devtype_ (0),
|
||||||
|
access_mode_ (ac),
|
||||||
|
offset_ (o),
|
||||||
|
size_to_map_ (s),
|
||||||
|
base_address_ (b),
|
||||||
|
map_map_ (NULL)
|
||||||
|
{
|
||||||
|
if (fd >= 0 && !fdtab.not_open (fd))
|
||||||
|
devtype_ = fdtab[fd]->get_device ();
|
||||||
|
}
|
||||||
|
|
||||||
/* Default Copy constructor/operator=/destructor are ok */
|
/* Default Copy constructor/operator=/destructor are ok */
|
||||||
|
|
||||||
/* Simple accessors */
|
/* Simple accessors */
|
||||||
int get_fd () const { return fdesc_; }
|
int get_fd () const { return fdesc_; }
|
||||||
HANDLE get_handle () const { return mapping_handle_; }
|
HANDLE get_handle () const { return mapping_handle_; }
|
||||||
|
DWORD get_device () const { return devtype_; }
|
||||||
DWORD get_access () const { return access_mode_; }
|
DWORD get_access () const { return access_mode_; }
|
||||||
DWORD get_offset () const { return offset_; }
|
DWORD get_offset () const { return offset_; }
|
||||||
DWORD get_size () const { return size_to_map_; }
|
DWORD get_size () const { return size_to_map_; }
|
||||||
|
@ -83,6 +96,9 @@ class mmap_record
|
||||||
DWORD map_map (DWORD off, DWORD len);
|
DWORD map_map (DWORD off, DWORD len);
|
||||||
BOOL unmap_map (caddr_t addr, DWORD len);
|
BOOL unmap_map (caddr_t addr, DWORD len);
|
||||||
void fixup_map (void);
|
void fixup_map (void);
|
||||||
|
|
||||||
|
fhandler_base *alloc_fh ();
|
||||||
|
void free_fh (fhandler_base *fh);
|
||||||
};
|
};
|
||||||
|
|
||||||
DWORD
|
DWORD
|
||||||
|
@ -199,6 +215,32 @@ mmap_record::fixup_map ()
|
||||||
&old_prot);
|
&old_prot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static fhandler_disk_file fh_paging_file (NULL);
|
||||||
|
|
||||||
|
fhandler_base *
|
||||||
|
mmap_record::alloc_fh ()
|
||||||
|
{
|
||||||
|
if (get_fd () == -1)
|
||||||
|
{
|
||||||
|
fh_paging_file.set_io_handle (INVALID_HANDLE_VALUE);
|
||||||
|
return &fh_paging_file;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The file descriptor could have been closed or, even
|
||||||
|
worse, could have been reused for another file before
|
||||||
|
the call to fork(). This requires creating a fhandler
|
||||||
|
of the correct type to be sure to call the method of the
|
||||||
|
correct class. */
|
||||||
|
return fdtab.build_fhandler (-1, get_device (), "", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mmap_record::free_fh (fhandler_base *fh)
|
||||||
|
{
|
||||||
|
if (get_fd () != -1)
|
||||||
|
cfree (fh);
|
||||||
|
}
|
||||||
|
|
||||||
class list {
|
class list {
|
||||||
public:
|
public:
|
||||||
mmap_record *recs;
|
mmap_record *recs;
|
||||||
|
@ -422,7 +464,6 @@ mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t off)
|
||||||
DWORD gran_off = off & ~(granularity - 1);
|
DWORD gran_off = off & ~(granularity - 1);
|
||||||
DWORD gran_len = howmany (len, granularity) * granularity;
|
DWORD gran_len = howmany (len, granularity) * granularity;
|
||||||
|
|
||||||
fhandler_disk_file fh_paging_file (NULL);
|
|
||||||
fhandler_base *fh = NULL;
|
fhandler_base *fh = NULL;
|
||||||
caddr_t base = addr;
|
caddr_t base = addr;
|
||||||
HANDLE h;
|
HANDLE h;
|
||||||
|
@ -548,27 +589,17 @@ munmap (caddr_t addr, size_t len)
|
||||||
for (int it = 0; it < mmapped_areas->nlists; ++it)
|
for (int it = 0; it < mmapped_areas->nlists; ++it)
|
||||||
{
|
{
|
||||||
list *l = mmapped_areas->lists[it];
|
list *l = mmapped_areas->lists[it];
|
||||||
if (l != 0)
|
if (l)
|
||||||
{
|
{
|
||||||
int fd = l->fd;
|
|
||||||
fhandler_disk_file fh_paging_file (NULL);
|
|
||||||
fhandler_base *fh;
|
|
||||||
|
|
||||||
if (fd == -1 || fdtab.not_open (fd))
|
|
||||||
{
|
|
||||||
fh_paging_file.set_io_handle (INVALID_HANDLE_VALUE);
|
|
||||||
fh = &fh_paging_file;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
fh = fdtab[fd];
|
|
||||||
|
|
||||||
off_t li = -1;
|
off_t li = -1;
|
||||||
if ((li = l->match(addr, len, li)) >= 0)
|
if ((li = l->match(addr, len, li)) >= 0)
|
||||||
{
|
{
|
||||||
mmap_record *rec = l->recs + li;
|
mmap_record *rec = l->recs + li;
|
||||||
if (rec->unmap_map (addr, len))
|
if (rec->unmap_map (addr, len))
|
||||||
{
|
{
|
||||||
|
fhandler_base *fh = rec->alloc_fh ();
|
||||||
fh->munmap (rec->get_handle (), addr, len);
|
fh->munmap (rec->get_handle (), addr, len);
|
||||||
|
rec->free_fh (fh);
|
||||||
|
|
||||||
/* Delete the entry. */
|
/* Delete the entry. */
|
||||||
l->erase (li);
|
l->erase (li);
|
||||||
|
@ -623,24 +654,14 @@ msync (caddr_t addr, size_t len, int flags)
|
||||||
list *l = mmapped_areas->lists[it];
|
list *l = mmapped_areas->lists[it];
|
||||||
if (l != 0)
|
if (l != 0)
|
||||||
{
|
{
|
||||||
int fd = l->fd;
|
|
||||||
fhandler_disk_file fh_paging_file (NULL);
|
|
||||||
fhandler_base *fh;
|
|
||||||
|
|
||||||
if (fd == -1 || fdtab.not_open (fd))
|
|
||||||
{
|
|
||||||
fh_paging_file.set_io_handle (INVALID_HANDLE_VALUE);
|
|
||||||
fh = &fh_paging_file;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
fh = fdtab[fd];
|
|
||||||
|
|
||||||
for (int li = 0; li < l->nrecs; ++li)
|
for (int li = 0; li < l->nrecs; ++li)
|
||||||
{
|
{
|
||||||
mmap_record *rec = l->recs + li;
|
mmap_record *rec = l->recs + li;
|
||||||
if (rec->get_address () == addr)
|
if (rec->get_address () == addr)
|
||||||
{
|
{
|
||||||
|
fhandler_base *fh = rec->alloc_fh ();
|
||||||
int ret = fh->msync (rec->get_handle (), addr, len, flags);
|
int ret = fh->msync (rec->get_handle (), addr, len, flags);
|
||||||
|
rec->free_fh (fh);
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
syscall_printf ("%d = msync(): %E", ret);
|
syscall_printf ("%d = msync(): %E", ret);
|
||||||
|
@ -863,18 +884,14 @@ fixup_mmaps_after_fork ()
|
||||||
rec->get_fd (), rec->get_handle (), rec->get_access (),
|
rec->get_fd (), rec->get_handle (), rec->get_access (),
|
||||||
rec->get_offset (), rec->get_size (), rec->get_address ());
|
rec->get_offset (), rec->get_size (), rec->get_address ());
|
||||||
|
|
||||||
BOOL ret;
|
fhandler_base *fh = rec->alloc_fh ();
|
||||||
fhandler_disk_file fh_paging_file (NULL);
|
BOOL ret = fh->fixup_mmap_after_fork (rec->get_handle (),
|
||||||
fhandler_base *fh;
|
|
||||||
if (rec->get_fd () == -1) /* MAP_ANONYMOUS */
|
|
||||||
fh = &fh_paging_file;
|
|
||||||
else
|
|
||||||
fh = fdtab[rec->get_fd ()];
|
|
||||||
ret = fh->fixup_mmap_after_fork (rec->get_handle (),
|
|
||||||
rec->get_access (),
|
rec->get_access (),
|
||||||
rec->get_offset (),
|
rec->get_offset (),
|
||||||
rec->get_size (),
|
rec->get_size (),
|
||||||
rec->get_address ());
|
rec->get_address ());
|
||||||
|
rec->free_fh (fh);
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
{
|
{
|
||||||
system_printf ("base address fails to match requested address %p",
|
system_printf ("base address fails to match requested address %p",
|
||||||
|
|
Loading…
Reference in New Issue