Thanks for pointing that out.  I don&#39;t pretend to understand the reasons but that method seems to be much more responsive than the throw/catch method.  It seems like the throw catch should be just as efficient, and should add very little overhead.  It does not add overhead, but the R_CheckUserInterupt also does not appear to add significant overhead either.  The throw method seems to take a very long time between when the interrupt is sent before the error is caught.   Is there a way to speed up the throw/catch?<div>
<br></div><div>-Andrew<br><div><br></div><div><br><br><div class="gmail_quote">On Wed, Dec 8, 2010 at 3:42 PM, Davor Cubranic <span dir="ltr">&lt;<a href="mailto:cubranic@stat.ubc.ca">cubranic@stat.ubc.ca</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">How about just using R_CheckUserInterrupt()?<br>
<font color="#888888"><br>
Davor<br>
</font><div><div></div><div class="h5"><br>
<br>
On 2010-12-08, at 1:02 PM, Dirk Eddelbuettel wrote:<br>
<br>
&gt;<br>
&gt; On 8 December 2010 at 13:41, Andrew Redd wrote:<br>
&gt; | I have an MCMC chain that runs entirely in c++ with Rcpp.  It sometimes runs<br>
&gt; | for a vary long time and I want to interrupt it.  Is there an efficient easy<br>
&gt; | way to include catching an interupt signal and either aborting or returning<br>
&gt; | results to that point?  This might be understood well, if so I apologize.<br>
&gt;<br>
&gt; Great question.<br>
&gt;<br>
&gt; Here is a simple example that uses a standard C interrupt handler to set a<br>
&gt; standard C++ exception to abort:<br>
&gt;<br>
&gt; ----------------------------------------------------------------<br>
&gt;<br>
&gt; #include &lt;csignal&gt;<br>
&gt; #include &lt;Rcpp.h&gt;<br>
&gt;<br>
&gt; void intHandler(int dummy=0) {<br>
&gt;  std::cerr &lt;&lt; &quot;In intHandler&quot; &lt;&lt; std::endl;<br>
&gt;  throw std::runtime_error(&quot;Interception caught&quot;);<br>
&gt; }<br>
&gt;<br>
&gt; RcppExport SEXP foo(void) {<br>
&gt;<br>
&gt;  try {<br>
&gt;<br>
&gt;    signal(SIGINT, intHandler);<br>
&gt;    signal(SIGKILL, intHandler);<br>
&gt;<br>
&gt;    while (true) {<br>
&gt;      sleep(1);                        // not doing much<br>
&gt;    }<br>
&gt;    return R_NilValue;<br>
&gt;<br>
&gt;  } catch(std::exception &amp;ex) {<br>
&gt;    std::cerr &lt;&lt; &quot;In catch of std::exeception&quot; &lt;&lt; std::endl;<br>
&gt;    // here you insert some clenup<br>
&gt;    forward_exception_to_r(ex);<br>
&gt;<br>
&gt;  } catch(...) {<br>
&gt;    ::Rf_error(&quot;c++ exception (unknown reason)&quot;);<br>
&gt;  }<br>
&gt;<br>
&gt;  return R_NilValue;<br>
&gt; }<br>
&gt;<br>
&gt; ----------------------------------------------------------------<br>
&gt;<br>
&gt; which I then quickly turned into a shared object, load and ran at the<br>
&gt; command-line [1]<br>
&gt;<br>
&gt; edd@max:/tmp/andrew$ PKG_CPPFLAGS=`r -e&#39;Rcpp:::CxxFlags()&#39;` PKG_LIBS=`r -e&#39;Rcpp:::LdFlags()&#39;` R CMD SHLIB int2throw.cpp<br>
&gt; ccache g++ -I/usr/share/R/include -I/usr/local/lib/R/site-library/Rcpp/include     -fpic  -g -O3 -Wall -pipe -pedantic -Wno-variadic-macros -c int2throw.cpp -o int2throw.o<br>
&gt; g++ -shared -o int2throw.so int2throw.o -L/usr/local/lib/R/site-library/Rcpp/lib -lRcpp -Wl,-rpath,/usr/local/lib/R/site-library/Rcpp/lib -L/usr/lib64/R/lib -lR<br>
&gt; edd@max:/tmp/andrew$ r -e&#39;dyn.load(&quot;int2throw.so&quot;); .Call(&quot;foo&quot;)&#39;<br>
&gt; ^CIn intHandler<br>
&gt; In catch of std::exeception<br>
&gt; Error in cpp_exception(message = &quot;Interception caught&quot;, class = &quot;std::runtime_error&quot;) :<br>
&gt;  Interception caught<br>
&gt; Execution halted<br>
&gt; edd@max:/tmp/andrew$<br>
&gt; edd@max:/tmp/andrew$<br>
&gt;<br>
&gt;<br>
&gt; After lauching it from the one-line littler (r) expression, I pressed Ctrl-C<br>
&gt; which then got us into the interrupt which threw the exception which lead to<br>
&gt; the end.<br>
&gt;<br>
&gt; In Rscript it looks a little more orderly on the unwind:<br>
&gt;<br>
&gt; edd@max:/tmp/andrew$ Rscript -e &#39;dyn.load(&quot;int2throw.so&quot;); .Call(&quot;foo&quot;)&#39;<br>
&gt;  C-c C-cIn intHandler<br>
&gt; In catch of std::exeception<br>
&gt; Error in cpp_exception(message = &quot;Interception caught&quot;, class = &quot;std::runtime_error&quot;) :<br>
&gt;  Interception caught<br>
&gt; Calls: .Call -&gt; cpp_exception<br>
&gt; Execution halted<br>
&gt; edd@max:/tmp/andrew$<br>
&gt;<br>
&gt;<br>
&gt; Hope this helps,  Dirk<br>
&gt;<br>
&gt;<br>
&gt; [1] Not sure why I didn&#39;t use inline today...<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Dirk Eddelbuettel | <a href="mailto:edd@debian.org">edd@debian.org</a> | <a href="http://dirk.eddelbuettel.com" target="_blank">http://dirk.eddelbuettel.com</a><br>
</div></div><div><div></div><div class="h5">&gt; _______________________________________________<br>
&gt; Rcpp-devel mailing list<br>
&gt; <a href="mailto:Rcpp-devel@lists.r-forge.r-project.org">Rcpp-devel@lists.r-forge.r-project.org</a><br>
&gt; <a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel" target="_blank">https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel</a><br>
<br>
</div></div></blockquote></div><br></div></div>