diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2001-09-27 22:39:50 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2001-09-27 22:39:50 +0000 |
commit | f4f30cf14087c45ace30dd5bc2dfeabb1a983001 (patch) | |
tree | 9a9ab128c7c860ed1105946e8cdc2b3db1838700 /winsup/cygwin/mmap.cc | |
parent | c814d12f043b9e8d24f73d2b8f692087f74bd607 (diff) | |
download | cygnal-f4f30cf14087c45ace30dd5bc2dfeabb1a983001.tar.gz cygnal-f4f30cf14087c45ace30dd5bc2dfeabb1a983001.tar.bz2 cygnal-f4f30cf14087c45ace30dd5bc2dfeabb1a983001.zip |
* mmap.cc (mmap): Move setting the access after evaluating fd.
Remove useless comment. Explain copy-on-write problem of 9x
more detailed. Don't set access to FILE_MAP_COPY on 9x only
when anonymous mapping is requested.
(fhandler_disk_file::mmap): Remove useless device check.
Add debug output.
Diffstat (limited to 'winsup/cygwin/mmap.cc')
-rw-r--r-- | winsup/cygwin/mmap.cc | 41 |
1 files changed, 17 insertions, 24 deletions
diff --git a/winsup/cygwin/mmap.cc b/winsup/cygwin/mmap.cc index 89ef69b27..4ebc017b1 100644 --- a/winsup/cygwin/mmap.cc +++ b/winsup/cygwin/mmap.cc @@ -422,30 +422,8 @@ mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t off) return MAP_FAILED; } - DWORD access = (prot & PROT_WRITE) ? FILE_MAP_WRITE : FILE_MAP_READ; - /* copy-on-write doesn't work correctly on 9x. To have at least read - access we use *READ mapping on 9x when appropriate. It will still - fail when needing write access, though. */ - if ((flags & MAP_PRIVATE) && (wincap.has_working_copy_on_write () - || (prot & ~PROT_READ))) - access = FILE_MAP_COPY; - SetResourceLock(LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap"); -#if 0 - /* Windows 95 does not have fixed addresses */ - /* - * CV: This assumption isn't correct. See Microsoft Platform SDK, Memory, - * description of call `MapViewOfFileEx'. - */ - if ((!wincap.is_winnt ()) && (flags & MAP_FIXED)) - { - set_errno (EINVAL); - syscall_printf ("-1 = mmap(): win95 and MAP_FIXED"); - return MAP_FAILED; - } -#endif - if (mmapped_areas == NULL) { /* First mmap call, create STL map */ @@ -516,6 +494,21 @@ mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t off) } } + DWORD access = (prot & PROT_WRITE) ? FILE_MAP_WRITE : FILE_MAP_READ; + /* copy-on-write doesn't work at all on 9x using anonymous maps. + Workaround: Anonymous mappings always use normal READ or WRITE + access and don't use named file mapping. + copy-on-write doesn't also work properly on 9x with real files. + While the changes are not propagated to the file, they are + visible to other processes sharing the same file mapping object. + Workaround: Don't use named file mapping. That should work since + sharing file mappings only works reliable using named + file mapping on 9x. + */ + if ((flags & MAP_PRIVATE) + && (wincap.has_working_copy_on_write () || fd != -1)) + access = FILE_MAP_COPY; + h = fh->mmap (&base, gran_len, access, flags, gran_off); if (h == INVALID_HANDLE_VALUE) @@ -748,7 +741,6 @@ fhandler_disk_file::mmap (caddr_t *addr, size_t len, DWORD access, objects between processes by name. What a mess... */ if (wincap.share_mmaps_only_by_name () && get_handle () != INVALID_HANDLE_VALUE - && get_device () == FH_DISK && !(access & FILE_MAP_COPY)) { /* Grrr, the whole stuff is just needed to try to get a reliable @@ -759,6 +751,7 @@ fhandler_disk_file::mmap (caddr_t *addr, size_t len, DWORD access, for (int i = strlen (namebuf) - 1; i >= 0; --i) namebuf[i] = cyg_tolower (namebuf [i]); + debug_printf ("named sharing"); if (!(h = OpenFileMapping (access, TRUE, namebuf))) h = CreateFileMapping (get_handle(), &sec_none, protect, 0, 0, namebuf); } @@ -775,7 +768,7 @@ fhandler_disk_file::mmap (caddr_t *addr, size_t len, DWORD access, void *base = MapViewOfFileEx (h, access, 0, off, len, (flags & MAP_FIXED) ? *addr : NULL); - + debug_printf ("%x = MapViewOfFileEx (h:%x, access:%x, 0, off:%d, len:%d, addr:%x)", base, h, access, off, len, (flags & MAP_FIXED) ? *addr : NULL); if (!base || ((flags & MAP_FIXED) && base != *addr)) { if (!base) |