1
0
Fork 0
cl-sites/guile.html_node/Asynchronous-Signals.html

110 lines
5 KiB
HTML
Raw Normal View History

2024-12-17 12:49:28 +01:00
<!DOCTYPE html>
<html>
<!-- Created by GNU Texinfo 7.1, https://www.gnu.org/software/texinfo/ -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<!-- This manual documents Guile version 3.0.10.
Copyright (C) 1996-1997, 2000-2005, 2009-2023 Free Software Foundation,
Inc.
Copyright (C) 2021 Maxime Devos
Copyright (C) 2024 Tomas Volf
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A
copy of the license is included in the section entitled "GNU Free
Documentation License." -->
<title>Asynchronous Signals (Guile Reference Manual)</title>
<meta name="description" content="Asynchronous Signals (Guile Reference Manual)">
<meta name="keywords" content="Asynchronous Signals (Guile Reference Manual)">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content=".texi2any-real">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href="index.html" rel="start" title="Top">
<link href="Concept-Index.html" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="General-Libguile-Concepts.html" rel="up" title="General Libguile Concepts">
<link href="Multi_002dThreading.html" rel="next" title="Multi-Threading">
<link href="Control-Flow.html" rel="prev" title="Control Flow">
<style type="text/css">
<!--
a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
div.example {margin-left: 3.2em}
kbd.key {font-style: normal}
span:hover a.copiable-link {visibility: visible}
-->
</style>
<link rel="stylesheet" type="text/css" href="https://www.gnu.org/software/gnulib/manual.css">
</head>
<body lang="en">
<div class="subsection-level-extent" id="Asynchronous-Signals">
<div class="nav-panel">
<p>
Next: <a href="Multi_002dThreading.html" accesskey="n" rel="next">Multi-Threading</a>, Previous: <a href="Control-Flow.html" accesskey="p" rel="prev">Control Flow</a>, Up: <a href="General-Libguile-Concepts.html" accesskey="u" rel="up">General concepts for using libguile</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<h4 class="subsection" id="Asynchronous-Signals-1"><span>5.4.4 Asynchronous Signals<a class="copiable-link" href="#Asynchronous-Signals-1"> &para;</a></span></h4>
<p>You can not call libguile functions from handlers for POSIX signals, but
you can register Scheme handlers for POSIX signals such as
<code class="code">SIGINT</code>. These handlers do not run during the actual signal
delivery. Instead, they are run when the program (more precisely, the
thread that the handler has been registered for) reaches the next
<em class="emph">safe point</em>.
</p>
<p>The libguile functions themselves have many such safe points.
Consequently, you must be prepared for arbitrary actions anytime you
call a libguile function. For example, even <code class="code">scm_cons</code> can contain
a safe point and when a signal handler is pending for your thread,
calling <code class="code">scm_cons</code> will run this handler and anything might happen,
including a non-local exit although <code class="code">scm_cons</code> would not ordinarily
do such a thing on its own.
</p>
<p>If you do not want to allow the running of asynchronous signal handlers,
you can block them temporarily with <code class="code">scm_dynwind_block_asyncs</code>, for
example. See <a class="xref" href="Asyncs.html">Asynchronous Interrupts</a>.
</p>
<p>Since signal handling in Guile relies on safe points, you need to make
sure that your functions do offer enough of them. Normally, calling
libguile functions in the normal course of action is all that is needed.
But when a thread might spent a long time in a code section that calls
no libguile function, it is good to include explicit safe points. This
can allow the user to interrupt your code with <kbd class="key">C-c</kbd>, for example.
</p>
<p>You can do this with the macro <code class="code">SCM_TICK</code>. This macro is
syntactically a statement. That is, you could use it like this:
</p>
<div class="example">
<pre class="example-preformatted">while (1)
{
SCM_TICK;
do_some_work ();
}
</pre></div>
<p>Frequent execution of a safe point is even more important in multi
threaded programs, See <a class="xref" href="Multi_002dThreading.html">Multi-Threading</a>.
</p>
</div>
<hr>
<div class="nav-panel">
<p>
Next: <a href="Multi_002dThreading.html">Multi-Threading</a>, Previous: <a href="Control-Flow.html">Control Flow</a>, Up: <a href="General-Libguile-Concepts.html">General concepts for using libguile</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>