[Rd] Could Rstd_Busy do something (src/unix/sys-std.c)?

Simon Urbanek simon.urbanek at r-project.org
Sat Dec 15 21:41:23 CET 2012


On Dec 15, 2012, at 2:20 PM, Jakson Alves de Aquino wrote:

> On Sat, Dec 15, 2012 at 1:09 PM, Simon Urbanek
> <simon.urbanek at r-project.org> wrote:
>> On Dec 15, 2012, at 6:36 AM, Jakson Alves de Aquino wrote:
>>> I could avoid the crash if I knew that R is busy at the moment that
>>> it receives the SIGWINCH. Thus my question is: Could Rstd_Busy()
>>> set the value of a variable so packages like setwidth could know
>>> that R is busy?
>> 
>> You're looking at the wrong spot - the Busy callback is meant for UI
>> signaling that R may enter a longer time of processing, it is not
>> really an indicator that R is busy - R can be busy even without the
>> busy state being signaled.
> 
> Thanks for your suggestions!
> 
> Although the comment above Rstd_Busy() (at src/unix/sys-std.c) says
> "actions during (long) computations", the function is called whenever
> any command is entered in R Console.
> 
>> But back to your original question - there are a few spots where you
>> can process you request : the most obvious one is in the ReadConsole
>> callback - that callback doesn't return until the user has entered a
>> line - this would be a way to a GUI to handle this.
> 
> Both ptr_R_Busy and ptr_R_ReadConsole are declared on Rinterface.h,
> but I can't use them because setwidth doesn't provide front-end to R
> and Rinterface.h has the following statements:
> 
>    This header file is to provide hooks for alternative front-ends,
>    e.g. GUIs such as GNOME and Cocoa.  [...] It should not be
>    included by package sources unless they are providing such a
>    front-end.
> 
>> The other way is to register an input handler and signal your FD
>> when you get SIGWINCH, that guarantees that your handler will be
>> called as soon as possible after the signal has arrived - that is
>> probably what you want (see CarbonEL for a simple example how this
>> is used).
> 
> Based on CarbolEL, I added the following to setwidth_Start() function:
> 
>    int fds[2];
>    if(pipe(fds))
>        Rprintf("pipe > 0\n");
>    else
>        Rprintf("pipe = 0\n");
>    ifd = fds[0];
>    ofd = fds[1];
>    addInputHandler(R_InputHandlers, ifd, &uih, 32);
> 
> And, also based on CarbolEL, I created the following uih() function:
> 
>    static void uih(void *data) {
>      char buf[16];
> 
>      if(read(ifd, buf, 16) == 0){
>          Rprintf("read = 0 :: %s\n", buf);
>          Rprintf("%d written\n", write(ofd, buf, 16));
>      } else {
>          Rprintf("read != 0\n");
>      }
>    }
> 
> However, the uih() function never gets called.
> 

You didn't provide the signal yet - you have the initialization and receiving end ready - now you need to write the piece that triggers the input.

Cheers,
S


> Best,
> 
> -- 
> Jakson Alves de Aquino
> Federal University of Ceará
> Social Sciences Department
> www.lepem.ufc.br/aquino.php
> 
> 



More information about the R-devel mailing list