]> sourceware.org Git - newlib-cygwin.git/commitdiff
forkables: Keep hardlinks disabled via shared mem.
authorMichael Haubenwallner <michael.haubenwallner@ssi-schaefer.com>
Wed, 7 Dec 2016 10:58:29 +0000 (11:58 +0100)
committerCorinna Vinschen <corinna@vinschen.de>
Thu, 7 Feb 2019 14:58:02 +0000 (15:58 +0100)
To avoid the need for each process to check the filesystem to detect
that hardlink creation is impossible or disabled, cache this fact in
shared memory.  Removing cygfork directory while in use does disable
hardlinks creation.  To (re-)enable hardlinks creation, the cygfork
directory has to exist before the first cygwin process does fork.

* forkable.cc (dll_list::forkable_ntnamesize): Short cut
forkables needs to impossible when disabled via shared memory.
(dll_list::update_forkables_needs): When detecting hardlink
creation as impossible (not on NTFS) while still (we are the
first one checking) enabled via shared memory, disable the
shared memory value.
(dll_list::request_forkables): Disable the shared memory value
when hardlinks creation became disabled, that is when the
cygfork directory was removed.
* include/cygwin/version.h: Bump CYGWIN_VERSION_SHARED_DATA 6.
* shared_info.h (struct shared_info): Add member
prefer_forkable_hardlinks.  Update CURR_SHARED_MAGIC.
* shared.cc (shared_info::initialize): Initialize
prefer_forkable_hardlinks to 1 (Yes).

winsup/cygwin/forkable.cc
winsup/cygwin/include/cygwin/version.h
winsup/cygwin/shared_info.h

index cc28f9f4fcddc03f1249fa2f82655873f55980ae..da45643ae121f70e6376676e2652a866eaa2f525 100644 (file)
@@ -522,6 +522,11 @@ dll::create_forkable ()
 size_t
 dll_list::forkable_ntnamesize (dll_type type, PCWCHAR fullntname, PCWCHAR modname)
 {
+  /* per process, this is the first forkables-method ever called */
+  if (forkables_needs == forkables_unknown &&
+      !cygwin_shared->prefer_forkable_hardlinks)
+      forkables_needs = forkables_impossible; /* short cut */
+
   if (forkables_needs == forkables_impossible)
     return 0;
 
@@ -667,6 +672,7 @@ dll_list::update_forkables_needs ()
        {
          debug_printf ("impossible, not on NTFS %W", fn.Buffer);
          forkables_needs = forkables_impossible;
+         cygwin_shared->prefer_forkable_hardlinks = 0;
        }
     }
 
@@ -1056,6 +1062,13 @@ dll_list::request_forkables ()
 
   set_forkables_inheritance (true);
 
+  if (forkables_needs == forkables_disabled)
+    {
+      /* we do not support (re-)enabling on the fly */
+      forkables_needs = forkables_impossible;
+      cygwin_shared->prefer_forkable_hardlinks = 0;
+    }
+
   if (forkables_needs <= forkables_needless)
     return;
 
index 8926d49aecc74620c4fca78c2507a5a2dd806142..f7ed351d3c1227f58737ca8f990e14859e976194 100644 (file)
@@ -518,7 +518,7 @@ details. */
    regions.  It is incremented when incompatible changes are made to the shared
    memory region *or* to any named shared mutexes, semaphores, etc. */
 
-#define CYGWIN_VERSION_SHARED_DATA 5
+#define CYGWIN_VERSION_SHARED_DATA 6
 
 /* An identifier used in the names used to create shared objects.  The full
    names include the CYGWIN_VERSION_SHARED_DATA version as well as this
index 1a5648b240349e9fd9d8d8bde0d291abb2514667..8f0954f50144780974027e812cf4a36c579d4f27 100644 (file)
@@ -33,7 +33,7 @@ public:
 /* Data accessible to all tasks */
 
 
-#define CURR_SHARED_MAGIC 0x6758de88U
+#define CURR_SHARED_MAGIC 0x3a6025edU
 
 #define USER_VERSION   1
 
@@ -51,6 +51,7 @@ class shared_info
   mtinfo mt;
   loadavginfo loadavg;
   LONG pid_src;
+  char prefer_forkable_hardlinks; /* single byte access always is atomic */
 
   void initialize ();
   void init_obcaseinsensitive ();
This page took 0.034773 seconds and 5 git commands to generate.