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.kalib...@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@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 -- Peter Dalgaard, Professor, Center for Statistics, Copenhagen Business School Solbjerg Plads 3, 2000 Frederiksberg, Denmark Phone: (+45)38153501 Office: A 4.23 Email: pd....@cbs.dk Priv: pda...@gmail.com ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel