* 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:
		| @@ -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", | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user