> On Oct 7, 2026, at 5:22 PM, Paul Rockwell <[email protected]> wrote:
> 
> SVN'd up to 2136. Issue still exists. I'll do some additional debugging and 
> see if I can get any more info.
> 
> - Paul
> 
> 
>> On Oct 7, 2026, at 7:39 AM, Dr. Jürgen Sauermann <mail@jürgen-sauermann.de> 
>> wrote:
>> 
>> Hi Paul,
>> 
>> thank you for your report and for tracking it down to listen_sock().
>> It is dealt with in SVN 2136.
>> 
>> Summary
>> -------
>> Fixed:                 2  (#1, #2)
>> Not a bug:             1  (#3)
>> 
>> Fixed
>> -----
>> #1  "listen socket has died unexpectedly": APserver no longer probes its
>>     listening socket with read(). That probe was meaningless (macOS fails
>>     it with ENOTCONN, as you found), had no corrective action, and
>>     printed its message on every pass of APserver's main loop, i.e. at
>>     least once a second.
>> 
>> #2  "::connect() to supposedly existing APserver failed: Socket is
>>     already connected" (and the APserver that keeps running after the
>>     interpreter has exited): the interpreter retried ::connect() on the
>>     same socket after a failed attempt. After a failed ::connect() the
>>     state of a socket is unspecified; Linux accepts another ::connect()
>>     on it, but macOS does not. As a consequence your interpreter never
>>     connected to the APserver it had just started, and APserver, which
>>     exits only when its last connection is closed, kept running. Every
>>     attempt now uses a fresh socket.
>> 
>>     In addition, if the connection to APserver fails anyway, the
>>     interpreter now continues as if shared variables were disabled
>>     (instead of reporting "Svar_DB not connected" later on).
>> 
>> I could only verify that nothing breaks on Linux, where the problem
>> does not occur. It would be great if you could check the fix on macOS.
>> 
>> Not a bug
>> ---------
>> #3  Shared variables disabled by default: this is already a user
>>     preference. "SharedVars Disabled" in the system-wide or in your own
>>     preferences file disables them (as you already do), and the command
>>     line options --noSV and --SV override the preference for a single
>>     run. The default stays enabled for compatibility with existing
>>     applications that use ⎕SVO.
>> 
>>     The new debug command ]STATUS (or the command line option
>>     apl --status) shows whether shared variables are enabled, whether
>>     the connection to APserver works, and if not, why not (e.g. which
>>     preferences file and line disabled them). It does the same for the
>>     other optional features of GNU APL.
>> 
>> Best Regards,
>> Jürgen
>> 
>> PS: The analysis of your report and the resulting changes were made with
>> the help of Claude Code (Anthropic). All changes were reviewed by me and
>> verified against the GNU APL testcases before being committed.
>> 
>> 
>> On 10/5/26 20:10, Paul Rockwell wrote:
>>> I preface this by understanding that shared variables ((⎕SVO,etc) are 
>>> considered an obsolete feature of GNU APL. I have my preferences set so 
>>> that APserver is never started by default. But I've come across the 
>>> following when using the default GNU APL behavior of enabling shared 
>>> variable support. 
>>> 
>>> When starting the interpreter in SVN 2133 on macOS 26 and 27 with the 
>>> shared variable support enabled, I'm greeted with the following:
>>> 
>>> % apl --SV
>>> /usr/local/bin/APserver: listen socket has died unexpectedly
>>> /usr/local/bin/APserver: listen socket has died unexpectedly
>>> ::connect() to supposedly existing APserver failed: Socket is already 
>>> connected
>>> 
>>>                     ______ _   __ __  __    ___     ____   __ 
>>>                    / ____// | / // / / /   /   |   / __ \ / / 
>>>                   / / __ /  |/ // / / /   / /| |  / /_/ // /  
>>>                  / /_/ // /|  // /_/ /   / ___ | / ____// /___
>>>                  \____//_/ |_/ \____/   /_/  |_|/_/    /_____/
>>> 
>>>                   Welcome to GNU APL version 2.0 / SVN: 2133M
>>> 
>>>                  Copyright © 2008-2026  Dr. Jürgen Sauermann
>>>                        Banner by FIGlet: www.figlet.org 
>>> <http://www.figlet.org/>
>>> 
>>>                 This program comes with ABSOLUTELY NO WARRANTY;
>>>                           for details run: apl --gpl.
>>> 
>>>      This program is free software, and you are welcome to redistribute it
>>>      according to the GNU General Public License (GPL) version 3 or later.
>>> 
>>> Svar_DB not connected in Svar_DB::is_registered_id() (APserver not running; 
>>> shared variables unavailable)
>>>       /usr/local/bin/APserver: listen socket has died unexpectedly
>>> /usr/local/bin/APserver: listen socket has died unexpectedly
>>> )      /usr/local/bin/APserver: listen socket has died unexpectedly
>>> o       ff
>>> 
>>> Goodbye.
>>> Session duration: 4.67723 seconds 
>>> paulrockwell@Upstairs ~ % /usr/local/bin/APserver: listen socket has died 
>>> unexpectedly
>>> k/usr/local/bin/APserver: listen socket has died unexpectedly
>>> killall/usr/local/bin/APserver: listen socket has died unexpectedly
>>>  AP/usr/local/bin/APserver: listen socket has died unexpectedly
>>> serv/usr/local/bin/APserver: listen socket has died unexpectedly
>>> er
>>> 
>>> The error messages from APserver continue after I stop the interpreter 
>>> because the /usr/local/bin/APserver process is still running in the 
>>> background. I have to locate and kill the process manually.
>>> 
>>> Debugging the source code by executing APserver manually like GNU APL is 
>>> doing behind the scenes revealed that the followng code in 
>>> src/APs/APserver.cc <http://apserver.cc/>  function listen_sock() is 
>>> returning failure:
>>> 
>>>         // read() cannot be used to probe a Winsock SOCKET on Windows --
>>>         // it is not a CRT file descriptor, only recv()/send()/ioctlsocket()
>>>         // are valid on it -- so this always (falsely) reported the listen
>>>         // socket, and then any freshly accepted connection, as dead on
>>>         // every pass, immediately closing real connections again via
>>>         // close_fd() below. A dead listen socket has no corrective action
>>>         // here anyway (just the message); on Windows a dead per-connection
>>>         // socket is still caught by the normal recv() return value once
>>>         // real data-handling code runs on it later in the loop, the same
>>>         // way most Windows socket servers detect a disconnect.
>>>         if (0 != read(listen_sock, &dummy, 0))
>>>            cerr << prog << ": listen socket has died unexpectedly" << endl;
>>> 
>>> 
>>> The read() on listen_sock is returning error code 57 (ENOTCONN), in case 
>>> that helps. 
>>> 
>>> I've included the configure output, config.log, and config.h so you can see 
>>> how GNU APL has been configured. 
>>> 
>>> A side request: If you consider shared variable support to be obsolete, 
>>> could the global GNU APL preferences be configured so that shared variable 
>>> support is disabled by default?
>>> 
>>> 
>>> 
>>> 
>>> - Paul Rockwell
>>> 
>> 
> 

Reply via email to