diff --git a/winsup/cygwin/forkable.cc b/winsup/cygwin/forkable.cc index cc28f9f4f..da45643ae 100644 --- a/winsup/cygwin/forkable.cc +++ b/winsup/cygwin/forkable.cc @@ -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; diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h index 8926d49ae..f7ed351d3 100644 --- a/winsup/cygwin/include/cygwin/version.h +++ b/winsup/cygwin/include/cygwin/version.h @@ -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 diff --git a/winsup/cygwin/shared_info.h b/winsup/cygwin/shared_info.h index 1a5648b24..8f0954f50 100644 --- a/winsup/cygwin/shared_info.h +++ b/winsup/cygwin/shared_info.h @@ -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 ();