From kjell.konis at epfl.ch  Fri May 16 12:35:17 2008
From: kjell.konis at epfl.ch (Kjell Konis)
Date: Fri, 16 May 2008 12:35:17 +0200
Subject: [Rd] interrupting native code
In-Reply-To: <alpine.LFD.1.10.0805151533180.22788@gannet.stats.ox.ac.uk>
References: <B2675BBE-97A5-4012-A855-6955F6EE8246@epfl.ch>
	<alpine.LFD.1.10.0805151533180.22788@gannet.stats.ox.ac.uk>
Message-ID: <80A6B7A3-7979-4A70-8FBF-3EBA753E093E@epfl.ch>

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.

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



[Rd] interrupting native code
Kjell Konis