From fc9911a188ba2ab8cb0e78c2820c56a5be1d16b8 Mon Sep 17 00:00:00 2001 From: Michael Haubenwallner Date: Fri, 8 Feb 2019 15:38:56 +0100 Subject: [PATCH] Cygwin: forkables: update doc, add release notes --- winsup/cygwin/release/3.0 | 6 ++++++ winsup/doc/highlights.xml | 28 +++++++++++++++++----------- winsup/doc/new-features.xml | 7 +++++++ 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/winsup/cygwin/release/3.0 b/winsup/cygwin/release/3.0 index da0fe0961..da357558d 100644 --- a/winsup/cygwin/release/3.0 +++ b/winsup/cygwin/release/3.0 @@ -31,6 +31,12 @@ What's new: - New APIs: signalfd, timerfd_create, timerfd_gettime, timerfd_settime, timer_getoverrun. +- fork(2) now is able to recover from when an in-use executable/dll is + removed or replaced during process runtime. This feature is disabled by + default and limited to exes/dlls on the same NTFS partition as the Cygwin + installation. For more information and how to enable, please refer to + https://www.cygwin.com/cygwin-ug-net/highlights.html#ov-hi-process + What changed: ------------- diff --git a/winsup/doc/highlights.xml b/winsup/doc/highlights.xml index 25b227382..67e326cb4 100644 --- a/winsup/doc/highlights.xml +++ b/winsup/doc/highlights.xml @@ -202,21 +202,27 @@ While Windows does not allow to remove binaries in use from the file system, they still can be renamed or moved into the recycle bin, as outlined for unlink(2) in . To allow an existing process to fork, the original binary files need to be -available via their original file names, but they may reside in -different directories when using the DotLocal (.local) Dll Redirection feature. Since NTFS does support hardlinks, when the fork fails we try again, but create a private directory containing hardlinks to the original files as -well as the .local file now. The private directory for the hardlinks is -/var/run/cygfork/, which you have to create manually for now if you need to -protect fork against exe- and dll- updates on your Cygwin instance. As -hardlinks cannot be used across multiple NTFS file systems, please make sure -your exe- and dll- replacing operations operate on the same single NTFS file -system as your Cygwin instance and the /var/run/cygfork/ directory. - -We create one directory per user, application and application age, -and remove it when no more processes use that directory. To indicate +well as the .local file now. The base directory for the +private hardlink directory is /var/run/cygfork/, which +you have to create manually for now if you need to protect fork against +updates to executables and dlls on your Cygwin instance. As hardlinks +cannot be used across multiple NTFS file systems, please make sure your +executable and dll replacing operations operate on the same single NTFS file +system as your Cygwin instance and the /var/run/cygfork/ +directory. Note that this private hardlink directory also does help for +when a wrong dll is found in the parent process' current working directory. +To enable creating the hardlinks, you need to stop all currently running +Cygwin processes after creating this directory, once per Cygwin installation: +$ mkdir --mode=a=rwxt /var/run/cygfork + +We create one hardlink directory per user, application and application +age, and remove it when no more processes use that directory. To indicate whether a directory still is in use, we define a mutex name similar to the directory name. As mutexes are destroyed when no process holds a handle open any more, we can clean up even after power loss or similar: diff --git a/winsup/doc/new-features.xml b/winsup/doc/new-features.xml index 6801e3eeb..8fc0ac6fe 100644 --- a/winsup/doc/new-features.xml +++ b/winsup/doc/new-features.xml @@ -107,6 +107,13 @@ Native Windows processes not started by Cygwin processes are mapped into the range beyond 65535. + +fork(2) now is able to recover from when an in-use executable/dll is +removed or replaced during process runtime. This feature is disabled by +default and limited to exes/dlls on the same NTFS partition as the Cygwin +installation. For more information and how to enable, please refer to +. + -- 2.17.0