mirror of
https://github.com/systemd/systemd.git
synced 2024-11-27 04:03:36 +08:00
b4096cecff
The need to set errno is very very ugly, but at least it is thread-safe and works correctly. Using strerror() is likely to be wrong, so let's not recommend that. People who do a lot of logging would provide use some wrapper that sets errno like we do, so nudge people towards %m. I tested that all the separate .c files compile cleanly.
219 lines
9.5 KiB
XML
219 lines
9.5 KiB
XML
<?xml version='1.0'?>
|
|
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
|
|
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
|
|
<!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
|
|
|
|
<refentry id="sd_event_new" xmlns:xi="http://www.w3.org/2001/XInclude">
|
|
|
|
<refentryinfo>
|
|
<title>sd_event_new</title>
|
|
<productname>systemd</productname>
|
|
</refentryinfo>
|
|
|
|
<refmeta>
|
|
<refentrytitle>sd_event_new</refentrytitle>
|
|
<manvolnum>3</manvolnum>
|
|
</refmeta>
|
|
|
|
<refnamediv>
|
|
<refname>sd_event_new</refname>
|
|
<refname>sd_event_default</refname>
|
|
<refname>sd_event_ref</refname>
|
|
<refname>sd_event_unref</refname>
|
|
<refname>sd_event_unrefp</refname>
|
|
<refname>sd_event_get_tid</refname>
|
|
<refname>sd_event</refname>
|
|
|
|
<refpurpose>Acquire and release an event loop object</refpurpose>
|
|
</refnamediv>
|
|
|
|
<refsynopsisdiv>
|
|
<funcsynopsis>
|
|
<funcsynopsisinfo>#include <systemd/sd-event.h></funcsynopsisinfo>
|
|
|
|
<funcsynopsisinfo><token>typedef</token> struct sd_event sd_event;</funcsynopsisinfo>
|
|
|
|
<funcprototype>
|
|
<funcdef>int <function>sd_event_new</function></funcdef>
|
|
<paramdef>sd_event **<parameter>event</parameter></paramdef>
|
|
</funcprototype>
|
|
|
|
<funcprototype>
|
|
<funcdef>int <function>sd_event_default</function></funcdef>
|
|
<paramdef>sd_event **<parameter>event</parameter></paramdef>
|
|
</funcprototype>
|
|
|
|
<funcprototype>
|
|
<funcdef>sd_event *<function>sd_event_ref</function></funcdef>
|
|
<paramdef>sd_event *<parameter>event</parameter></paramdef>
|
|
</funcprototype>
|
|
|
|
<funcprototype>
|
|
<funcdef>sd_event *<function>sd_event_unref</function></funcdef>
|
|
<paramdef>sd_event *<parameter>event</parameter></paramdef>
|
|
</funcprototype>
|
|
|
|
<funcprototype>
|
|
<funcdef>void <function>sd_event_unrefp</function></funcdef>
|
|
<paramdef>sd_event **<parameter>event</parameter></paramdef>
|
|
</funcprototype>
|
|
|
|
<funcprototype>
|
|
<funcdef>int <function>sd_event_get_tid</function></funcdef>
|
|
<paramdef>sd_event *<parameter>event</parameter></paramdef>
|
|
<paramdef>pid_t *<parameter>tid</parameter></paramdef>
|
|
</funcprototype>
|
|
|
|
</funcsynopsis>
|
|
</refsynopsisdiv>
|
|
|
|
<refsect1>
|
|
<title>Description</title>
|
|
|
|
<para><function>sd_event_new()</function> allocates a new event
|
|
loop object. The event loop object is returned in the
|
|
<parameter>event</parameter> parameter. After use, drop
|
|
the returned reference with
|
|
<function>sd_event_unref()</function>. When the last reference is
|
|
dropped, the object is freed.</para>
|
|
|
|
<para><function>sd_event_default()</function> acquires a reference
|
|
to the default event loop object of the calling thread, possibly
|
|
allocating a new object if no default event loop object has been
|
|
allocated yet for the thread. After use, drop the returned
|
|
reference with <function>sd_event_unref()</function>. When the
|
|
last reference is dropped, the event loop is freed. If this
|
|
function is called while the object returned from a previous call
|
|
from the same thread is still referenced, the same object is
|
|
returned again, but the reference is increased by one. It is
|
|
recommended to use this call instead of
|
|
<function>sd_event_new()</function> in order to share event loop
|
|
objects between various components that are dispatched in the same
|
|
thread. All threads have exactly either zero or one default event loop
|
|
objects associated, but never more.</para>
|
|
|
|
<para>After allocating an event loop object, add event sources to
|
|
it with
|
|
<citerefentry><refentrytitle>sd_event_add_io</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
|
<citerefentry><refentrytitle>sd_event_add_time</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
|
<citerefentry><refentrytitle>sd_event_add_signal</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
|
<citerefentry><refentrytitle>sd_event_add_child</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
|
<citerefentry><refentrytitle>sd_event_add_inotify</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
|
<citerefentry><refentrytitle>sd_event_add_defer</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
|
<citerefentry><refentrytitle>sd_event_add_post</refentrytitle><manvolnum>3</manvolnum></citerefentry> or
|
|
<citerefentry><refentrytitle>sd_event_add_exit</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
|
and then execute the event loop using
|
|
<citerefentry><refentrytitle>sd_event_loop</refentrytitle><manvolnum>3</manvolnum></citerefentry>.</para>
|
|
|
|
<para><function>sd_event_ref()</function> increases the reference
|
|
count of the specified event loop object by one.</para>
|
|
|
|
<para><function>sd_event_unref()</function> decreases the
|
|
reference count of the specified event loop object by one. If
|
|
the count hits zero, the object is freed. Note that it
|
|
is freed regardless of whether it is the default event loop object for a
|
|
thread or not. This means that allocating an event loop with
|
|
<function>sd_event_default()</function>, then releasing it, and
|
|
then acquiring a new one with
|
|
<function>sd_event_default()</function> will result in two
|
|
distinct objects. Note that, in order to free an event loop object,
|
|
all remaining event sources of the event loop also need to be
|
|
freed as each keeps a reference to it.</para>
|
|
|
|
<para><function>sd_event_unrefp()</function> is similar to
|
|
<function>sd_event_unref()</function> but takes a pointer to a
|
|
pointer to an <type>sd_event</type> object. This call is useful in
|
|
conjunction with GCC's and LLVM's <ulink
|
|
url="https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html">Clean-up
|
|
Variable Attribute</ulink>. Note that this function is defined as
|
|
inline function. Use a declaration like the following,
|
|
in order to allocate an event loop object that is freed
|
|
automatically as the code block is left:</para>
|
|
|
|
<programlisting>{
|
|
__attribute__((cleanup(sd_event_unrefp))) sd_event *event = NULL;
|
|
int r;
|
|
…
|
|
r = sd_event_default(&event);
|
|
if (r < 0) {
|
|
errno = -r;
|
|
fprintf(stderr, "Failed to allocate event loop: %m\n");
|
|
}
|
|
…
|
|
}</programlisting>
|
|
|
|
<para><function>sd_event_ref()</function>,
|
|
<function>sd_event_unref()</function> and
|
|
<function>sd_event_unrefp()</function> execute no operation if the
|
|
passed in event loop object is <constant>NULL</constant>.</para>
|
|
|
|
<para><function>sd_event_get_tid()</function> retrieves the thread
|
|
identifier ("TID") of the thread the specified event loop object
|
|
is associated with. This call is only supported for event loops
|
|
allocated with <function>sd_event_default()</function>, and
|
|
returns the identifier for the thread the event loop is the
|
|
default event loop of. See <citerefentry
|
|
project='man-pages'><refentrytitle>gettid</refentrytitle><manvolnum>2</manvolnum></citerefentry>
|
|
for more information on thread identifiers.</para>
|
|
</refsect1>
|
|
|
|
<refsect1>
|
|
<title>Return Value</title>
|
|
|
|
<para>On success, <function>sd_event_new()</function>, <function>sd_event_default()</function> and
|
|
<function>sd_event_get_tid()</function> return 0 or a positive integer. On failure, they return a
|
|
negative errno-style error code. <function>sd_event_ref()</function> always returns a pointer to the
|
|
event loop object passed in. <function>sd_event_unref()</function> always returns
|
|
<constant>NULL</constant>.</para>
|
|
|
|
<refsect2>
|
|
<title>Errors</title>
|
|
|
|
<para>Returned errors may indicate the following problems:</para>
|
|
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term><constant>-ENOMEM</constant></term>
|
|
|
|
<listitem><para>Not enough memory to allocate the object.</para></listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><constant>-EMFILE</constant></term>
|
|
|
|
<listitem><para>The maximum number of event loops has been allocated.</para></listitem>
|
|
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><constant>-ENXIO</constant></term>
|
|
|
|
<listitem><para><function>sd_event_get_tid()</function> was invoked on an event loop object that
|
|
was not allocated with <function>sd_event_default()</function>.</para></listitem>
|
|
</varlistentry>
|
|
|
|
</variablelist>
|
|
</refsect2>
|
|
</refsect1>
|
|
|
|
<xi:include href="libsystemd-pkgconfig.xml" />
|
|
|
|
<refsect1>
|
|
<title>See Also</title>
|
|
|
|
<para>
|
|
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
|
|
<citerefentry><refentrytitle>sd-event</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
|
<citerefentry><refentrytitle>sd_event_add_io</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
|
<citerefentry><refentrytitle>sd_event_add_time</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
|
<citerefentry><refentrytitle>sd_event_add_signal</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
|
<citerefentry><refentrytitle>sd_event_add_child</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
|
<citerefentry><refentrytitle>sd_event_add_inotify</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
|
<citerefentry><refentrytitle>sd_event_add_defer</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
|
<citerefentry><refentrytitle>sd_event_run</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
|
<citerefentry project='man-pages'><refentrytitle>gettid</refentrytitle><manvolnum>2</manvolnum></citerefentry>
|
|
</para>
|
|
</refsect1>
|
|
|
|
</refentry>
|