From jalvesaq at gmail.com  Sun Dec 16 11:56:06 2012
From: jalvesaq at gmail.com (Jakson Alves de Aquino)
Date: Sun, 16 Dec 2012 07:56:06 -0300
Subject: [Rd] Could Rstd_Busy do something (src/unix/sys-std.c)?
In-Reply-To: <954366D2-3EC2-43B3-ABB9-16490F011370@r-project.org>
References: <CAGBu4CNTtEcBEA6yB5tM8JkEDdVyTAr2xC+75Ay+dFM30=BTMg@mail.gmail.com>
	<CDB0FA0A-94E8-4BFA-961F-4ADA4ED04A2F@r-project.org>
	<CAGBu4CPT_wK5xjdFxX0WrF=TxiS8-7zYENZ6FP=XkYVo41yyRg@mail.gmail.com>
	<77436EA2-B617-4267-9694-B1CCB35FF4B2@r-project.org>
	<CAGBu4CONPpAh2T=3mzGLf9TEgDCW-3P4x2WKeD76FXV44srspg@mail.gmail.com>
	<954366D2-3EC2-43B3-ABB9-16490F011370@r-project.org>
Message-ID: <CAGBu4COjqwdMRzNcQNi_a2=oRXv5k2j-eZMNOqBOSJ5nvQA+wQ@mail.gmail.com>

On Sun, Dec 16, 2012 at 12:49 AM, Simon Urbanek
<simon.urbanek at r-project.org> wrote:
> Note that you're not using the payload of the pipe at all, so you
> could simply just send a single byte (not that it matters but you
> don't need the 16-byte packets).
>
> Also you don't want to send anything if the signal is already
> enqueued, it's pointless to try to send more (you could clog the
> pipe), so simply use a flag that you set on write and reset it on
> read -- if that flag is set you don't write anything. That will make
> sure that you get only one trigger even if more signals arrived
> while R is busy.  Everything is synchronous here so no need to
> worry.
>
> Finally, I wouldn't mess with the signal all the time - just keep it
> active without touching it and use a flag to avoid re-entrance if
> you really think it's necessary.

Thanks for the additional suggestions. It's even better now:

    void handle_winch(int sig){
        if(fired)
            return;
        fired = 1;
        char buf[16];
        *buf = 0;
        if(write(ofd, buf, 1) <= 0)
            REprintf("setwidth error: write <= 0\n");
    }

    static void uih(void *data) {
        char buf[16];
        if(read(ifd, buf, 16) == 0)
            REprintf("setwidth error: read = 0\n");
        R_ToplevelExec(setwidth_Set, NULL);
        fired = 0;
    }

Best,

Jakson



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