В Wed, 21 Feb 2024 08:01:16 +0100 "webmail.gandi.net" <phgrosj...@sciviews.org> пишет:
> 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. I forgot to mention the comment in the new version of the function explaining the switch: >> [Tcl_DoOneEvent(TCL_DONT_WAIT)] <...> causes infinite recursion with >> R handlers that have a re-entrancy guard, when TclSpinLoop is >> invoked from such a handler (seen with Rhttp server) The difference between Tcl_ServiceAll() and Tcl_DoOneEvent() is that the latter calls Tcl_WaitForEvent(). The comments say that it is called for the side effect of queuing the events detected by select(). The function can indeed be observed to access the fileHandlers via the thread-specific data pointer, which contain the file descriptors and the instructions saying what to do with them. Without Tcl_WaitForEvent, the only event sources known to Tcl are RTcl_{setup,check}Proc (which only checks file descriptors owned by R), Display{Setup,Check}Proc (which seems to be owned by Tk), and Timer{Setup,Check}Proc (for which there doesn't seem to be any timers by default). As far as I understand the problem, while the function worker_input_handler() from src/modules/internet/Rhttpd.c is running, TclHandler() might be invoked, causing Tcl_DoOneEvent() to call RTcl_checkProc() and therefore trying to run worker_input_handler() again. The Rhttpd handler prevents this and doesn't clear the condition, which causes the event loop to keep calling it. Is that correct? Are there easy ways to reproduce the problem? -- Best regards, Ivan ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel