On 2/21/24 08:01, webmail.gandi.net wrote:
Thank you, Ivan for this investigation. I inspected the R changes file 
(https://cran.r-project.org/doc/manuals/r-devel/NEWS.html) and found nothing 
about this. I should inspect the sources too!

It could possibly break other Tcl/Tk related stuff. The doc about 
Tcl_ServiceAll and Tcl_DoOneEvent is confusing. On one hand, it says when Tcl 
is used from an external program, Tcl_ServiceAll should be used in its event 
loop instead of Tcl_DoOneEvent (and the change in the latest R versions goes in 
that direction). But in the other hand, it is indicated that Tcl_ServiceAll 
does not always handle all Tcl events and extra Tcl_DoOneEvent should be called 
in this case. I think we spotted one case where Tcl_ServiceAll is not doing its 
job correctly. There may be others.

Since the {tcltk} package was working fine with  "while (Tcl_DoOneEvent(TCL_DONT_WAIT) && max_ev) 
max_ev—;", unless there is a clear performance enhancement with "while (i-- && 
Tcl_ServiceAll())", it would perhaps be wise to revert this back.

Yes, for now I've done that in R-devel. The Tcl documentation is really hard to follow, but debugging reveals that Tcl_ServiceAll() doesn't queue new events, as also Ivan reports.

Tomas


Indeed, when I use this on the server side with R 4.3.2:

library(tcltk)
cmd <- r"(
  proc accept {chan addr port} {         ;# Make a proc to accept connections
    puts "$addr:$port says [gets $chan]" ;# Receive a string
    puts $chan goodbye                   ;# Send a string
    close $chan                          ;# Close the socket (automatically 
flushes)
}                                       ;#
socket -server accept 12345             ;# Create a server socket)"
.Tcl(cmd)
.Tcl("vwait myvar")

It works again as expected. And vwait is known to call Tcl_DoOneEvent. Of 
course, in this case, R is blocked and waits for the `myvar` variable on the 
Tcl side. Anyway, the problem seems to be really in Tcl_ServiceAll not catching 
all Tcl events.

All the best,

Philippe

..............................................<°}))><........
  ) ) ) ) )
( ( ( ( (    Prof. Philippe Grosjean
  ) ) ) ) )
( ( ( ( (    Numerical Ecology
  ) ) ) ) )   Mons University, Belgium
( ( ( ( (
..............................................................

Le 20 févr. 2024 à 17:13, Ivan Krylov via R-devel <r-devel@r-project.org> a 
écrit :

В Tue, 20 Feb 2024 12:27:35 +0100
"webmail.gandi.net" <phgrosj...@sciviews.org> пишет:

When R process #1 is R 4.2.3, it works as expected (whatever version
of R #2). When R process #1 is R 4.3.2, nothing is sent or received
through the socket apparently, but no error is issued and process #2
seems to be able to connect to the socket.
The difference is related to the change in
src/library/tcltk/src/tcltk_unix.c.

In R-4.2.1, the function static void TclSpinLoop(void *data) says:

    int max_ev = 100;
    /* Tcl_ServiceAll is not enough here, for reasons that escape me */
    while (Tcl_DoOneEvent(TCL_DONT_WAIT) && max_ev) max_ev--;

In R-devel, the function instead says:

    int i = R_TCL_SPIN_MAX;     
    while (i-- && Tcl_ServiceAll())
        ;

Manually calling Tcl_DoOneEvent(0) from the debugger at this point
makes the Tcl code respond to the connection. Tcl_ServiceAll() seems to
be still not enough. I'll try reading Tcl documentation to investigate
this further.

--
Best regards,
Ivan

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

        [[alternative HTML version deleted]]

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to