Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package gap-io for openSUSE:Factory checked in at 2026-09-29 17:49:14 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gap-io (Old) and /work/SRC/openSUSE:Factory/.gap-io.new.383539 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gap-io" Tue Sep 29 17:49:14 2026 rev:9 rq:1381263 version:4.11.0 Changes: -------- --- /work/SRC/openSUSE:Factory/gap-io/gap-io.changes 2026-07-17 01:45:47.909938453 +0200 +++ /work/SRC/openSUSE:Factory/.gap-io.new.383539/gap-io.changes 2026-09-29 17:50:39.995428950 +0200 @@ -1,0 +2,15 @@ +Mon Sep 28 21:55:56 UTC 2026 - Jan Engelhardt <[email protected]> + +- Update to release 4.11.0 + * Reset blocked/ignored/caught termination signals around IO_fork + so that children can be stopped with SIGTERM etc. even when a + program embedding GAP (e.g. julia via GAP.jl) redirects signal + handling. + * Made IO_WaitPid return instead of looping forever when the + waited-for process is not an unreaped child. + * No longer installs a SIGCHLD handler in HPC-GAP or when GAP is + embedded in another program (e.g. julia via GAP.jl). Wait only + for the children created by IO_fork, by process id, so that the + host's own child process handling keeps working. + +------------------------------------------------------------------- Old: ---- io-4.10.0.tar.gz New: ---- io-4.11.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gap-io.spec ++++++ --- /var/tmp/diff_new_pack.CJpG43/_old 2026-09-29 17:50:40.823463527 +0200 +++ /var/tmp/diff_new_pack.CJpG43/_new 2026-09-29 17:50:40.827463694 +0200 @@ -17,7 +17,7 @@ Name: gap-io -Version: 4.10.0 +Version: 4.11.0 Release: 0 Summary: GAP: Bindings for low level C library IO License: GPL-3.0-or-later ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.CJpG43/_old 2026-09-29 17:50:40.876465740 +0200 +++ /var/tmp/diff_new_pack.CJpG43/_new 2026-09-29 17:50:40.879465865 +0200 @@ -1,5 +1,5 @@ -mtime: 1784221401 -commit: fc0b80f54370c481deb25878910723db420e4b0112ca88129997a575e81c1238 +mtime: 1790632598 +commit: 7e9e0ee5adf507d6fc8b0b5ce0bc304a28f7351dc7936870d7dd66b9d9c7efb1 url: https://src.opensuse.org/jengelh/gap-io revision: master ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2026-09-28 23:56:38.000000000 +0200 @@ -0,0 +1 @@ +.osc ++++++ io-4.10.0.tar.gz -> io-4.11.0.tar.gz ++++++ ++++ 1682 lines of diff (skipped) ++++ retrying with extended exclude list diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/CHANGES new/io-4.11.0/CHANGES --- old/io-4.10.0/CHANGES 2026-07-14 02:00:00.000000000 +0200 +++ new/io-4.11.0/CHANGES 2026-09-28 02:00:00.000000000 +0200 @@ -1,5 +1,19 @@ This file describes changes in the IO package. +4.11.0 (2026-09-28) + - Build on native Windows (mingw); functions without a Windows + equivalent, including sockets, remain unavailable there + - Reset blocked/ignored/caught termination signals around IO_fork so that + children can be stopped with SIGTERM etc. even when a program embedding + GAP (e.g. julia via GAP.jl) redirects signal handling + - Make IO_WaitPid return instead of looping forever when the waited-for + process is not an unreaped child + - Do not install a SIGCHLD handler in HPC-GAP or when GAP is embedded in + another program (e.g. julia via GAP.jl); wait only for the children + created by IO_fork, by process id, so that the host's own child + process handling keeps working (resolves issue #5) + - Implement IO_gethostname on Windows + 4.10.0 (2026-07-14) - Handle chunked HTTP responses without waiting for the server to close the connection @@ -224,7 +238,7 @@ - Pickling/Unpickling of finite fields - Set Host component of HTTP request header by default of the name of the server argument in SingleHTTPRequest. - - Alexander Konovalov's CheckForUpdates function. + - Olexandr Konovalov's CheckForUpdates function. - Released revision 289 as 2.1: 26.2.2007 2.0 (2006-12-12) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/PackageInfo.g new/io-4.11.0/PackageInfo.g --- old/io-4.10.0/PackageInfo.g 2026-07-14 02:00:00.000000000 +0200 +++ new/io-4.11.0/PackageInfo.g 2026-09-28 02:00:00.000000000 +0200 @@ -7,8 +7,8 @@ PackageName := "IO", Subtitle := "Bindings for low level C library I/O routines", -Version := "4.10.0", -Date := "14/07/2026", # dd/mm/yyyy format +Version := "4.11.0", +Date := "28/09/2026", # dd/mm/yyyy format License := "GPL-3.0-or-later", ## Information about authors and maintainers. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/TODO new/io-4.11.0/TODO --- old/io-4.10.0/TODO 2026-07-14 02:00:00.000000000 +0200 +++ new/io-4.11.0/TODO 2026-09-28 02:00:00.000000000 +0200 @@ -26,7 +26,7 @@ (ev. nur bei "chunked access"???) --> www.tagesschau.de z.B. -HTTP/1.1-Konformitaet -> Alexander Konovalovs Tests mit Online int seq site +HTTP/1.1-Konformitaet -> Olexandr Konovalov's Tests mit Online int seq site chunked transfer Web-Proxy??? diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/configure.ac new/io-4.11.0/configure.ac --- old/io-4.10.0/configure.ac 2026-07-14 02:00:00.000000000 +0200 +++ new/io-4.11.0/configure.ac 2026-09-28 02:00:00.000000000 +0200 @@ -27,6 +27,8 @@ unistd.h ]) +AC_CHECK_MEMBERS([struct stat.st_blksize, struct stat.st_blocks]) + # Checks for library functions. AC_FUNC_FORK AC_CHECK_FUNCS_ONCE([ @@ -38,6 +40,7 @@ connect dup dup2 + fcntl fchmod fchown fstat @@ -64,8 +67,10 @@ mknod mkstemp opendir + pipe readdir readlink + realpath recv recvfrom rename diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/doc/IO.tex new/io-4.11.0/doc/IO.tex --- old/io-4.10.0/doc/IO.tex 2026-07-14 02:00:00.000000000 +0200 +++ new/io-4.11.0/doc/IO.tex 2026-09-28 02:00:00.000000000 +0200 @@ -100,8 +100,8 @@ \mbox{}}}\\ \vfill -{\Huge 4.10.0 \mbox{}}\\[1cm] -{ 14 July 2026 \mbox{}}\\[1cm] +{\Huge 4.11.0 \mbox{}}\\[1cm] +{ 28 September 2026 \mbox{}}\\[1cm] \mbox{}\\[2cm] {\Large \textbf{\strut Max Neunh{\"o}ffer \strut\mbox{}}}\\ \hypersetup{pdfauthor={ Max Neunh{\"o}ffer }} @@ -547,7 +547,11 @@ - Forks off a child process, which is an identical copy. For details see ``\texttt{man 2 fork}''. Note that \texttt{IO{\textunderscore}fork} activates our SIGCHLD handler (see \texttt{IO{\textunderscore}InstallSIGCHLDHandler} (\ref{IOuScoreInstallSIGCHLDHandler})). Note that you must use the \texttt{IO{\textunderscore}WaitPid} (\ref{IOuScoreWaitPid}) function to wait or check for the termination of child processes, or call \texttt{IO{\textunderscore}IgnorePid} (\ref{IOuScoreIgnorePid}) to ignore the child. } + Forks off a child process, which is an identical copy. For details see ``\texttt{man 2 fork}''. Note that \texttt{IO{\textunderscore}fork} activates our SIGCHLD handler (see \texttt{IO{\textunderscore}InstallSIGCHLDHandler} (\ref{IOuScoreInstallSIGCHLDHandler})). Note that you must use the \texttt{IO{\textunderscore}WaitPid} (\ref{IOuScoreWaitPid}) function to wait or check for the termination of child processes, or call \texttt{IO{\textunderscore}IgnorePid} (\ref{IOuScoreIgnorePid}) to ignore the child. + + The child starts with the signal mask and the dispositions of the termination +signals (SIGHUP, SIGINT, SIGQUIT, SIGALRM, SIGTERM) reset to their defaults, +even if the process embedding \textsf{GAP} had blocked or ignored them, so that it can be stopped with \texttt{IO{\textunderscore}kill} (\ref{IOuScorekill}). } @@ -1360,7 +1364,11 @@ calling it twice does exactly the same as calling it once. It returns \texttt{true} when it is called for the first time since then a pointer to the old signal handler is stored in a global variable. This function is automatically called by any function which creates new processes, so never needs to be called -unless the handler was explictly disabled with \texttt{IO{\textunderscore}RestoreSIGCHLDHandler} (\ref{IOuScoreRestoreSIGCHLDHandler}) See \texttt{IO{\textunderscore}fork} (\ref{IOuScorefork}). } +unless the handler was explictly disabled with \texttt{IO{\textunderscore}RestoreSIGCHLDHandler} (\ref{IOuScoreRestoreSIGCHLDHandler}) See \texttt{IO{\textunderscore}fork} (\ref{IOuScorefork}). + + In HPC\texttt{\symbol{45}}GAP, and when \textsf{GAP} is used as a library inside another program (such as Julia via GAP.jl), no +SIGCHLD handler is installed at all, and this function returns \texttt{false}: the host manages child processes itself, and \textsf{IO} only ever waits for the children it created, by process id. All functions +described here behave the same in both modes. } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/doc/_entities.xml new/io-4.11.0/doc/_entities.xml --- old/io-4.10.0/doc/_entities.xml 2026-07-14 02:00:00.000000000 +0200 +++ new/io-4.11.0/doc/_entities.xml 2026-09-28 02:00:00.000000000 +0200 @@ -1,4 +1,4 @@ <!ENTITY IO '<Package>IO</Package>'> -<!ENTITY RELEASEDATE '14 July 2026'> +<!ENTITY RELEASEDATE '28 September 2026'> <!ENTITY RELEASEYEAR '2026'> -<!ENTITY VERSION '4.10.0'> +<!ENTITY VERSION '4.11.0'> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/doc/chap0.html new/io-4.11.0/doc/chap0.html --- old/io-4.10.0/doc/chap0.html 2026-07-14 02:00:00.000000000 +0200 +++ new/io-4.11.0/doc/chap0.html 2026-09-28 02:00:00.000000000 +0200 @@ -29,10 +29,10 @@ <h2>Bindings for low level C library I/O routines</h2> <p> - 4.10.0</p> + 4.11.0</p> <p> - 14 July 2026 + 28 September 2026 </p> </div> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/doc/chap0.txt new/io-4.11.0/doc/chap0.txt --- old/io-4.10.0/doc/chap0.txt 2026-07-14 02:00:00.000000000 +0200 +++ new/io-4.11.0/doc/chap0.txt 2026-09-28 02:00:00.000000000 +0200 @@ -6,10 +6,10 @@ [1X Bindings for low level C library I/O routines [101X - 4.10.0 + 4.11.0 - 14 July 2026 + 28 September 2026 Max Neunhöffer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/doc/chap0_mj.html new/io-4.11.0/doc/chap0_mj.html --- old/io-4.10.0/doc/chap0_mj.html 2026-07-14 02:00:00.000000000 +0200 +++ new/io-4.11.0/doc/chap0_mj.html 2026-09-28 02:00:00.000000000 +0200 @@ -32,10 +32,10 @@ <h2>Bindings for low level C library I/O routines</h2> <p> - 4.10.0</p> + 4.11.0</p> <p> - 14 July 2026 + 28 September 2026 </p> </div> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/doc/chap3.html new/io-4.11.0/doc/chap3.html --- old/io-4.10.0/doc/chap3.html 2026-07-14 02:00:00.000000000 +0200 +++ new/io-4.11.0/doc/chap3.html 2026-09-28 02:00:00.000000000 +0200 @@ -328,6 +328,8 @@ <p>Forks off a child process, which is an identical copy. For details see <q><code class="code">man 2 fork</code></q>. Note that <code class="func">IO_fork</code> activates our SIGCHLD handler (see <code class="func">IO_InstallSIGCHLDHandler</code> (<a href="chap3.html#X8383E62D86BE30C6"><span class="RefLink">3.3-3</span></a>)). Note that you must use the <code class="func">IO_WaitPid</code> (<a href="chap3.html#X80737A008450184F"><span class="RefLink">3.2-66</span></a>) function to wait or check for the termination of child processes, or call <code class="func">IO_IgnorePid</code> (<a href="chap3.html#X84295FC77CCB1066"><span class="RefLink">3.2-67</span></a>) to ignore the child.</p> +<p>The child starts with the signal mask and the dispositions of the termination signals (SIGHUP, SIGINT, SIGQUIT, SIGALRM, SIGTERM) reset to their defaults, even if the process embedding <strong class="pkg">GAP</strong> had blocked or ignored them, so that it can be stopped with <code class="func">IO_kill</code> (<a href="chap3.html#X7D0439128512FBF6"><span class="RefLink">3.2-31</span></a>).</p> + <p><a id="X7E27748983EC7B5C" name="X7E27748983EC7B5C"></a></p> <h5>3.2-20 IO_fstat</h5> @@ -806,6 +808,8 @@ <p>Installs our SIGCHLD handler. This functions works as an idempotent. That is, calling it twice does exactly the same as calling it once. It returns <code class="keyw">true</code> when it is called for the first time since then a pointer to the old signal handler is stored in a global variable. This function is automatically called by any function which creates new processes, so never needs to be called unless the handler was explictly disabled with <code class="func">IO_RestoreSIGCHLDHandler</code> (<a href="chap3.html#X7EEB7471816B64DF"><span class="RefLink">3.3-4</span></a>) See <code class="func">IO_fork</code> (<a href="chap3.html#X86C819F37D07ECF7"><span class="RefLink">3.2-19</span></a>).</p> +<p>In HPC-GAP, and when <strong class="pkg">GAP</strong> is used as a library inside another program (such as Julia via GAP.jl), no SIGCHLD handler is installed at all, and this function returns <code class="keyw">false</code>: the host manages child processes itself, and <strong class="pkg">IO</strong> only ever waits for the children it created, by process id. All functions described here behave the same in both modes.</p> + <p><a id="X7EEB7471816B64DF" name="X7EEB7471816B64DF"></a></p> <h5>3.3-4 IO_RestoreSIGCHLDHandler</h5> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/doc/chap3.txt new/io-4.11.0/doc/chap3.txt --- old/io-4.10.0/doc/chap3.txt 2026-07-14 02:00:00.000000000 +0200 +++ new/io-4.11.0/doc/chap3.txt 2026-09-28 02:00:00.000000000 +0200 @@ -254,6 +254,11 @@ ([14X3.2-66[114X) function to wait or check for the termination of child processes, or call [2XIO_IgnorePid[102X ([14X3.2-67[114X) to ignore the child.[133X + [33X[0;0YThe child starts with the signal mask and the dispositions of the + termination signals (SIGHUP, SIGINT, SIGQUIT, SIGALRM, SIGTERM) reset to + their defaults, even if the process embedding [5XGAP[105X had blocked or ignored + them, so that it can be stopped with [2XIO_kill[102X ([14X3.2-31[114X).[133X + [1X3.2-20 IO_fstat[101X [33X[1;0Y[29X[2XIO_fstat[102X( [3Xfd[103X ) [32X function[133X @@ -719,6 +724,12 @@ needs to be called unless the handler was explictly disabled with [2XIO_RestoreSIGCHLDHandler[102X ([14X3.3-4[114X) See [2XIO_fork[102X ([14X3.2-19[114X).[133X + [33X[0;0YIn HPC-GAP, and when [5XGAP[105X is used as a library inside another program (such + as Julia via GAP.jl), no SIGCHLD handler is installed at all, and this + function returns [9Xfalse[109X: the host manages child processes itself, and [5XIO[105X only + ever waits for the children it created, by process id. All functions + described here behave the same in both modes.[133X + [1X3.3-4 IO_RestoreSIGCHLDHandler[101X [33X[1;0Y[29X[2XIO_RestoreSIGCHLDHandler[102X( ) [32X function[133X diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/doc/chap3_mj.html new/io-4.11.0/doc/chap3_mj.html --- old/io-4.10.0/doc/chap3_mj.html 2026-07-14 02:00:00.000000000 +0200 +++ new/io-4.11.0/doc/chap3_mj.html 2026-09-28 02:00:00.000000000 +0200 @@ -331,6 +331,8 @@ <p>Forks off a child process, which is an identical copy. For details see <q><code class="code">man 2 fork</code></q>. Note that <code class="func">IO_fork</code> activates our SIGCHLD handler (see <code class="func">IO_InstallSIGCHLDHandler</code> (<a href="chap3_mj.html#X8383E62D86BE30C6"><span class="RefLink">3.3-3</span></a>)). Note that you must use the <code class="func">IO_WaitPid</code> (<a href="chap3_mj.html#X80737A008450184F"><span class="RefLink">3.2-66</span></a>) function to wait or check for the termination of child processes, or call <code class="func">IO_IgnorePid</code> (<a href="chap3_mj.html#X84295FC77CCB1066"><span class="RefLink">3.2-67</span></a>) to ignore the child.</p> +<p>The child starts with the signal mask and the dispositions of the termination signals (SIGHUP, SIGINT, SIGQUIT, SIGALRM, SIGTERM) reset to their defaults, even if the process embedding <strong class="pkg">GAP</strong> had blocked or ignored them, so that it can be stopped with <code class="func">IO_kill</code> (<a href="chap3_mj.html#X7D0439128512FBF6"><span class="RefLink">3.2-31</span></a>).</p> + <p><a id="X7E27748983EC7B5C" name="X7E27748983EC7B5C"></a></p> <h5>3.2-20 IO_fstat</h5> @@ -809,6 +811,8 @@ <p>Installs our SIGCHLD handler. This functions works as an idempotent. That is, calling it twice does exactly the same as calling it once. It returns <code class="keyw">true</code> when it is called for the first time since then a pointer to the old signal handler is stored in a global variable. This function is automatically called by any function which creates new processes, so never needs to be called unless the handler was explictly disabled with <code class="func">IO_RestoreSIGCHLDHandler</code> (<a href="chap3_mj.html#X7EEB7471816B64DF"><span class="RefLink">3.3-4</span></a>) See <code class="func">IO_fork</code> (<a href="chap3_mj.html#X86C819F37D07ECF7"><span class="RefLink">3.2-19</span></a>).</p> +<p>In HPC-GAP, and when <strong class="pkg">GAP</strong> is used as a library inside another program (such as Julia via GAP.jl), no SIGCHLD handler is installed at all, and this function returns <code class="keyw">false</code>: the host manages child processes itself, and <strong class="pkg">IO</strong> only ever waits for the children it created, by process id. All functions described here behave the same in both modes.</p> + <p><a id="X7EEB7471816B64DF" name="X7EEB7471816B64DF"></a></p> <h5>3.3-4 IO_RestoreSIGCHLDHandler</h5> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/doc/main.xml new/io-4.11.0/doc/main.xml --- old/io-4.10.0/doc/main.xml 2026-07-14 02:00:00.000000000 +0200 +++ new/io-4.11.0/doc/main.xml 2026-09-28 02:00:00.000000000 +0200 @@ -479,7 +479,12 @@ Note that <Ref Func="IO_fork"/> activates our SIGCHLD handler (see <Ref Func="IO_InstallSIGCHLDHandler"/>). Note that you must use the <Ref Func="IO_WaitPid"/> function to wait or check for the termination of -child processes, or call <Ref Func="IO_IgnorePid"/> to ignore the child. +child processes, or call <Ref Func="IO_IgnorePid"/> to ignore the child. +<P/> +The child starts with the signal mask and the dispositions of the +termination signals (SIGHUP, SIGINT, SIGQUIT, SIGALRM, SIGTERM) reset to +their defaults, even if the process embedding &GAP; had blocked or ignored +them, so that it can be stopped with <Ref Func="IO_kill"/>. </Description> </ManSection> @@ -1096,6 +1101,12 @@ so never needs to be called unless the handler was explictly disabled with <Ref Func="IO_RestoreSIGCHLDHandler"/> See <Ref Func="IO_fork"/>. +<P/> +In HPC-GAP, and when &GAP; is used as a library inside another program +(such as Julia via GAP.jl), no SIGCHLD handler is installed at all, and this +function returns <K>false</K>: the host manages child processes itself, and +<Package>IO</Package> only ever waits for the children it created, by process id. All +functions described here behave the same in both modes. </Description> </ManSection> Binary files old/io-4.10.0/doc/manual.pdf and new/io-4.11.0/doc/manual.pdf differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/doc/manual.six new/io-4.11.0/doc/manual.six --- old/io-4.10.0/doc/manual.six 2026-07-14 02:00:00.000000000 +0200 +++ new/io-4.11.0/doc/manual.six 2026-09-28 02:00:00.000000000 +0200 @@ -32,93 +32,93 @@ 1X", "3.2", [ 3, 2, 0 ], 95, 9, "the low-level functions in detail", "X800F9F3E810A7228" ], [ "\033[1X\033[33X\033[0;-2YFurther C level functions\033[133X\033[101X", - "3.3", [ 3, 3, 0 ], 684, 20, "further c level functions", + "3.3", [ 3, 3, 0 ], 689, 20, "further c level functions", "X85065AD381BD8E0F" ], [ "\033[1X\033[33X\033[0;-2YHigh level functions for buffered I/O\033[133X\\ -033[101X", "4", [ 4, 0, 0 ], 1, 21, "high level functions for buffered i/o", +033[101X", "4", [ 4, 0, 0 ], 1, 22, "high level functions for buffered i/o", "X7D6A3F7178CB6169" ], [ "\033[1X\033[33X\033[0;-2YTypes and the creation of \033[10XFile\033[110X\\ 033[101X\027\033[1X\027 objects\033[133X\033[101X", "4.1", [ 4, 1, 0 ], 29, - 21, "types and the creation of file objects", "X83C42F7778B704C7" ], + 22, "types and the creation of file objects", "X83C42F7778B704C7" ], [ "\033[1X\033[33X\033[0;-2YReading and writing\033[133X\033[101X", "4.2", - [ 4, 2, 0 ], 91, 22, "reading and writing", "X818FA8A37C8BBB95" ], + [ 4, 2, 0 ], 91, 23, "reading and writing", "X818FA8A37C8BBB95" ], [ "\033[1X\033[33X\033[0;-2YOther functions\033[133X\033[101X", "4.3", - [ 4, 3, 0 ], 326, 26, "other functions", "X87C3D1B984960984" ], + [ 4, 3, 0 ], 326, 27, "other functions", "X87C3D1B984960984" ], [ "\033[1X\033[33X\033[0;-2YInter process communication\033[133X\033[101X", - "4.4", [ 4, 4, 0 ], 429, 28, "inter process communication", + "4.4", [ 4, 4, 0 ], 429, 29, "inter process communication", "X85BB2BA684485CD6" ], [ "\033[1X\033[33X\033[0;-2YObject serialisation (Pickling)\033[133X\033[101X\ -", "5", [ 5, 0, 0 ], 1, 33, "object serialisation pickling", +", "5", [ 5, 0, 0 ], 1, 34, "object serialisation pickling", "X81BBA46880EBFC7D" ], [ "\033[1X\033[33X\033[0;-2YResult objects\033[133X\033[101X", "5.1", - [ 5, 1, 0 ], 18, 33, "result objects", "X7E504814811605B7" ], + [ 5, 1, 0 ], 18, 34, "result objects", "X7E504814811605B7" ], [ "\033[1X\033[33X\033[0;-2YPickling and unpickling\033[133X\033[101X", - "5.2", [ 5, 2, 0 ], 47, 34, "pickling and unpickling", + "5.2", [ 5, 2, 0 ], 47, 35, "pickling and unpickling", "X7F68A8F47F87B243" ], [ "\033[1X\033[33X\033[0;-2YExtending the pickling framework\033[133X\033[101\ -X", "5.3", [ 5, 3, 0 ], 99, 34, "extending the pickling framework", +X", "5.3", [ 5, 3, 0 ], 99, 35, "extending the pickling framework", "X7B1C9A9C7D3C0312" ], [ "\033[1X\033[33X\033[0;-2YReally random sources\033[133X\033[101X", "6", - [ 6, 0, 0 ], 1, 36, "really random sources", "X78A8811F7BD55ABA" ], + [ 6, 0, 0 ], 1, 37, "really random sources", "X78A8811F7BD55ABA" ], [ "\033[1X\033[33X\033[0;-2YThe functions\033[133X\033[101X", "6.1", - [ 6, 1, 0 ], 11, 36, "the functions", "X8173135A7D187358" ], + [ 6, 1, 0 ], 11, 37, "the functions", "X8173135A7D187358" ], [ "\033[1X\033[33X\033[0;-2YA client side implementation of the HTTP protocol\ -\033[133X\033[101X", "7", [ 7, 0, 0 ], 1, 37, +\033[133X\033[101X", "7", [ 7, 0, 0 ], 1, 38, "a client side implementation of the http protocol", "X79DA05BB7CCC1749" ], [ "\033[1X\033[33X\033[0;-2YFunctions for client side HTTP\033[133X\033[101X" - , "7.1", [ 7, 1, 0 ], 9, 37, "functions for client side http", + , "7.1", [ 7, 1, 0 ], 9, 38, "functions for client side http", "X7E8B5F0A87F2C1F7" ], [ "\033[1X\033[33X\033[0;-2YBackground jobs using fork\033[133X\033[101X", - "8", [ 8, 0, 0 ], 1, 40, "background jobs using fork", + "8", [ 8, 0, 0 ], 1, 41, "background jobs using fork", "X7E9E9B3F7B585BA7" ], [ "\033[1X\033[33X\033[0;-2YBackground jobs\033[133X\033[101X", "8.1", - [ 8, 1, 0 ], 28, 40, "background jobs", "X7CCAF66D7E7E098E" ], + [ 8, 1, 0 ], 28, 41, "background jobs", "X7CCAF66D7E7E098E" ], [ "\033[1X\033[33X\033[0;-2YParallel programming skeletons\033[133X\033[101X" - , "8.2", [ 8, 2, 0 ], 138, 42, "parallel programming skeletons", + , "8.2", [ 8, 2, 0 ], 138, 43, "parallel programming skeletons", "X7AF7D78B7F6F1212" ], [ "\033[1X\033[33X\033[0;-2YWorker farms\033[133X\033[101X", "8.3", - [ 8, 3, 0 ], 276, 44, "worker farms", "X7D18519B879047B3" ], + [ 8, 3, 0 ], 276, 45, "worker farms", "X7D18519B879047B3" ], [ "\033[1X\033[33X\033[0;-2YI/O multiplexing\033[133X\033[101X", "9", - [ 9, 0, 0 ], 1, 47, "i/o multiplexing", "X7A466B907B882CA0" ], + [ 9, 0, 0 ], 1, 48, "i/o multiplexing", "X7A466B907B882CA0" ], [ "\033[1X\033[33X\033[0;-2YIntroduction\033[133X\033[101X", "9.1", - [ 9, 1, 0 ], 4, 47, "introduction", "X7DFB63A97E67C0A1" ], + [ 9, 1, 0 ], 4, 48, "introduction", "X7DFB63A97E67C0A1" ], [ "\033[1X\033[33X\033[0;-2YThe operations for \033[10XIOHub\033[110X\033[101\ -X\027\033[1X\027 objects\033[133X\033[101X", "9.2", [ 9, 2, 0 ], 22, 47, +X\027\033[1X\027 objects\033[133X\033[101X", "9.2", [ 9, 2, 0 ], 22, 48, "the operations for iohub objects", "X81EC9A3186F1DCDE" ], [ "\033[1X\033[33X\033[0;-2YExamples\033[133X\033[101X", "9.3", - [ 9, 3, 0 ], 194, 50, "examples", "X7A489A5D79DA9E5C" ], + [ 9, 3, 0 ], 194, 51, "examples", "X7A489A5D79DA9E5C" ], [ "\033[1X\033[33X\033[0;-2YExamples of usage\033[133X\033[101X", "10", - [ 10, 0, 0 ], 1, 51, "examples of usage", "X7EADF566874177D8" ], + [ 10, 0, 0 ], 1, 52, "examples of usage", "X7EADF566874177D8" ], [ "\033[1X\033[33X\033[0;-2YWriting and reading a file\033[133X\033[101X", - "10.1", [ 10, 1, 0 ], 18, 51, "writing and reading a file", + "10.1", [ 10, 1, 0 ], 18, 52, "writing and reading a file", "X7EC25CA68794860A" ], [ "\033[1X\033[33X\033[0;-2YUsing filtering programs to read and write files\\ -033[133X\033[101X", "10.2", [ 10, 2, 0 ], 69, 52, +033[133X\033[101X", "10.2", [ 10, 2, 0 ], 69, 53, "using filtering programs to read and write files", "X7AECE665813D6E4D" ], [ "\033[1X\033[33X\033[0;-2YUsing filters when reading or writing files seque\ -ntially\033[133X\033[101X", "10.3", [ 10, 3, 0 ], 93, 52, +ntially\033[133X\033[101X", "10.3", [ 10, 3, 0 ], 93, 53, "using filters when reading or writing files sequentially", "X7A8A180D7B335151" ], [ "\033[1X\033[33X\033[0;-2YAccessing a web page\033[133X\033[101X", - "10.4", [ 10, 4, 0 ], 121, 53, "accessing a web page", + "10.4", [ 10, 4, 0 ], 121, 54, "accessing a web page", "X7BD2BF7F87573C69" ], [ "\033[1X\033[33X\033[0;-2Y(Un-)Pickling\033[133X\033[101X", "10.5", - [ 10, 5, 0 ], 149, 53, "un- pickling", "X81BD8400832EE20B" ], + [ 10, 5, 0 ], 149, 54, "un- pickling", "X81BD8400832EE20B" ], [ "\033[1X\033[33X\033[0;-2YLicense\033[133X\033[101X", "11", [ 11, 0, 0 ], - 1, 55, "license", "X861E5DF986F89AE2" ], - [ "Index", "ind", [ "Ind", 0, 0 ], 1, 56, "index", "X83A0356F839C696F" ], + 1, 56, "license", "X861E5DF986F89AE2" ], + [ "Index", "ind", [ "Ind", 0, 0 ], 1, 57, "index", "X83A0356F839C696F" ], [ "\033[5XIO\033[105X", "1.0", [ 1, 0, 0 ], 1, 5, "io", "X874E1D45845007FE" ], [ "\033[2XIO_accept\033[102X", "3.2-1", [ 3, 2, 1 ], 104, 9, "io_accept", @@ -159,288 +159,288 @@ "X7870647E866D29A4" ], [ "\033[2XIO_fork\033[102X", "3.2-19", [ 3, 2, 19 ], 246, 12, "io_fork", "X86C819F37D07ECF7" ], - [ "\033[2XIO_fstat\033[102X", "3.2-20", [ 3, 2, 20 ], 257, 12, "io_fstat", + [ "\033[2XIO_fstat\033[102X", "3.2-20", [ 3, 2, 20 ], 262, 12, "io_fstat", "X7E27748983EC7B5C" ], - [ "\033[2XIO_getcwd\033[102X", "3.2-21", [ 3, 2, 21 ], 265, 12, + [ "\033[2XIO_getcwd\033[102X", "3.2-21", [ 3, 2, 21 ], 270, 12, "io_getcwd", "X826D86AF8013F184" ], - [ "\033[2XIO_getenv\033[102X", "3.2-22", [ 3, 2, 22 ], 272, 12, + [ "\033[2XIO_getenv\033[102X", "3.2-22", [ 3, 2, 22 ], 277, 12, "io_getenv", "X84AECCE17832D6D8" ], - [ "\033[2XIO_gethostbyname\033[102X", "3.2-23", [ 3, 2, 23 ], 281, 13, + [ "\033[2XIO_gethostbyname\033[102X", "3.2-23", [ 3, 2, 23 ], 286, 13, "io_gethostbyname", "X7DD25BDC79EE65AD" ], - [ "\033[2XIO_gethostname\033[102X", "3.2-24", [ 3, 2, 24 ], 289, 13, + [ "\033[2XIO_gethostname\033[102X", "3.2-24", [ 3, 2, 24 ], 294, 13, "io_gethostname", "X7B7164EF8307D26B" ], - [ "\033[2XIO_getpid\033[102X", "3.2-25", [ 3, 2, 25 ], 296, 13, + [ "\033[2XIO_getpid\033[102X", "3.2-25", [ 3, 2, 25 ], 301, 13, "io_getpid", "X7ECF948083E38BD0" ], - [ "\033[2XIO_getppid\033[102X", "3.2-26", [ 3, 2, 26 ], 304, 13, + [ "\033[2XIO_getppid\033[102X", "3.2-26", [ 3, 2, 26 ], 309, 13, "io_getppid", "X7EC6ABAB7AB9F40F" ], - [ "\033[2XIO_getsockname\033[102X", "3.2-27", [ 3, 2, 27 ], 312, 13, + [ "\033[2XIO_getsockname\033[102X", "3.2-27", [ 3, 2, 27 ], 317, 13, "io_getsockname", "X877A161482FC1769" ], - [ "\033[2XIO_getsockopt\033[102X", "3.2-28", [ 3, 2, 28 ], 319, 13, + [ "\033[2XIO_getsockopt\033[102X", "3.2-28", [ 3, 2, 28 ], 324, 13, "io_getsockopt", "X790213D885BAB495" ], - [ "\033[2XIO_gettimeofday\033[102X", "3.2-29", [ 3, 2, 29 ], 328, 13, + [ "\033[2XIO_gettimeofday\033[102X", "3.2-29", [ 3, 2, 29 ], 333, 13, "io_gettimeofday", "X7BC965198011083B" ], - [ "\033[2XIO_gmtime\033[102X", "3.2-30", [ 3, 2, 30 ], 337, 14, + [ "\033[2XIO_gmtime\033[102X", "3.2-30", [ 3, 2, 30 ], 342, 14, "io_gmtime", "X7DC156EA86F3F356" ], - [ "\033[2XIO_kill\033[102X", "3.2-31", [ 3, 2, 31 ], 346, 14, "io_kill", + [ "\033[2XIO_kill\033[102X", "3.2-31", [ 3, 2, 31 ], 351, 14, "io_kill", "X7D0439128512FBF6" ], - [ "\033[2XIO_lchown\033[102X", "3.2-32", [ 3, 2, 32 ], 355, 14, + [ "\033[2XIO_lchown\033[102X", "3.2-32", [ 3, 2, 32 ], 360, 14, "io_lchown", "X8305F97C87FE448E" ], - [ "\033[2XIO_link\033[102X", "3.2-33", [ 3, 2, 33 ], 363, 14, "io_link", + [ "\033[2XIO_link\033[102X", "3.2-33", [ 3, 2, 33 ], 368, 14, "io_link", "X7E1C65EB84497185" ], - [ "\033[2XIO_listen\033[102X", "3.2-34", [ 3, 2, 34 ], 370, 14, + [ "\033[2XIO_listen\033[102X", "3.2-34", [ 3, 2, 34 ], 375, 14, "io_listen", "X7957063B807025C7" ], - [ "\033[2XIO_localtime\033[102X", "3.2-35", [ 3, 2, 35 ], 377, 14, + [ "\033[2XIO_localtime\033[102X", "3.2-35", [ 3, 2, 35 ], 382, 14, "io_localtime", "X7B7D3D64805F335F" ], - [ "\033[2XIO_lseek\033[102X", "3.2-36", [ 3, 2, 36 ], 386, 14, "io_lseek", + [ "\033[2XIO_lseek\033[102X", "3.2-36", [ 3, 2, 36 ], 391, 14, "io_lseek", "X85C475187C824830" ], - [ "\033[2XIO_lstat\033[102X", "3.2-37", [ 3, 2, 37 ], 393, 15, "io_lstat", + [ "\033[2XIO_lstat\033[102X", "3.2-37", [ 3, 2, 37 ], 398, 15, "io_lstat", "X7A8C75038517A55A" ], - [ "\033[2XIO_mkdir\033[102X", "3.2-38", [ 3, 2, 38 ], 402, 15, "io_mkdir", + [ "\033[2XIO_mkdir\033[102X", "3.2-38", [ 3, 2, 38 ], 407, 15, "io_mkdir", "X83D968AB84F00ABF" ], - [ "\033[2XIO_mkfifo\033[102X", "3.2-39", [ 3, 2, 39 ], 409, 15, + [ "\033[2XIO_mkfifo\033[102X", "3.2-39", [ 3, 2, 39 ], 414, 15, "io_mkfifo", "X80BFF17A8099815F" ], - [ "\033[2XIO_mknod\033[102X", "3.2-40", [ 3, 2, 40 ], 416, 15, "io_mknod", + [ "\033[2XIO_mknod\033[102X", "3.2-40", [ 3, 2, 40 ], 421, 15, "io_mknod", "X7928F1DB8379F850" ], - [ "\033[2XIO_mkstemp\033[102X", "3.2-41", [ 3, 2, 41 ], 423, 15, + [ "\033[2XIO_mkstemp\033[102X", "3.2-41", [ 3, 2, 41 ], 428, 15, "io_mkstemp", "X82B09BF27D5AA458" ], - [ "\033[2XIO_mkdtemp\033[102X", "3.2-42", [ 3, 2, 42 ], 430, 15, + [ "\033[2XIO_mkdtemp\033[102X", "3.2-42", [ 3, 2, 42 ], 435, 15, "io_mkdtemp", "X7F9C9F4B7CB7977A" ], - [ "\033[2XIO_open\033[102X", "3.2-43", [ 3, 2, 43 ], 437, 15, "io_open", + [ "\033[2XIO_open\033[102X", "3.2-43", [ 3, 2, 43 ], 442, 15, "io_open", "X8731A44E8032D9D2" ], - [ "\033[2XIO_opendir\033[102X", "3.2-44", [ 3, 2, 44 ], 445, 16, + [ "\033[2XIO_opendir\033[102X", "3.2-44", [ 3, 2, 44 ], 450, 16, "io_opendir", "X78E234797EB01883" ], - [ "\033[2XIO_pipe\033[102X", "3.2-45", [ 3, 2, 45 ], 454, 16, "io_pipe", + [ "\033[2XIO_pipe\033[102X", "3.2-45", [ 3, 2, 45 ], 459, 16, "io_pipe", "X7C8F0A44837BBE8C" ], - [ "\033[2XIO_read\033[102X", "3.2-46", [ 3, 2, 46 ], 464, 16, "io_read", + [ "\033[2XIO_read\033[102X", "3.2-46", [ 3, 2, 46 ], 469, 16, "io_read", "X84F3D862836BF17C" ], - [ "\033[2XIO_readdir\033[102X", "3.2-47", [ 3, 2, 47 ], 475, 16, + [ "\033[2XIO_readdir\033[102X", "3.2-47", [ 3, 2, 47 ], 480, 16, "io_readdir", "X8410C6F17DE9302D" ], - [ "\033[2XIO_readlink\033[102X", "3.2-48", [ 3, 2, 48 ], 485, 16, + [ "\033[2XIO_readlink\033[102X", "3.2-48", [ 3, 2, 48 ], 490, 16, "io_readlink", "X7943F25E7EBA9A6B" ], - [ "\033[2XIO_recv\033[102X", "3.2-49", [ 3, 2, 49 ], 493, 16, "io_recv", + [ "\033[2XIO_recv\033[102X", "3.2-49", [ 3, 2, 49 ], 498, 16, "io_recv", "X78EB295E78B363B2" ], - [ "\033[2XIO_recvfrom\033[102X", "3.2-50", [ 3, 2, 50 ], 502, 17, + [ "\033[2XIO_recvfrom\033[102X", "3.2-50", [ 3, 2, 50 ], 507, 17, "io_recvfrom", "X84C617887EE02EB4" ], - [ "\033[2XIO_rename\033[102X", "3.2-51", [ 3, 2, 51 ], 513, 17, + [ "\033[2XIO_rename\033[102X", "3.2-51", [ 3, 2, 51 ], 518, 17, "io_rename", "X78EC95007A92AB69" ], - [ "\033[2XIO_rewinddir\033[102X", "3.2-52", [ 3, 2, 52 ], 520, 17, + [ "\033[2XIO_rewinddir\033[102X", "3.2-52", [ 3, 2, 52 ], 525, 17, "io_rewinddir", "X7F86DBEB7876FBA5" ], - [ "\033[2XIO_rmdir\033[102X", "3.2-53", [ 3, 2, 53 ], 529, 17, "io_rmdir", + [ "\033[2XIO_rmdir\033[102X", "3.2-53", [ 3, 2, 53 ], 534, 17, "io_rmdir", "X7FA4DD537C83A199" ], - [ "\033[2XIO_seekdir\033[102X", "3.2-54", [ 3, 2, 54 ], 536, 17, + [ "\033[2XIO_seekdir\033[102X", "3.2-54", [ 3, 2, 54 ], 541, 17, "io_seekdir", "X84A98D2380BF6574" ], - [ "\033[2XIO_select\033[102X", "3.2-55", [ 3, 2, 55 ], 545, 17, + [ "\033[2XIO_select\033[102X", "3.2-55", [ 3, 2, 55 ], 550, 17, "io_select", "X81CA6EE88062010E" ], - [ "\033[2XIO_send\033[102X", "3.2-56", [ 3, 2, 56 ], 557, 18, "io_send", + [ "\033[2XIO_send\033[102X", "3.2-56", [ 3, 2, 56 ], 562, 18, "io_send", "X87019FD887F55C27" ], - [ "\033[2XIO_sendto\033[102X", "3.2-57", [ 3, 2, 57 ], 567, 18, + [ "\033[2XIO_sendto\033[102X", "3.2-57", [ 3, 2, 57 ], 572, 18, "io_sendto", "X8388B0147B5745EC" ], - [ "\033[2XIO_setenv\033[102X", "3.2-58", [ 3, 2, 58 ], 579, 18, + [ "\033[2XIO_setenv\033[102X", "3.2-58", [ 3, 2, 58 ], 584, 18, "io_setenv", "X7D2AB8E985C56AD4" ], - [ "\033[2XIO_setsockopt\033[102X", "3.2-59", [ 3, 2, 59 ], 588, 18, + [ "\033[2XIO_setsockopt\033[102X", "3.2-59", [ 3, 2, 59 ], 593, 18, "io_setsockopt", "X7BE641C1784D0899" ], - [ "\033[2XIO_socket\033[102X", "3.2-60", [ 3, 2, 60 ], 597, 18, + [ "\033[2XIO_socket\033[102X", "3.2-60", [ 3, 2, 60 ], 602, 18, "io_socket", "X852B16CF82B96C84" ], - [ "\033[2XIO_stat\033[102X", "3.2-61", [ 3, 2, 61 ], 607, 18, "io_stat", + [ "\033[2XIO_stat\033[102X", "3.2-61", [ 3, 2, 61 ], 612, 18, "io_stat", "X7F7D23867B45D525" ], - [ "\033[2XIO_symlink\033[102X", "3.2-62", [ 3, 2, 62 ], 615, 19, + [ "\033[2XIO_symlink\033[102X", "3.2-62", [ 3, 2, 62 ], 620, 19, "io_symlink", "X7B0D9CEF7A3CD431" ], - [ "\033[2XIO_telldir\033[102X", "3.2-63", [ 3, 2, 63 ], 622, 19, + [ "\033[2XIO_telldir\033[102X", "3.2-63", [ 3, 2, 63 ], 627, 19, "io_telldir", "X81FF8B678748900B" ], - [ "\033[2XIO_unlink\033[102X", "3.2-64", [ 3, 2, 64 ], 631, 19, + [ "\033[2XIO_unlink\033[102X", "3.2-64", [ 3, 2, 64 ], 636, 19, "io_unlink", "X78C93B6587B478C2" ], - [ "\033[2XIO_unsetenv\033[102X", "3.2-65", [ 3, 2, 65 ], 639, 19, + [ "\033[2XIO_unsetenv\033[102X", "3.2-65", [ 3, 2, 65 ], 644, 19, "io_unsetenv", "X8103218E7C5CF577" ], - [ "\033[2XIO_WaitPid\033[102X", "3.2-66", [ 3, 2, 66 ], 646, 19, + [ "\033[2XIO_WaitPid\033[102X", "3.2-66", [ 3, 2, 66 ], 651, 19, "io_waitpid", "X80737A008450184F" ], - [ "\033[2XIO_IgnorePid\033[102X", "3.2-67", [ 3, 2, 67 ], 665, 19, + [ "\033[2XIO_IgnorePid\033[102X", "3.2-67", [ 3, 2, 67 ], 670, 19, "io_ignorepid", "X84295FC77CCB1066" ], - [ "\033[2XIO_write\033[102X", "3.2-68", [ 3, 2, 68 ], 674, 20, "io_write", + [ "\033[2XIO_write\033[102X", "3.2-68", [ 3, 2, 68 ], 679, 20, "io_write", "X84EB06707D1BD3F1" ], - [ "\033[2XIO_make_sockaddr_in\033[102X", "3.3-1", [ 3, 3, 1 ], 690, 20, + [ "\033[2XIO_make_sockaddr_in\033[102X", "3.3-1", [ 3, 3, 1 ], 695, 20, "io_make_sockaddr_in", "X878007A67E806CEF" ], - [ "\033[2XIO_environ\033[102X", "3.3-2", [ 3, 3, 2 ], 701, 20, + [ "\033[2XIO_environ\033[102X", "3.3-2", [ 3, 3, 2 ], 706, 20, "io_environ", "X7F3E88AD7EFD52F4" ], - [ "\033[2XIO_InstallSIGCHLDHandler\033[102X", "3.3-3", [ 3, 3, 3 ], 709, + [ "\033[2XIO_InstallSIGCHLDHandler\033[102X", "3.3-3", [ 3, 3, 3 ], 714, 20, "io_installsigchldhandler", "X8383E62D86BE30C6" ], - [ "\033[2XIO_RestoreSIGCHLDHandler\033[102X", "3.3-4", [ 3, 3, 4 ], 722, + [ "\033[2XIO_RestoreSIGCHLDHandler\033[102X", "3.3-4", [ 3, 3, 4 ], 733, 20, "io_restoresigchldhandler", "X7EEB7471816B64DF" ], - [ "\033[2XIsFile\033[102X", "4.1-1", [ 4, 1, 1 ], 34, 21, "isfile", + [ "\033[2XIsFile\033[102X", "4.1-1", [ 4, 1, 1 ], 34, 22, "isfile", "X80C9B80A80E3A555" ], - [ "\033[2XIO_WrapFD\033[102X", "4.1-2", [ 4, 1, 2 ], 43, 21, "io_wrapfd", + [ "\033[2XIO_WrapFD\033[102X", "4.1-2", [ 4, 1, 2 ], 43, 22, "io_wrapfd", "X7DDB0BA6836DA208" ], - [ "\033[2XIO_File\033[102X mode", "4.1-3", [ 4, 1, 3 ], 66, 22, + [ "\033[2XIO_File\033[102X mode", "4.1-3", [ 4, 1, 3 ], 66, 23, "io_file mode", "X7EC160D07E815DBB" ], - [ "\033[2XIO_File\033[102X bufsize", "4.1-3", [ 4, 1, 3 ], 66, 22, + [ "\033[2XIO_File\033[102X bufsize", "4.1-3", [ 4, 1, 3 ], 66, 23, "io_file bufsize", "X7EC160D07E815DBB" ], - [ "\033[2XIO_File\033[102X mode and bufsize", "4.1-3", [ 4, 1, 3 ], 66, 22, + [ "\033[2XIO_File\033[102X mode and bufsize", "4.1-3", [ 4, 1, 3 ], 66, 23, "io_file mode and bufsize", "X7EC160D07E815DBB" ], - [ "\033[2XIO_ReadUntilEOF\033[102X", "4.2-1", [ 4, 2, 1 ], 96, 22, + [ "\033[2XIO_ReadUntilEOF\033[102X", "4.2-1", [ 4, 2, 1 ], 96, 23, "io_readuntileof", "X865A873E78C822B7" ], - [ "\033[2XIO_ReadBlock\033[102X", "4.2-2", [ 4, 2, 2 ], 107, 22, + [ "\033[2XIO_ReadBlock\033[102X", "4.2-2", [ 4, 2, 2 ], 107, 23, "io_readblock", "X7D2686ED854BEF95" ], - [ "\033[2XIO_ReadLine\033[102X", "4.2-3", [ 4, 2, 3 ], 122, 23, + [ "\033[2XIO_ReadLine\033[102X", "4.2-3", [ 4, 2, 3 ], 122, 24, "io_readline", "X8738708E7B9DF8DB" ], - [ "\033[2XIO_ReadLines\033[102X", "4.2-4", [ 4, 2, 4 ], 142, 23, + [ "\033[2XIO_ReadLines\033[102X", "4.2-4", [ 4, 2, 4 ], 142, 24, "io_readlines", "X81E72756806C0945" ], - [ "\033[2XIO_HasData\033[102X", "4.2-5", [ 4, 2, 5 ], 162, 23, + [ "\033[2XIO_HasData\033[102X", "4.2-5", [ 4, 2, 5 ], 162, 24, "io_hasdata", "X87E0AC547835F21D" ], - [ "\033[2XIO_Read\033[102X", "4.2-6", [ 4, 2, 6 ], 173, 23, "io_read", + [ "\033[2XIO_Read\033[102X", "4.2-6", [ 4, 2, 6 ], 173, 24, "io_read", "X84F3D862836BF17C" ], - [ "\033[2XIO_Write\033[102X", "4.2-7", [ 4, 2, 7 ], 195, 24, "io_write", + [ "\033[2XIO_Write\033[102X", "4.2-7", [ 4, 2, 7 ], 195, 25, "io_write", "X84EB06707D1BD3F1" ], - [ "\033[2XIO_WriteLine\033[102X", "4.2-8", [ 4, 2, 8 ], 216, 24, + [ "\033[2XIO_WriteLine\033[102X", "4.2-8", [ 4, 2, 8 ], 216, 25, "io_writeline", "X83A03ACB81F53BB1" ], - [ "\033[2XIO_WriteLines\033[102X", "4.2-9", [ 4, 2, 9 ], 227, 24, + [ "\033[2XIO_WriteLines\033[102X", "4.2-9", [ 4, 2, 9 ], 227, 25, "io_writelines", "X87CE6EC17C1573AC" ], - [ "\033[2XIO_Flush\033[102X", "4.2-10", [ 4, 2, 10 ], 238, 24, "io_flush", + [ "\033[2XIO_Flush\033[102X", "4.2-10", [ 4, 2, 10 ], 238, 25, "io_flush", "X7873A49F7CC7ECFB" ], - [ "\033[2XIO_WriteFlush\033[102X", "4.2-11", [ 4, 2, 11 ], 256, 25, + [ "\033[2XIO_WriteFlush\033[102X", "4.2-11", [ 4, 2, 11 ], 256, 26, "io_writeflush", "X7870634278F6C69F" ], - [ "\033[2XIO_ReadyForWrite\033[102X", "4.2-12", [ 4, 2, 12 ], 265, 25, + [ "\033[2XIO_ReadyForWrite\033[102X", "4.2-12", [ 4, 2, 12 ], 265, 26, "io_readyforwrite", "X80CF240F78664DF4" ], - [ "\033[2XIO_WriteNonBlocking\033[102X", "4.2-13", [ 4, 2, 13 ], 275, 25, + [ "\033[2XIO_WriteNonBlocking\033[102X", "4.2-13", [ 4, 2, 13 ], 275, 26, "io_writenonblocking", "X84052F9886ADED0D" ], - [ "\033[2XIO_ReadyForFlush\033[102X", "4.2-14", [ 4, 2, 14 ], 290, 25, + [ "\033[2XIO_ReadyForFlush\033[102X", "4.2-14", [ 4, 2, 14 ], 290, 26, "io_readyforflush", "X7C5786E07813434B" ], - [ "\033[2XIO_FlushNonBlocking\033[102X", "4.2-15", [ 4, 2, 15 ], 302, 26, + [ "\033[2XIO_FlushNonBlocking\033[102X", "4.2-15", [ 4, 2, 15 ], 302, 27, "io_flushnonblocking", "X80E977B48771D207" ], - [ "\033[2XIO_Close\033[102X", "4.2-16", [ 4, 2, 16 ], 315, 26, "io_close", + [ "\033[2XIO_Close\033[102X", "4.2-16", [ 4, 2, 16 ], 315, 27, "io_close", "X820DA9C97C2E80BA" ], - [ "\033[2XIO_GetFD\033[102X", "4.3-1", [ 4, 3, 1 ], 329, 26, "io_getfd", + [ "\033[2XIO_GetFD\033[102X", "4.3-1", [ 4, 3, 1 ], 329, 27, "io_getfd", "X7F893EFC7D0C7BF2" ], - [ "\033[2XIO_GetWBuf\033[102X", "4.3-2", [ 4, 3, 2 ], 337, 26, + [ "\033[2XIO_GetWBuf\033[102X", "4.3-2", [ 4, 3, 2 ], 337, 27, "io_getwbuf", "X86666C9681EA7297" ], - [ "\033[2XIO_Select\033[102X", "4.3-3", [ 4, 3, 3 ], 348, 26, "io_select", + [ "\033[2XIO_Select\033[102X", "4.3-3", [ 4, 3, 3 ], 348, 27, "io_select", "X81CA6EE88062010E" ], - [ "\033[2XIO_ListDir\033[102X", "4.3-4", [ 4, 3, 4 ], 375, 27, + [ "\033[2XIO_ListDir\033[102X", "4.3-4", [ 4, 3, 4 ], 375, 28, "io_listdir", "X84B16DB878265F02" ], - [ "\033[2XChangeDirectoryCurrent\033[102X", "4.3-5", [ 4, 3, 5 ], 384, 27, + [ "\033[2XChangeDirectoryCurrent\033[102X", "4.3-5", [ 4, 3, 5 ], 384, 28, "changedirectorycurrent", "X81DDD2E87F68E086" ], - [ "\033[2XIO_MakeIPAddressPort\033[102X", "4.3-6", [ 4, 3, 6 ], 396, 27, + [ "\033[2XIO_MakeIPAddressPort\033[102X", "4.3-6", [ 4, 3, 6 ], 396, 28, "io_makeipaddressport", "X8568CE6684C90CE5" ], - [ "\033[2XIO_Environment\033[102X", "4.3-7", [ 4, 3, 7 ], 409, 27, + [ "\033[2XIO_Environment\033[102X", "4.3-7", [ 4, 3, 7 ], 409, 28, "io_environment", "X7F9AAE018474E1D8" ], - [ "\033[2XIO_MakeEnvList\033[102X", "4.3-8", [ 4, 3, 8 ], 421, 27, + [ "\033[2XIO_MakeEnvList\033[102X", "4.3-8", [ 4, 3, 8 ], 421, 28, "io_makeenvlist", "X7CF3DB5081A91600" ], - [ "\033[2XIO_FindExecutable\033[102X", "4.4-1", [ 4, 4, 1 ], 432, 28, + [ "\033[2XIO_FindExecutable\033[102X", "4.4-1", [ 4, 4, 1 ], 432, 29, "io_findexecutable", "X84E91FE27A7860F3" ], - [ "\033[2XIO_CloseAllFDs\033[102X", "4.4-2", [ 4, 4, 2 ], 447, 28, + [ "\033[2XIO_CloseAllFDs\033[102X", "4.4-2", [ 4, 4, 2 ], 447, 29, "io_closeallfds", "X7C43017E7AC5973A" ], - [ "\033[2XIO_Popen\033[102X", "4.4-3", [ 4, 4, 3 ], 455, 28, "io_popen", + [ "\033[2XIO_Popen\033[102X", "4.4-3", [ 4, 4, 3 ], 455, 29, "io_popen", "X7891F56386C008CE" ], - [ "\033[2XIO_Popen2\033[102X", "4.4-4", [ 4, 4, 4 ], 490, 28, "io_popen2", + [ "\033[2XIO_Popen2\033[102X", "4.4-4", [ 4, 4, 4 ], 490, 29, "io_popen2", "X7E05CF6481CBC0A1" ], - [ "\033[2XIO_Popen3\033[102X", "4.4-5", [ 4, 4, 5 ], 520, 29, "io_popen3", + [ "\033[2XIO_Popen3\033[102X", "4.4-5", [ 4, 4, 5 ], 520, 30, "io_popen3", "X7975BC6D80BC71E5" ], - [ "\033[2XIO_StartPipeline\033[102X", "4.4-6", [ 4, 4, 6 ], 550, 29, + [ "\033[2XIO_StartPipeline\033[102X", "4.4-6", [ 4, 4, 6 ], 550, 30, "io_startpipeline", "X813219C17FB54731" ], - [ "\033[2XIO_StringFilterFile\033[102X", "4.4-7", [ 4, 4, 7 ], 582, 30, + [ "\033[2XIO_StringFilterFile\033[102X", "4.4-7", [ 4, 4, 7 ], 582, 31, "io_stringfilterfile", "X86D61FAE871B23E8" ], [ "\033[2XIO_FileFilterString\033[102X append", "4.4-8", [ 4, 4, 8 ], 592, - 30, "io_filefilterstring append", "X83E765D783531845" ], - [ "\033[2XIO_FilteredFile\033[102X", "4.4-9", [ 4, 4, 9 ], 604, 30, + 31, "io_filefilterstring append", "X83E765D783531845" ], + [ "\033[2XIO_FilteredFile\033[102X", "4.4-9", [ 4, 4, 9 ], 604, 31, "io_filteredfile", "X801CE3708656FB00" ], - [ "\033[2XIO_CompressedFile\033[102X", "4.4-10", [ 4, 4, 10 ], 626, 31, + [ "\033[2XIO_CompressedFile\033[102X", "4.4-10", [ 4, 4, 10 ], 626, 32, "io_compressedfile", "X7B425F3B7A68C2FB" ], [ "\033[2XIO_SendStringBackground\033[102X", "4.4-11", [ 4, 4, 11 ], 645, - 31, "io_sendstringbackground", "X7D62E9C57F1F96FB" ], - [ "\033[2XIO_PipeThrough\033[102X", "4.4-12", [ 4, 4, 12 ], 678, 31, + 32, "io_sendstringbackground", "X7D62E9C57F1F96FB" ], + [ "\033[2XIO_PipeThrough\033[102X", "4.4-12", [ 4, 4, 12 ], 678, 32, "io_pipethrough", "X8484B0CD7836A19E" ], [ "\033[2XIO_PipeThroughWithError\033[102X", "4.4-13", [ 4, 4, 13 ], 697, - 32, "io_pipethroughwitherror", "X7A9ACA3979635506" ], - [ "\033[2XIO_Error\033[102X", "5.1-1", [ 5, 1, 1 ], 24, 33, "io_error", + 33, "io_pipethroughwitherror", "X7A9ACA3979635506" ], + [ "\033[2XIO_Error\033[102X", "5.1-1", [ 5, 1, 1 ], 24, 34, "io_error", "X86E06A128511BA25" ], - [ "\033[2XIO_Nothing\033[102X", "5.1-2", [ 5, 1, 2 ], 30, 33, "io_nothing", + [ "\033[2XIO_Nothing\033[102X", "5.1-2", [ 5, 1, 2 ], 30, 34, "io_nothing", "X7887BFCF824B439B" ], - [ "\033[2XIO_OK\033[102X", "5.1-3", [ 5, 1, 3 ], 37, 33, "io_ok", + [ "\033[2XIO_OK\033[102X", "5.1-3", [ 5, 1, 3 ], 37, 34, "io_ok", "X7D4D092B8401EA0F" ], - [ "\033[2XIO_Pickle\033[102X", "5.2-1", [ 5, 2, 1 ], 50, 34, "io_pickle", + [ "\033[2XIO_Pickle\033[102X", "5.2-1", [ 5, 2, 1 ], 50, 35, "io_pickle", "X7E01770481297DF1" ], - [ "\033[2XIO_Unpickle\033[102X", "5.2-2", [ 5, 2, 2 ], 75, 34, + [ "\033[2XIO_Unpickle\033[102X", "5.2-2", [ 5, 2, 2 ], 75, 35, "io_unpickle", "X8228EE63809A6DEF" ], - [ "\033[2XIO_ClearPickleCache\033[102X", "5.2-3", [ 5, 2, 3 ], 86, 34, + [ "\033[2XIO_ClearPickleCache\033[102X", "5.2-3", [ 5, 2, 3 ], 86, 35, "io_clearpicklecache", "X844736FB80F6EE97" ], - [ "\033[2XRandomSource\033[102X", "6.1-1", [ 6, 1, 1 ], 14, 36, + [ "\033[2XRandomSource\033[102X", "6.1-1", [ 6, 1, 1 ], 14, 37, "randomsource", "X7CB0B5BC82F8FD8F" ], - [ "\033[2XOpenHTTPConnection\033[102X", "7.1-1", [ 7, 1, 1 ], 12, 37, + [ "\033[2XOpenHTTPConnection\033[102X", "7.1-1", [ 7, 1, 1 ], 12, 38, "openhttpconnection", "X7B5588D5856BE6DD" ], - [ "\033[2XHTTPRequest\033[102X", "7.1-2", [ 7, 1, 2 ], 31, 37, + [ "\033[2XHTTPRequest\033[102X", "7.1-2", [ 7, 1, 2 ], 31, 38, "httprequest", "X80FF9E307BDA0659" ], - [ "\033[2XHTTPTimeoutForSelect\033[102X", "7.1-3", [ 7, 1, 3 ], 79, 38, + [ "\033[2XHTTPTimeoutForSelect\033[102X", "7.1-3", [ 7, 1, 3 ], 79, 39, "httptimeoutforselect", "X83526BF378B3D8F2" ], - [ "\033[2XCloseHTTPConnection\033[102X", "7.1-4", [ 7, 1, 4 ], 95, 38, + [ "\033[2XCloseHTTPConnection\033[102X", "7.1-4", [ 7, 1, 4 ], 95, 39, "closehttpconnection", "X81702FA07F2AF472" ], - [ "\033[2XSingleHTTPRequest\033[102X", "7.1-5", [ 7, 1, 5 ], 103, 39, + [ "\033[2XSingleHTTPRequest\033[102X", "7.1-5", [ 7, 1, 5 ], 103, 40, "singlehttprequest", "X7DBCB0B4801E4D6D" ], - [ "\033[2XCheckForUpdates\033[102X", "7.1-6", [ 7, 1, 6 ], 119, 39, + [ "\033[2XCheckForUpdates\033[102X", "7.1-6", [ 7, 1, 6 ], 119, 40, "checkforupdates", "X78BAF7A77F6BE631" ], - [ "\033[2XReadWeb\033[102X", "7.1-7", [ 7, 1, 7 ], 130, 39, "readweb", + [ "\033[2XReadWeb\033[102X", "7.1-7", [ 7, 1, 7 ], 130, 40, "readweb", "X872B174F7FFD345B" ], - [ "\033[2XBackgroundJobByFork\033[102X", "8.1-1", [ 8, 1, 1 ], 33, 40, + [ "\033[2XBackgroundJobByFork\033[102X", "8.1-1", [ 8, 1, 1 ], 33, 41, "backgroundjobbyfork", "X7FE0061F8484814B" ], - [ "\033[2XIsIdle\033[102X bgjob", "8.1-2", [ 8, 1, 2 ], 67, 41, + [ "\033[2XIsIdle\033[102X bgjob", "8.1-2", [ 8, 1, 2 ], 67, 42, "isidle bgjob", "X7B7D934583257B9A" ], - [ "\033[2XHasTerminated\033[102X", "8.1-3", [ 8, 1, 3 ], 82, 41, + [ "\033[2XHasTerminated\033[102X", "8.1-3", [ 8, 1, 3 ], 82, 42, "hasterminated", "X86E1283D7AD05169" ], - [ "\033[2XWaitUntilIdle\033[102X", "8.1-4", [ 8, 1, 4 ], 91, 41, + [ "\033[2XWaitUntilIdle\033[102X", "8.1-4", [ 8, 1, 4 ], 91, 42, "waituntilidle", "X7C139805804E6FE1" ], - [ "\033[2XPickup\033[102X bgjob", "8.1-5", [ 8, 1, 5 ], 101, 41, + [ "\033[2XPickup\033[102X bgjob", "8.1-5", [ 8, 1, 5 ], 101, 42, "pickup bgjob", "X7F4B8B9078D0E18E" ], - [ "\033[2XSubmit\033[102X bgjob", "8.1-6", [ 8, 1, 6 ], 108, 42, + [ "\033[2XSubmit\033[102X bgjob", "8.1-6", [ 8, 1, 6 ], 108, 43, "submit bgjob", "X864492F37E858197" ], - [ "\033[2XKill\033[102X bgjob", "8.1-7", [ 8, 1, 7 ], 126, 42, + [ "\033[2XKill\033[102X bgjob", "8.1-7", [ 8, 1, 7 ], 126, 43, "kill bgjob", "X841B3A1A7967DEA4" ], [ "\033[2XParTakeFirstResultByFork\033[102X", "8.2-1", [ 8, 2, 1 ], 144, - 42, "partakefirstresultbyfork", "X78A59A628449960F" ], - [ "\033[2XParDoByFork\033[102X", "8.2-2", [ 8, 2, 2 ], 169, 43, + 43, "partakefirstresultbyfork", "X78A59A628449960F" ], + [ "\033[2XParDoByFork\033[102X", "8.2-2", [ 8, 2, 2 ], 169, 44, "pardobyfork", "X7A1F40D1841C36D2" ], - [ "\033[2XParListByFork\033[102X", "8.2-3", [ 8, 2, 3 ], 192, 43, + [ "\033[2XParListByFork\033[102X", "8.2-3", [ 8, 2, 3 ], 192, 44, "parlistbyfork", "X80DA6945873DCC66" ], - [ "\033[2XParMapReduceByFork\033[102X", "8.2-4", [ 8, 2, 4 ], 210, 43, + [ "\033[2XParMapReduceByFork\033[102X", "8.2-4", [ 8, 2, 4 ], 210, 44, "parmapreducebyfork", "X7AD5D85283BC41AC" ], - [ "Timeouts", "8.2-4", [ 8, 2, 4 ], 210, 43, "timeouts", + [ "Timeouts", "8.2-4", [ 8, 2, 4 ], 210, 44, "timeouts", "X7AD5D85283BC41AC" ], - [ "\033[2XIO_CallWithTimeout\033[102X", "8.2-5", [ 8, 2, 5 ], 229, 43, + [ "\033[2XIO_CallWithTimeout\033[102X", "8.2-5", [ 8, 2, 5 ], 229, 44, "io_callwithtimeout", "X7A5CCA557B7F8660" ], - [ "\033[2XIO_CallWithTimeoutList\033[102X", "8.2-5", [ 8, 2, 5 ], 229, 43, + [ "\033[2XIO_CallWithTimeoutList\033[102X", "8.2-5", [ 8, 2, 5 ], 229, 44, "io_callwithtimeoutlist", "X7A5CCA557B7F8660" ], - [ "\033[2XParWorkerFarmByFork\033[102X", "8.3-1", [ 8, 3, 1 ], 287, 44, + [ "\033[2XParWorkerFarmByFork\033[102X", "8.3-1", [ 8, 3, 1 ], 287, 45, "parworkerfarmbyfork", "X87896E477DCB9C55" ], - [ "\033[2XDoQueues\033[102X", "8.3-2", [ 8, 3, 2 ], 301, 45, "doqueues", + [ "\033[2XDoQueues\033[102X", "8.3-2", [ 8, 3, 2 ], 301, 46, "doqueues", "X7ED2CE687EA7FC66" ], - [ "\033[2XKill\033[102X wfarm", "8.3-3", [ 8, 3, 3 ], 328, 45, + [ "\033[2XKill\033[102X wfarm", "8.3-3", [ 8, 3, 3 ], 328, 46, "kill wfarm", "X83289405792FF902" ], - [ "\033[2XIsIdle\033[102X wfarm", "8.3-4", [ 8, 3, 4 ], 337, 45, + [ "\033[2XIsIdle\033[102X wfarm", "8.3-4", [ 8, 3, 4 ], 337, 46, "isidle wfarm", "X7C4E3D5A7FE617FE" ], - [ "\033[2XSubmit\033[102X wfarm", "8.3-5", [ 8, 3, 5 ], 348, 45, + [ "\033[2XSubmit\033[102X wfarm", "8.3-5", [ 8, 3, 5 ], 348, 46, "submit wfarm", "X81773CEC8246EDF3" ], - [ "\033[2XPickup\033[102X wfarm", "8.3-6", [ 8, 3, 6 ], 359, 45, + [ "\033[2XPickup\033[102X wfarm", "8.3-6", [ 8, 3, 6 ], 359, 46, "pickup wfarm", "X7878258F84138DEA" ], - [ "\033[2XIOHub\033[102X", "9.2-1", [ 9, 2, 1 ], 28, 47, "iohub", + [ "\033[2XIOHub\033[102X", "9.2-1", [ 9, 2, 1 ], 28, 48, "iohub", "X83C0523D8538E866" ], - [ "\033[2XNewConnection\033[102X", "9.2-2", [ 9, 2, 2 ], 35, 47, + [ "\033[2XNewConnection\033[102X", "9.2-2", [ 9, 2, 2 ], 35, 48, "newconnection", "X7D1D9A8D837ECCEB" ], - [ "\033[2XCloseConnection\033[102X", "9.2-3", [ 9, 2, 3 ], 57, 48, + [ "\033[2XCloseConnection\033[102X", "9.2-3", [ 9, 2, 3 ], 57, 49, "closeconnection", "X8553D2E47C05797F" ], - [ "\033[2XAttachServingSocket\033[102X", "9.2-4", [ 9, 2, 4 ], 66, 48, + [ "\033[2XAttachServingSocket\033[102X", "9.2-4", [ 9, 2, 4 ], 66, 49, "attachservingsocket", "X7F7FD824866CB582" ], - [ "\033[2XShutdownServingSocket\033[102X", "9.2-5", [ 9, 2, 5 ], 79, 48, + [ "\033[2XShutdownServingSocket\033[102X", "9.2-5", [ 9, 2, 5 ], 79, 49, "shutdownservingsocket", "X7866F9DA8358968C" ], - [ "\033[2XShutdown\033[102X", "9.2-6", [ 9, 2, 6 ], 87, 48, "shutdown", + [ "\033[2XShutdown\033[102X", "9.2-6", [ 9, 2, 6 ], 87, 49, "shutdown", "X84AFBD658118ABB8" ], - [ "\033[2XAcceptNewConnection\033[102X", "9.2-7", [ 9, 2, 7 ], 97, 48, + [ "\033[2XAcceptNewConnection\033[102X", "9.2-7", [ 9, 2, 7 ], 97, 49, "acceptnewconnection", "X7BE1B9FD82C9B8E0" ], - [ "\033[2XSubmitOutput\033[102X", "9.2-8", [ 9, 2, 8 ], 113, 49, + [ "\033[2XSubmitOutput\033[102X", "9.2-8", [ 9, 2, 8 ], 113, 50, "submitoutput", "X85F634D4826D89F1" ], - [ "\033[2XGetInput\033[102X", "9.2-9", [ 9, 2, 9 ], 125, 49, "getinput", + [ "\033[2XGetInput\033[102X", "9.2-9", [ 9, 2, 9 ], 125, 50, "getinput", "X837629707DF9B60E" ], - [ "\033[2XNewTCPConnection\033[102X", "9.2-10", [ 9, 2, 10 ], 140, 49, + [ "\033[2XNewTCPConnection\033[102X", "9.2-10", [ 9, 2, 10 ], 140, 50, "newtcpconnection", "X79031BC687502CB6" ], - [ "\033[2XOutputQueue\033[102X", "9.2-11", [ 9, 2, 11 ], 153, 49, + [ "\033[2XOutputQueue\033[102X", "9.2-11", [ 9, 2, 11 ], 153, 50, "outputqueue", "X7F8C7F5782213A71" ], - [ "\033[2XInputQueue\033[102X", "9.2-12", [ 9, 2, 12 ], 164, 50, + [ "\033[2XInputQueue\033[102X", "9.2-12", [ 9, 2, 12 ], 164, 51, "inputqueue", "X7972FF1C7B59D0A4" ], - [ "\033[2XDoIO\033[102X", "9.2-13", [ 9, 2, 13 ], 175, 50, "doio", + [ "\033[2XDoIO\033[102X", "9.2-13", [ 9, 2, 13 ], 175, 51, "doio", "X810D418A802D09D1" ] ] ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/doc/title.xml new/io-4.11.0/doc/title.xml --- old/io-4.10.0/doc/title.xml 2026-07-14 02:00:00.000000000 +0200 +++ new/io-4.11.0/doc/title.xml 2026-09-28 02:00:00.000000000 +0200 @@ -9,14 +9,14 @@ Bindings for low level C library I/O routines </Subtitle> <Version> - 4.10.0 + 4.11.0 </Version> <Author> Max Neunhöffer <Email>[email protected]</Email> </Author> <Date> - 14 July 2026 + 28 September 2026 </Date> <Copyright> ©right; 2005-2014 by Max Neunhöffer<P/> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/gap/unavailable.g new/io-4.11.0/gap/unavailable.g --- old/io-4.10.0/gap/unavailable.g 1970-01-01 01:00:00.000000000 +0100 +++ new/io-4.11.0/gap/unavailable.g 2026-09-28 02:00:00.000000000 +0200 @@ -0,0 +1,44 @@ +############################################################################# +## +## unavailable.g The IO package +## +## Stubs for kernel functions which are not available on this platform. +## + +# +# The C part registers each of the functions below only when configure found +# the system call it wraps, so which ones exist depends on the platform. On +# native Windows, for instance, there is no fork and there are no signals. +# +# Bind the missing ones here, before any of the GAP code that mentions them +# is read: without this, reading it warns about unbound globals, and calling +# one of them fails with a message that says nothing about the real reason. +# +BindGlobal( "IO_UnavailableFunc", function( name ) + return function( arg ) + Error( name, " is not available on this platform" ); + end; +end ); + +BindGlobal( "IO_MaybeUnavailable", [ + "IO_IgnorePid", "IO_InstallSIGCHLDHandler", "IO_RestoreSIGCHLDHandler", + "IO_WaitPid", "IO_accept", "IO_bind", "IO_chmod", "IO_chown", + "IO_closedir", "IO_connect", "IO_dup", "IO_dup2", "IO_fchmod", + "IO_fchown", "IO_fcntl", "IO_fork", "IO_fstat", "IO_gethostbyname", + "IO_gethostname", "IO_getpid", "IO_getppid", "IO_getsockname", + "IO_getsockopt", "IO_gettimeofday", "IO_gmtime", "IO_kill", + "IO_lchown", "IO_link", "IO_listen", "IO_localtime", "IO_lstat", + "IO_make_sockaddr_in", "IO_mkdir", "IO_mkdtemp", "IO_mkfifo", + "IO_mknod", "IO_mkstemp", "IO_opendir", "IO_pipe", "IO_readdir", + "IO_readlink", "IO_recv", "IO_recvfrom", "IO_rename", "IO_rewinddir", + "IO_rmdir", "IO_seekdir", "IO_select", "IO_send", "IO_sendto", + "IO_setsockopt", "IO_socket", "IO_stat", "IO_symlink", "IO_telldir", + "IO_unlink" +] ); + +for IO_name in IO_MaybeUnavailable do + if not IsBoundGlobal( IO_name ) then + BindGlobal( IO_name, IO_UnavailableFunc( IO_name ) ); + fi; +od; +Unbind( IO_name ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/init.g new/io-4.11.0/init.g --- old/io-4.10.0/init.g 2026-07-14 02:00:00.000000000 +0200 +++ new/io-4.11.0/init.g 2026-09-28 02:00:00.000000000 +0200 @@ -17,6 +17,9 @@ Error("failed to load the io package kernel extension"); fi; +# must come first: it binds the kernel functions this platform lacks +ReadPackage("IO", "gap/unavailable.g"); + ReadPackage("IO", "gap/io.gd"); ReadPackage("IO", "gap/pickle.gd"); ReadPackage("IO", "gap/realrandom.gd"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/src/io.c new/io-4.11.0/src/io.c --- old/io-4.10.0/src/io.c 2026-07-14 02:00:00.000000000 +0200 +++ new/io-4.11.0/src/io.c 2026-09-28 02:00:00.000000000 +0200 @@ -38,6 +38,19 @@ #include <time.h> #endif #include <errno.h> +#ifdef _WIN32 +#include <direct.h> // for _mkdir +#define WIN32_LEAN_AND_MEAN +#include <windows.h> // for GetComputerNameA +#endif + +// Tracking child processes needs SIGCHLD and waitpid, which native Windows +// lacks; without them IO cannot run subprocesses at all. Decided from the +// configure results alone: whether <signal.h> has been included by this +// point, and so whether SIGCHLD is visible, differs between platforms. +#if defined(HAVE_SIGNAL_H) && defined(HAVE_SIGNAL) && defined(HAVE_SYS_WAIT_H) +#define IO_HAVE_SIGCHLD 1 +#endif #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> #endif @@ -104,6 +117,8 @@ * we can read it out from GAP using IO.Wait. ***********************************************************************/ +#ifdef IO_HAVE_SIGCHLD + // FIXME: globals #define MAXCHLDS 1024 @@ -173,6 +188,151 @@ static void (*oldhandler)(int whichsig) = 0; // the old handler +/*********************************************************************** + * Child reaping strategy. + * + * In standalone GAP the SIGCHLD handler above reaps every child with + * waitpid(-1) and queues the statuses in the FIFO. That is unusable when + * something else in the process manages children of its own: HPC-GAP + * handles SIGCHLD on a dedicated thread, and a program embedding GAP as a + * library (e.g. julia via GAP.jl) reaps its subprocesses per pid; a foreign + * SIGCHLD handler or a waitpid(-1) stealing their statuses makes them hang. + * + * standalone GAP HPC-GAP / embedded GAP + * SIGCHLD handler IO_SIGCHLDHandler none + * reaping waitpid(-1) in the waitpid(pid) on demand, for + * handler, FIFO pids registered by IO_fork + * + * In the second mode io keeps a registry of the children it forked itself + * and touches no other process. + ***********************************************************************/ +static int use_sigchld_handler = 1; + +typedef struct { + int pid; + int ignored; // disowned via IO_IgnorePid: reap and forget +} OwnChild; + +static OwnChild ownchildren[MAXCHLDS]; +static int numownchildren = 0; + +static void RegisterOwnChild(int pid) +{ + if (numownchildren >= MAXCHLDS) { + Pr("#E Overflow in table of child processes\n", 0, 0); + return; + } + ownchildren[numownchildren].pid = pid; + ownchildren[numownchildren].ignored = 0; + numownchildren++; +} + +static int FindOwnChild(int pid) +{ + for (int i = 0; i < numownchildren; i++) + if (ownchildren[i].pid == pid) + return i; + return -1; +} + +static void ForgetOwnChild(int i) +{ + ownchildren[i] = ownchildren[--numownchildren]; +} + +// Reap disowned children that have exited, so they do not linger as +// zombies; called whenever io deals with child processes anyway. +static void ReapIgnoredOwnChildren(void) +{ + int i = 0; + while (i < numownchildren) { + int status; + if (ownchildren[i].ignored && + waitpid(ownchildren[i].pid, &status, WNOHANG) != 0) + ForgetOwnChild(i); // exited, or not our child any more + else + i++; + } +} + +static Obj MakeWaitPidRecord(int pid, int status) +{ + Obj tmp = NEW_PREC(0); + AssPRec(tmp, RNamName("pid"), INTOBJ_INT(pid)); + AssPRec(tmp, RNamName("status"), INTOBJ_INT(status)); + AssPRec(tmp, RNamName("WIFEXITED"), INTOBJ_INT(WIFEXITED(status))); + AssPRec(tmp, RNamName("WEXITSTATUS"), INTOBJ_INT(WEXITSTATUS(status))); + return tmp; +} + +// The status of <pid> is not available any more: it never was our child, +// or something else in the process reaped it first. Report it as +// terminated with unknown status if it is gone. +static Obj WaitPidStatusLost(int pid, int wait) +{ + if (kill((pid_t)pid, 0) == -1 && errno == ESRCH) { + Obj tmp = NEW_PREC(0); + AssPRec(tmp, RNamName("pid"), INTOBJ_INT(pid)); + AssPRec(tmp, RNamName("status"), Fail); + AssPRec(tmp, RNamName("WIFEXITED"), Fail); + AssPRec(tmp, RNamName("WEXITSTATUS"), Fail); + return tmp; + } + // pid still exists, but is not a child of this process + return wait ? Fail : False; +} + +// IO_WaitPid without a SIGCHLD handler: wait for one specific registered +// child, or (pid = -1) for any of them. The latter has to poll: waitpid() +// blocks on a single pid or on all children (which would steal the host's), +// and waiting for SIGCHLD would compete with the host's own handler. +#define OWN_CHILD_POLL_INTERVAL_USEC 10000 + +static Obj WaitForOwnChild(int pid, int wait) +{ + ReapIgnoredOwnChildren(); + + if (pid != -1) { + int status, retcode; + do { + retcode = waitpid(pid, &status, wait ? 0 : WNOHANG); + } while (retcode == -1 && errno == EINTR); + if (retcode == 0) + return False; + if (retcode == -1) + return WaitPidStatusLost(pid, wait); + int i = FindOwnChild(pid); + if (i != -1) + ForgetOwnChild(i); + return MakeWaitPidRecord(pid, status); + } + + while (1) { + int waiting = 0; + for (int i = 0; i < numownchildren; i++) { + int status, retcode; + if (ownchildren[i].ignored) + continue; + retcode = waitpid(ownchildren[i].pid, &status, WNOHANG); + if (retcode == -1) { + ForgetOwnChild(i--); // not our child any more + continue; + } + if (retcode == 0) { + waiting++; + continue; + } + ForgetOwnChild(i); + return MakeWaitPidRecord(retcode, status); + } + if (waiting == 0) + return Fail; // nothing to wait for + if (!wait) + return False; + usleep(OWN_CHILD_POLL_INTERVAL_USEC); + } +} + static void IO_HandleChildSignal(int retcode, int status) { if (retcode > 0) { // One of our child processes terminated @@ -200,7 +360,6 @@ } } -#ifdef HAVE_SIGNAL void IO_SIGCHLDHandler(int whichsig) { int retcode, status; @@ -215,6 +374,12 @@ static Obj FuncIO_InstallSIGCHLDHandler(Obj self) { + if (!use_sigchld_handler) { + // still needed: writing to a pipe whose reader is gone must not + // kill the process + signal(SIGPIPE, SIG_IGN); + return False; + } // Do not install ourselves twice: if (oldhandler == 0) { oldhandler = signal(SIGCHLD, IO_SIGCHLDHandler); @@ -226,7 +391,7 @@ static Obj FuncIO_RestoreSIGCHLDHandler(Obj self) { - if (oldhandler == 0) + if (!use_sigchld_handler || oldhandler == 0) return False; signal(SIGCHLD, oldhandler); @@ -267,6 +432,18 @@ return Fail; } + if (!use_sigchld_handler) { + int i = FindOwnChild(pidc); + if (i == -1) { + RegisterOwnChild(pidc); + i = FindOwnChild(pidc); + } + if (i != -1) + ownchildren[i].ignored = 1; + ReapIgnoredOwnChildren(); + return True; + } + // Make sure a new signal doesn't come in while we are changing array signal(SIGCHLD, SIG_DFL); @@ -302,9 +479,13 @@ SyClearErrorNo(); return Fail; } + pidc = INT_INTOBJ(pid); + + if (!use_sigchld_handler) + return WaitForOwnChild(pidc, wait == True); + // First set SIGCHLD to default action to avoid clashes with access: signal(SIGCHLD, SIG_DFL); - pidc = INT_INTOBJ(pid); reallytried = 0; do { pos = findSignaledPid(pidc); @@ -317,15 +498,20 @@ } // Really wait for something retcode = waitpid(-1, &status, (wait == True) ? 0 : WNOHANG); + if (retcode == -1 && errno == ECHILD) { + // There is no unreaped child left, so waiting cannot succeed; + // with wait = true, retrying would busy-loop forever. This + // happens when pid never was our child, or when something else + // in the process (another library, or a program embedding GAP) + // reaped it first and its status is lost. If the pid is gone, + // report it as terminated with unknown status. + signal(SIGCHLD, IO_SIGCHLDHandler); + return WaitPidStatusLost(pidc, wait == True); + } IO_HandleChildSignal(retcode, status); reallytried = 1; // Do not try again. } while (1); // Left by break - tmp = NEW_PREC(0); - AssPRec(tmp, RNamName("pid"), INTOBJ_INT(pids[pos])); - AssPRec(tmp, RNamName("status"), INTOBJ_INT(stats[pos])); - AssPRec(tmp, RNamName("WIFEXITED"), INTOBJ_INT(WIFEXITED(stats[pos]))); - AssPRec(tmp, RNamName("WEXITSTATUS"), - INTOBJ_INT(WEXITSTATUS(stats[pos]))); + tmp = MakeWaitPidRecord(pids[pos], stats[pos]); // Dequeue element: removeSignaledPidByPos(pos); @@ -333,7 +519,7 @@ signal(SIGCHLD, IO_SIGCHLDHandler); return tmp; } -#endif +#endif // IO_HAVE_SIGCHLD static Obj FuncIO_open(Obj self, Obj path, Obj flags, Obj mode) { @@ -670,7 +856,11 @@ } char buf[PATH_MAX]; +#ifdef _WIN32 + if (_fullpath(buf, CSTR_STRING(path), sizeof(buf))) { +#else if (realpath(CSTR_STRING(path), buf)) { +#endif return MakeImmString(buf); } @@ -718,7 +908,12 @@ return Fail; } +#ifdef _WIN32 + // Windows has no file permission bits, so <mode> is ignored + res = _mkdir(CSTR_STRING(pathname)); +#else res = mkdir(CSTR_STRING(pathname), INT_INTOBJ(mode)); +#endif if (res < 0) { SySetErrorNo(); return Fail; @@ -758,8 +953,12 @@ AssPRec(rec, RNamName("gid"), ObjInt_UInt(statbuf->st_gid)); AssPRec(rec, RNamName("rdev"), ObjInt_UInt8(statbuf->st_rdev)); AssPRec(rec, RNamName("size"), ObjInt_Int8(statbuf->st_size)); +#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE AssPRec(rec, RNamName("blksize"), ObjInt_Int8(statbuf->st_blksize)); +#endif +#ifdef HAVE_STRUCT_STAT_ST_BLOCKS AssPRec(rec, RNamName("blocks"), ObjInt_Int8(statbuf->st_blocks)); +#endif AssPRec(rec, RNamName("atime"), ObjInt_Int(statbuf->st_atime)); AssPRec(rec, RNamName("mtime"), ObjInt_Int(statbuf->st_mtime)); AssPRec(rec, RNamName("ctime"), ObjInt_Int(statbuf->st_ctime)); @@ -1514,21 +1713,77 @@ #ifdef HAVE_FORK static Obj FuncIO_fork(Obj self) { - int res; + // Make the termination signals a parent may send to stop the child + // work even if a program embedding GAP (e.g. julia via GAP.jl) blocks, + // ignores, or catches them with handlers depending on threads that do + // not survive the fork; any of these would leave the child unkillable + // except via SIGKILL. Unblock them, and mirror exec() semantics for + // their dispositions: caught becomes default action, SIG_IGN is kept + // (it may be deliberate, e.g. SIGHUP under nohup). SIGTERM is reset + // unconditionally: stopping children with it is part of IO_fork's + // contract (IO_kill, background jobs), and julia sets it to SIG_IGN. + // + // This must happen BEFORE the fork, restoring the state in the parent + // afterwards: a signal sent to a child that has not yet reset its + // inherited state would be discarded (SIG_IGN) or misdelivered, so + // resetting in the child would leave a race with a fast parent. + // The reset state also survives exec, so all this matters for + // fork+exec children, too. + static const int termsigs[] = { SIGHUP, SIGINT, SIGQUIT, SIGALRM, + SIGTERM }; + enum { NUMTERMSIGS = sizeof(termsigs) / sizeof(termsigs[0]) }; + struct sigaction saved_sa[NUMTERMSIGS]; + int saved_sa_ok[NUMTERMSIGS]; + sigset_t unblock, saved_mask; + size_t i; + int res; + FuncIO_InstallSIGCHLDHandler(0); // Ensure files are flushed before forking fflush(0); + + sigemptyset(&unblock); + for (i = 0; i < NUMTERMSIGS; i++) { + struct sigaction dfl; + sigaddset(&unblock, termsigs[i]); + saved_sa_ok[i] = (sigaction(termsigs[i], NULL, &saved_sa[i]) == 0); + if (!saved_sa_ok[i]) + continue; + if (saved_sa[i].sa_handler == SIG_DFL || + (saved_sa[i].sa_handler == SIG_IGN && termsigs[i] != SIGTERM)) + continue; + memset(&dfl, 0, sizeof(dfl)); + dfl.sa_handler = SIG_DFL; + sigemptyset(&dfl.sa_mask); + sigaction(termsigs[i], &dfl, NULL); + } + sigprocmask(SIG_UNBLOCK, &unblock, &saved_mask); + res = fork(); + + if (res != 0) { + // In parent (or fork failed): restore the signal state + sigprocmask(SIG_SETMASK, &saved_mask, NULL); + for (i = 0; i < NUMTERMSIGS; i++) { + if (saved_sa_ok[i]) + sigaction(termsigs[i], &saved_sa[i], NULL); + } + } + if (res == -1) { SySetErrorNo(); return Fail; } -#if GAP_KERNEL_MAJOR_VERSION >= 6 if (res == 0) { - // In child + // In child: the parent's children are not ours + numownchildren = 0; +#if GAP_KERNEL_MAJOR_VERSION >= 6 InformProfilingThatThisIsAForkedGAP(); - } #endif + } + else if (!use_sigchld_handler) { + RegisterOwnChild(res); + } return INTOBJ_INT(res); } #endif @@ -1654,7 +1909,12 @@ return Fail; } +#ifdef _WIN32 +// mingw declares _environ in stdlib.h +#define environ _environ +#else extern char ** environ; +#endif static Obj FuncIO_environ(Obj self) { @@ -1678,6 +1938,7 @@ return tmp; } +#ifdef HAVE_PIPE static Obj FuncIO_pipe(Obj self) { Obj tmp; @@ -1694,6 +1955,7 @@ AssPRec(tmp, RNamName("towrite"), INTOBJ_INT(fds[1])); return tmp; } +#endif static Obj FuncIO_exit(Obj self, Obj status) { @@ -1706,7 +1968,7 @@ return True; } -#ifdef HAVE_FCNTL_H +#ifdef HAVE_FCNTL static Obj FuncIO_fcntl(Obj self, Obj fd, Obj cmd, Obj arg) { int res; @@ -1865,6 +2127,17 @@ } return MakeString(name); } +#elif defined(_WIN32) +// gethostname is part of Winsock; the computer name needs no network setup +static Obj FuncIO_gethostname(Obj self) +{ + char name[MAX_COMPUTERNAME_LENGTH + 1]; + DWORD len = sizeof(name); + if (!GetComputerNameA(name, &len)) { + return Fail; + } + return MakeString(name); +} #endif static Obj FuncIO_getenv(Obj self, Obj name) @@ -1888,8 +2161,14 @@ SyClearErrorNo(); return Fail; } +#ifdef _WIN32 + // _putenv_s always overwrites + int res = _putenv_s(CONST_CSTR_STRING(name), CONST_CSTR_STRING(value)); + (void)overwrite; +#else int res = setenv(CONST_CSTR_STRING(name), CONST_CSTR_STRING(value), overwrite == True); +#endif if (res < 0) { SySetErrorNo(); return Fail; @@ -1903,7 +2182,12 @@ SyClearErrorNo(); return Fail; } +#ifdef _WIN32 + // assigning the empty value removes the variable + int res = _putenv_s(CONST_CSTR_STRING(name), ""); +#else int res = unsetenv(CONST_CSTR_STRING(name)); +#endif if (res < 0) { SySetErrorNo(); return Fail; @@ -2095,8 +2379,10 @@ IO_select, 5, "inlist, outlist, exclist, timeoutsec, timeoutusec"), #endif +#ifdef IO_HAVE_SIGCHLD GVAR_FUNC(IO_IgnorePid, 1, "pid"), -#if defined(HAVE_SIGACTION) || defined(HAVE_SIGNAL) +#endif +#ifdef IO_HAVE_SIGCHLD GVAR_FUNC(IO_WaitPid, 2, "pid, wait"), #endif @@ -2108,14 +2394,16 @@ GVAR_FUNC(IO_execvp, 2, "path, argv"), GVAR_FUNC(IO_execve, 3, "path, argv, envp"), GVAR_FUNC(IO_environ, 0, ""), -#ifdef HAVE_SIGNAL +#ifdef IO_HAVE_SIGCHLD GVAR_FUNC(IO_InstallSIGCHLDHandler, 0, ""), GVAR_FUNC(IO_RestoreSIGCHLDHandler, 0, ""), #endif +#ifdef HAVE_PIPE GVAR_FUNC(IO_pipe, 0, ""), +#endif GVAR_FUNC(IO_exit, 1, "status"), -#ifdef HAVE_FCNTL_H +#ifdef HAVE_FCNTL GVAR_FUNC(IO_fcntl, 3, "fd, cmd, arg"), #endif @@ -2147,7 +2435,7 @@ GVAR_FUNC(IO_getsockname, 1, "fd"), #endif -#ifdef HAVE_GETHOSTNAME +#if defined(HAVE_GETHOSTNAME) || defined(_WIN32) GVAR_FUNC(IO_gethostname, 0, ""), #endif @@ -2165,6 +2453,13 @@ // init filters and functions InitHdlrFuncsFromTable(GVarFuncs); + // see "Child reaping strategy" above +#ifdef HPCGAP + use_sigchld_handler = 0; +#else + use_sigchld_handler = !IsUsingLibGap(); +#endif + // return success return 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/src/pkgconfig.h.in new/io-4.11.0/src/pkgconfig.h.in --- old/io-4.10.0/src/pkgconfig.h.in 2026-07-14 02:00:00.000000000 +0200 +++ new/io-4.11.0/src/pkgconfig.h.in 2026-09-28 02:00:00.000000000 +0200 @@ -33,6 +33,9 @@ /* Define to 1 if you have the `fchown' function. */ #undef HAVE_FCHOWN +/* Define to 1 if you have the `fcntl' function. */ +#undef HAVE_FCNTL + /* Define to 1 if you have the <fcntl.h> header file. */ #undef HAVE_FCNTL_H @@ -120,12 +123,18 @@ /* Define to 1 if you have the `opendir' function. */ #undef HAVE_OPENDIR +/* Define to 1 if you have the `pipe' function. */ +#undef HAVE_PIPE + /* Define to 1 if you have the `readdir' function. */ #undef HAVE_READDIR /* Define to 1 if you have the `readlink' function. */ #undef HAVE_READLINK +/* Define to 1 if you have the `realpath' function. */ +#undef HAVE_REALPATH + /* Define to 1 if you have the `recv' function. */ #undef HAVE_RECV @@ -186,6 +195,12 @@ /* Define to 1 if you have the <string.h> header file. */ #undef HAVE_STRING_H +/* Define to 1 if `st_blksize' is a member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_BLKSIZE + +/* Define to 1 if `st_blocks' is a member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_BLOCKS + /* Define to 1 if you have the `symlink' function. */ #undef HAVE_SYMLINK diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/io-4.10.0/tst/forksignal.tst new/io-4.11.0/tst/forksignal.tst --- old/io-4.10.0/tst/forksignal.tst 1970-01-01 01:00:00.000000000 +0100 +++ new/io-4.11.0/tst/forksignal.tst 2026-09-28 02:00:00.000000000 +0200 @@ -0,0 +1,40 @@ +gap> START_TEST("forksignal.tst"); +gap> LoadPackage("IO", false);; + +# A child created by IO_fork must be terminable via SIGTERM even if the +# hosting process blocks signals (e.g. julia embedding GAP via GAP.jl): +# IO_fork resets the child's signal mask. Poll with a bounded timeout so +# a regression fails instead of hanging. +gap> p := IO_pipe();; +gap> pid := IO_fork();; +gap> if pid = 0 then +> # child: close the inherited line-by-line profile/coverage output (GAP +> # opens a per-child file; killed by a signal it would stay truncated), +> # tell the parent we are ready, then sleep, and exit in case the +> # SIGTERM below never arrives +> if IsLineByLineProfileActive() then UnprofileLineByLine(); fi; +> IO_write(p.towrite, "r", 0, 1); +> IO_select([], [], [], 60, 0); +> IO_exit(0); +> fi; +gap> pid > 0; +true +gap> ready := "";; +gap> IO_read(p.toread, ready, 0, 1); +1 +gap> IO_kill(pid, IO.SIGTERM); +true +gap> ret := false;; +gap> for i in [1..100] do +> ret := IO_WaitPid(pid, false); +> if ret <> false then break; fi; +> IO_select([], [], [], 0, 100000); +> od; + +# ret = false means the child survived SIGTERM for 10 seconds +gap> IsRecord(ret) and ret.pid = pid; +true +gap> if ret = false then IO_kill(pid, IO.SIGKILL); IO_WaitPid(pid, true); fi; +gap> IO_close(p.toread);; +gap> IO_close(p.towrite);; +gap> STOP_TEST("forksignal.tst", 1);
