[Rd] interrupting native code
Kjell Konis
kjell.konis at epfl.ch
Fri May 16 13:15:59 CEST 2008
You mean something like this (I return 1 instead of calling onintr())?
Will HAVE_AQUA and Win32 be appropriately defined when building my
package (I can't see how to check with R CMD config)?
int My_CheckUserInterrupt(void)
{
R_CheckStack();
#if ( defined(HAVE_AQUA) )
/* R_ProcessEvents() from unix/aqua.c*/
if (ptr_R_ProcessEvents)
ptr_R_ProcessEvents();
if (R_interrupts_pending)
return(1);
#elseif ( defined(Win32) )
/* R_ProcessEvents() from gnuwin32/system.c */
while (peekevent()) doevent();
if (UserBreak) {
UserBreak = FALSE;
return(1);
}
R_CallBackHook();
if(R_tcldo) R_tcldo();
#else
R_PolledEvents();
if (R_interrupts_pending)
return(1);
#endif
return(0);
}
On 16 mai 08, at 12:43, Prof Brian Ripley wrote:
> On Fri, 16 May 2008, Kjell Konis wrote:
>
>> The problem is that my package uses an external pointer to keep
>> track of a structure created by the lp_solve library. If I use
>> R_CheckUserInterrupt in the lp_solve abort function it leaves the
>> structure in a messed-up state after an interrupt occurs. I am not
>> even able to free the memory allocated in the structure. I need to
>> be able to tell the lp_solve functions to interrupt themselves if I
>> am going to support interrupts at all.
>>
>> I took a longer look at errors.c and it seems my solution should
>> work as long as neither HAVE_AQUA nor Win32 are defined. Under the
>> circumstances, I think that's the best I can do.
>>
>> Any suggestions for a UI independent way to check for interrupts
>> would be appreciated.
>
> Why not use the same code as R_CheckUserInterrupt but instead of
> calling onintr, call your own interrupt routine?
>
>>
>> Thanks,
>> Kjell
>>
>> On 15 mai 08, at 16:41, Prof Brian Ripley wrote:
>>
>>> How is R_interrupts_pending going to be set?
>>> It is set in the interrupt handler for SIGINT, but that is not the
>>> only way to indicate an interrupt, and it is not necessarily
>>> available to users of GUIs and embedded R.
>>> Without servicing the GUIs all interaction will be dead, including
>>> sending an interrrupt from menus/buttons/keyboard. See the
>>> comment in the code for R_CheckUserInterrupt.
>>> On Thu, 15 May 2008, Kjell Konis wrote:
>>>> Hello,
>>>> I have some native code that I would like to allow users to
>>>> interrupt. However, I would like to do it more gracefully than
>>>> with R_CheckUserInterrupt(). The solution I came up with is to
>>>> call the following abort function periodically - if it returns 1
>>>> then I clean up and return.
>>>> int __WINAPI RlpSolveAbortFunction(lprec *lp, void *userhandle)
>>>> {
>>>> if(R_interrupts_pending)
>>>> return(1);
>>>> return(0);
>>>> }
>>>> This seems to work fine on Mac (sans Aqua) and Linux. Is this
>>>> going to be portable? Also, is there anything else I need to
>>>> do? For instance set R_interrupts_pending to 0 after I respond
>>>> to it?
>>>> Thanks.
>>>> Kjell
>>>> ______________________________________________
>>>> R-devel at r-project.org mailing list
>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>> --
>>> Brian D. Ripley, ripley at stats.ox.ac.uk
>>> Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
>>> University of Oxford, Tel: +44 1865 272861 (self)
>>> 1 South Parks Road, +44 1865 272866 (PA)
>>> Oxford OX1 3TG, UK Fax: +44 1865 272595
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>
> --
> Brian D. Ripley, ripley at stats.ox.ac.uk
> Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
> University of Oxford, Tel: +44 1865 272861 (self)
> 1 South Parks Road, +44 1865 272866 (PA)
> Oxford OX1 3TG, UK Fax: +44 1865 272595
More information about the R-devel
mailing list