Files
systemd/man/sd_journal_get_catalog.xml
Zbigniew Jędrzejewski-Szmek 4a3620c55a man: fix advice regarding thread safety of libsystemd
The prohibition to move libsystemd objects between threads was added in
64a7ef8bc0 ('man: be more explicit about thread
safety of sd_journal'). At the time, this was valid, because we were using the
mempool for allocation and it apparently didn't handle access from different
threads. Sadlly, the commit links to a bugzilla entry referenced in the commit
is not publicly visible anymore, so the details are murky. But we stopped using
the mempool in a5d8835c78 ('mempool: only enable
mempool use when linked to libsystemd-shared.so'), with subsequent followup in
b01f31954f ('Turn mempool_enabled() into a weak
symbol'). The restriction added in the man page is not necessary since then.

The text in the man page was arguably incorrect in calling the code
"thread-agnostic". If the code does not support being touched from threads at
all and has global state to tied to the main thread, it is not "agnostic", but
just doesn't support threads.

(I'm looking into https://github.com/systemd/python-systemd/issues/143, and
with the current scheme, the python-systemd module and all python code using
libsystemd would be very hard to use. With the change to free-threaded python
in python3.13, i.e. the replacement of single Global Interpreter Lock by
locking on individual objects, this limitation would become even more
constraining.)
2025-10-04 23:26:47 +02:00

118 lines
4.8 KiB
XML

<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
<refentry id="sd_journal_get_catalog" xmlns:xi="http://www.w3.org/2001/XInclude">
<refentryinfo>
<title>sd_journal_get_catalog</title>
<productname>systemd</productname>
</refentryinfo>
<refmeta>
<refentrytitle>sd_journal_get_catalog</refentrytitle>
<manvolnum>3</manvolnum>
</refmeta>
<refnamediv>
<refname>sd_journal_get_catalog</refname>
<refname>sd_journal_get_catalog_for_message_id</refname>
<refpurpose>Retrieve message catalog entry</refpurpose>
</refnamediv>
<refsynopsisdiv>
<funcsynopsis>
<funcsynopsisinfo>#include &lt;systemd/sd-journal.h&gt;</funcsynopsisinfo>
<funcprototype>
<funcdef>int <function>sd_journal_get_catalog</function></funcdef>
<paramdef>sd_journal *<parameter>j</parameter></paramdef>
<paramdef>char **<parameter>ret</parameter></paramdef>
</funcprototype>
<funcprototype>
<funcdef>int <function>sd_journal_get_catalog_for_message_id</function></funcdef>
<paramdef>sd_id128_t <parameter>id</parameter></paramdef>
<paramdef>char **<parameter>ret</parameter></paramdef>
</funcprototype>
</funcsynopsis>
</refsynopsisdiv>
<refsect1>
<title>Description</title>
<para><function>sd_journal_get_catalog()</function> retrieves a
message catalog entry for the current journal entry. This will
look up an entry in the message catalog by using the
<literal>MESSAGE_ID=</literal> field of the current journal entry.
Before returning the entry all journal field names in the catalog
entry text enclosed in "@" will be replaced by the respective
field values of the current entry. If a field name referenced in
the message catalog entry does not exist, in the current journal
entry, the "@" will be removed, but the field name otherwise left
untouched.</para>
<para><function>sd_journal_get_catalog_for_message_id()</function>
works similar to <function>sd_journal_get_catalog()</function> but
the entry is looked up by the specified message ID (no open
journal context is necessary for this), and no field substitution
is performed.</para>
<para>For more information about the journal message catalog
please refer to the <ulink
url="https://systemd.io/CATALOG">Journal
Message Catalogs</ulink> documentation page.</para>
</refsect1>
<refsect1>
<title>Return Value</title>
<para><function>sd_journal_get_catalog()</function> and
<function>sd_journal_get_catalog_for_message_id()</function>
return 0 on success or a negative errno-style error code. If no
matching message catalog entry is found, -ENOENT is
returned.</para>
<para>On successful return, <parameter>ret</parameter> points to a
new string, which must be freed with
<citerefentry project='man-pages'><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
</para>
</refsect1>
<refsect1>
<title>Notes</title>
<para>Function <function>sd_journal_get_catalog()</function> is thread-agnostic and only a single thread
may operate on a given object at any given time. Multiple independent objects may be used from different
threads in parallel.</para>
<para>Function <function>sd_journal_get_catalog_for_message_id()</function> is thread-safe and may be
called from multiple threads in parallel.</para>
<xi:include href="libsystemd-pkgconfig.xml" xpointer="pkgconfig-text"/>
</refsect1>
<refsect1>
<title>History</title>
<para><function>sd_journal_get_catalog()</function> and
<function>sd_journal_get_catalog_for_message_id()</function> were added in version 196.</para>
</refsect1>
<refsect1>
<title>See Also</title>
<para><simplelist type="inline">
<member><citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
<member><citerefentry><refentrytitle>systemd.journal-fields</refentrytitle><manvolnum>7</manvolnum></citerefentry></member>
<member><citerefentry><refentrytitle>sd-journal</refentrytitle><manvolnum>3</manvolnum></citerefentry></member>
<member><citerefentry><refentrytitle>sd_journal_open</refentrytitle><manvolnum>3</manvolnum></citerefentry></member>
<member><citerefentry><refentrytitle>sd_journal_next</refentrytitle><manvolnum>3</manvolnum></citerefentry></member>
<member><citerefentry><refentrytitle>sd_journal_get_data</refentrytitle><manvolnum>3</manvolnum></citerefentry></member>
<member><citerefentry project='man-pages'><refentrytitle>malloc</refentrytitle><manvolnum>3</manvolnum></citerefentry></member>
</simplelist></para>
</refsect1>
</refentry>