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

2024-02-20 Thread webmail.gandi.net
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.

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  a 
> écrit :
> 
> В Tue, 20 Feb 2024 12:27:35 +0100
> "webmail.gandi.net"  пишет:
> 
>> 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


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

2024-02-20 Thread webmail.gandi.net
Dear list,

It seems that something changed between R 4.2.3 and R 4.3 (tested with 4.3.2) 
that broke the Tcl socket server. Here is a reproducible example:

- R process #1 (Tcl socket server):

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)

- R process #2 (socket client):

con <- socketConnection(host = "localhost", port = 12345, blocking = FALSE)
writeLines("Hello, world!", con) # Should print something in R #1 stdout
readLines(con) # Should receive "goodbye"
close(con)

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.

I am stuck with this. Thanks in advance for help.

Regards,

Philippe

> .Tcl("puts [info patchlevel]")
8.6.13
  

> sessionInfo()
R version 4.3.2 (2023-10-31)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Sonoma 14.2.1

Matrix products: default
BLAS:   
/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
 
LAPACK: 
/Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRlapack.dylib;
  LAPACK version 3.11.0

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

time zone: Europe/Brussels
tzcode source: internal

attached base packages:
[1] tcltk stats graphics  grDevices utils datasets  methods   base  
   

loaded via a namespace (and not attached):
[1] compiler_4.3.2 tools_4.3.2glue_1.7.0  
__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel