[Rd] interrupting native code
Prof Brian Ripley
ripley at stats.ox.ac.uk
Fri May 16 12:43:28 CEST 2008
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