[Rd] Tcl socket server (tcltk) does not work any more on R 4.3.2

peter dalgaard pd@|gd @end|ng |rom gm@||@com
Wed Feb 21 17:49:41 CET 2024


The obvious problem with

while (Tcl_DoOneEvent(TCL_DONT_WAIT) && max_ev) max_ev—;

is that once something does the http server thing, you'll be running Tcl_DoOneEvent max_ev times, _every_ time you hit TclSpinLoop.

I wonder it we could some sort of hybrid between this and Tcl_ServiceAll()? Like, calling Tcl_DoOneEvent once before/after Tcl_ServiceAll().

- Peter

> On 21 Feb 2024, at 17:04 , Tomas Kalibera <tomas.kalibera using gmail.com> wrote:
> 
> 
> 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 using r-project.org> a écrit :
>>> 
>>> В Tue, 20 Feb 2024 12:27:35 +0100
>>> "webmail.gandi.net" <phgrosjean using 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 using r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>> 
>> 	[[alternative HTML version deleted]]
>> 
>> ______________________________________________
>> R-devel using r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel

-- 
Peter Dalgaard, Professor,
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Office: A 4.23
Email: pd.mes using cbs.dk  Priv: PDalgd using gmail.com



More information about the R-devel mailing list