Bruno Haible wrote:

The 'immutable' module, so far, worked only on platforms with mmap() and
mprotect(). With this patch, it also works on native Windows.
...

+  if (!CloseHandle (h))
+    {
+      UnmapViewOfFile (mem_w);
+      UnmapViewOfFile (mem_r);
+      CloseHandle (h);
+      return 0;
+    }
+# else
    /* Extend the file by size/pagesize pages.  */
    long new_file_length = file_length + size;
    if (ftruncate (file_fd, new_file_length) < 0)

These functions look really nice. I've yet to try them.

I noted FileZilla have similar code in 'aio.cpp', but with
handling of a macOS bug if that is something Gnulib should
handle too:

  #if FZ_MAC
    // There's a bug on macOS: ftruncate can only be called _once_ on a shared 
memory object.
    // The manpages do not cover this bug, only XNU's bsd/kern/posix_shm.c 
mentions it.
    struct stat s;
    if (fstat(shm, &s) != 0) {
      int err = errno;
      engine_.GetLogger().log(logmsg::debug_warning, "fstat failed with error 
%d", err);
      return false;
    }
    if (s.st_size < 0 || static_cast<size_t>(s.st_size) < memory_size_)
  #endif
  // .. then the rest is similar to yours.


Not sure if the "bug" is still there, but the
is code at:
  
https://svn.filezilla-project.org/filezilla/FileZilla3/trunk/src/engine/aio.cpp?view=markup#l84

--
--gv



Reply via email to