diff options
author | Jonathan Maw <jonathan.maw@codethink.co.uk> | 2013-06-28 10:30:15 +0000 |
---|---|---|
committer | Jonathan Maw <jonathan.maw@codethink.co.uk> | 2013-06-28 10:30:15 +0000 |
commit | daba2f7416861898b2c01926ae6a2ef19fecfaab (patch) | |
tree | 6b159c5e7d612368e6bbb8e138ae3db15005c201 /man/sd_journal_get_fd.xml | |
parent | 9a332ba261bea9e9f3c0915bc6f0c6a0d45a1d5d (diff) | |
parent | 606c24e3bd41207c395f24a56bcfcad791e265a5 (diff) | |
download | systemd-daba2f7416861898b2c01926ae6a2ef19fecfaab.tar.gz |
Merge tag 'v204' into new-systemd
systemd 204
Diffstat (limited to 'man/sd_journal_get_fd.xml')
-rw-r--r-- | man/sd_journal_get_fd.xml | 189 |
1 files changed, 131 insertions, 58 deletions
diff --git a/man/sd_journal_get_fd.xml b/man/sd_journal_get_fd.xml index 189d21352b..33d2980b3b 100644 --- a/man/sd_journal_get_fd.xml +++ b/man/sd_journal_get_fd.xml @@ -44,9 +44,11 @@ <refnamediv> <refname>sd_journal_get_fd</refname> - <refname>sd_journal_reliable_fd</refname> + <refname>sd_journal_get_events</refname> + <refname>sd_journal_get_timeout</refname> <refname>sd_journal_process</refname> <refname>sd_journal_wait</refname> + <refname>sd_journal_reliable_fd</refname> <refname>SD_JOURNAL_NOP</refname> <refname>SD_JOURNAL_APPEND</refname> <refname>SD_JOURNAL_INVALIDATE</refname> @@ -64,8 +66,14 @@ </funcprototype> <funcprototype> - <funcdef>int <function>sd_journal_reliable_fd</function></funcdef> + <funcdef>int <function>sd_journal_get_events</function></funcdef> + <paramdef>sd_journal* <parameter>j</parameter></paramdef> + </funcprototype> + + <funcprototype> + <funcdef>int <function>sd_journal_get_timeout</function></funcdef> <paramdef>sd_journal* <parameter>j</parameter></paramdef> + <paramdef>uint64_t* <parameter>timeout_usec</parameter></paramdef> </funcprototype> <funcprototype> @@ -79,6 +87,11 @@ <paramdef>uint64_t <parameter>timeout_usec</parameter></paramdef> </funcprototype> + <funcprototype> + <funcdef>int <function>sd_journal_reliable_fd</function></funcdef> + <paramdef>sd_journal* <parameter>j</parameter></paramdef> + </funcprototype> + </funcsynopsis> </refsynopsisdiv> @@ -87,79 +100,125 @@ <para><function>sd_journal_get_fd()</function> returns a file descriptor that may be asynchronously polled in - an external event loop and is signaled readable as - soon as the journal changes, because new entries or - files were added, rotation took place, or files have - been deleted, and similar. The file descriptor is - suitable for usage in - <citerefentry><refentrytitle>poll</refentrytitle><manvolnum>2</manvolnum></citerefentry> - where it will yield POLLIN on changes. The call takes - one argument: the journal context object. Note that - not all file systems are capable of generating the - necessary events for wakeups from this file descriptor - to be enirely reliable. In particular network files + an external event loop and is signaled as soon as the + journal changes, because new entries or files were + added, rotation took place, or files have been + deleted, and similar. The file descriptor is suitable + for usage in + <citerefentry><refentrytitle>poll</refentrytitle><manvolnum>2</manvolnum></citerefentry>. Use + <function>sd_journal_get_events()</function> for an + events mask to watch for. The call takes one argument: + the journal context object. Note that not all file + systems are capable of generating the necessary events + for wakeups from this file descriptor for changes to + be noticed immediately. In particular network files systems do not generate suitable file change events in - all cases. In such a case an application should not - rely alone on wake-ups from this file descriptor but - wake up and recheck the journal in regular time - intervals, for example every 2s. To detect - cases where this is necessary, use + all cases. Cases like this can be detected with <function>sd_journal_reliable_fd()</function>, - below.</para> + below. <function>sd_journal_get_timeout()</function> + will ensure in these cases that wake-ups happen + frequently enough for changes to be noticed, although + with a certain latency.</para> + + <para><function>sd_journal_get_events()</function> + will return the <function>poll()</function> mask to + wait for. This function will return a combination of + <literal>POLLIN</literal> and + <literal>POLLOUT</literal> and similar to fill into + the <literal>.events</literal> field of + <literal>struct pollfd</literal>.</para> + + <para><function>sd_journal_get_timeout()</function> + will return a timeout value for usage in <function>poll()</function>. This returns a value in microseconds since the epoch of CLOCK_MONOTONIC for timing out <function>poll()</function> in <literal>timeout_usec</literal>. See + <citerefentry><refentrytitle>clock_gettime</refentrytitle><manvolnum>2</manvolnum></citerefentry> + for details about + <literal>CLOCK_MONOTONIC</literal>. If there's no + timeout to wait for this will fill in + <literal>(uint64_t) -1</literal> instead. Note that + <function>poll()</function> takes a relative timeout + in milliseconds rather than an absolute timeout in + microseconds. To convert the absolute 'us' timeout into + relative 'ms', use code like the following:</para> + + <programlisting>uint64_t t; +int msec; +sd_journal_get_timeout(m, &t); +if (t == (uint64_t) -1) + msec = -1; +else { + struct timespec ts; + uint64_t n; + clock_getttime(CLOCK_MONOTONIC, &ts); + n = (uint64_t) ts.tv_sec * 1000000 + ts.tv_nsec / 1000; + msec = t > n ? (int) ((t - n + 999) / 1000) : 0; +}</programlisting> - <para><function>sd_journal_reliable_fd()</function> - may be used to check whether the wakeup events from - the file descriptor returned by - <function>sd_journal_get_fd</function> are sufficient - to track changes to the journal. If this call returns - 0, it is necessary to regularly recheck for journal - changes (suggestion: every 2s). If this call returns a - positive integer this is not necessary, and wakeups - from the file descriptor returned by - <function>sd_journal_get_fd()</function> are - sufficient as only source for wake-ups.</para> - - <para>After each POLLIN wake-up + <para>The code above does not do any error checking + for brevity's sake. The calculated <literal>msec</literal> + integer can be passed directly as + <function>poll()</function>'s timeout + parameter.</para> + + <para>After each <function>poll()</function> wake-up <function>sd_journal_process()</function> needs to be - called to process events and reset the readable state - of the file descriptor. This call will also indicate + called to process events. This call will also indicate what kind of change has been detected (see below; note that spurious wake-ups are possible).</para> <para>A synchronous alternative for using <function>sd_journal_get_fd()</function>, - <function>sd_journal_reliable_fd()</function> and + <function>sd_journal_get_events()</function>, + <function>sd_journal_get_timeout()</function> and <function>sd_journal_process()</function> is <function>sd_journal_wait()</function>. It will - synchronously wait until the journal gets changed, - possibly using a 2s time-out if this is necessary (see - above). In either way the maximum time this call - sleeps may be controlled with the - <parameter>timeout_usec</parameter> parameter. Pass - <literal>(uint64_t) -1</literal> to wait - indefinitely. Internally this call simply combines - <function>sd_journal_get_fd()</function>, - <function>sd_journal_reliable_fd()</function>, + synchronously wait until the journal gets changed. The + maximum time this call sleeps may be controlled with + the <parameter>timeout_usec</parameter> + parameter. Pass <literal>(uint64_t) -1</literal> to + wait indefinitely. Internally this call simply + combines <function>sd_journal_get_fd()</function>, + <function>sd_journal_get_events()</function>, + <function>sd_journal_get_timeout()</function>, <function>poll()</function> and <function>sd_journal_process()</function> into one.</para> + <para><function>sd_journal_reliable_fd()</function> + may be used to check whether the wakeup events from + the file descriptor returned by + <function>sd_journal_get_fd()</function> are known to + be immediately triggered. On certain file systems + where file change events from the OS are not available + (such as NFS) changes need to be polled for + repeatedly, and hence are detected only with a certain + latency. This call will return a positive value if the + journal changes are detected immediately and zero when + they need to be polled for and hence might be noticed + only with a certain latency. Note that there's usually + no need to invoke this function directly as + <function>sd_journal_get_timeout()</function> on these + file systems will ask for timeouts explicitly + anyway.</para> </refsect1> <refsect1> <title>Return Value</title> - <para><function>sd_journal_get_fd()</function> returns a valid file descriptor on success or a negative errno-style error - code.</para> + <para><function>sd_journal_get_fd()</function> returns + a valid file descriptor on success or a negative + errno-style error code.</para> + + <para><function>sd_journal_get_events()</function> + returns a combination of <literal>POLLIN</literal>, + <literal>POLLOUT</literal> and suchlike on success or + a negative errno-style error code.</para> <para><function>sd_journal_reliable_fd()</function> returns a positive integer if the file descriptor returned by <function>sd_journal_get_fd()</function> - is sufficient as sole wake-up source for journal - change events. Returns 0 if it is not sufficient and - the journal needs to be checked manually in regular - time intervals for changes. Returns a negative - errno-style error code on failure.</para> + will generate wake-ups immediately for all journal + changes. Returns 0 if there might be a latency + involved.</para> <para><function>sd_journal_process()</function> and <function>sd_journal_wait()</function> return one of @@ -184,6 +243,7 @@ <title>Notes</title> <para>The <function>sd_journal_get_fd()</function>, + <function>sd_journal_get_events()</function>, <function>sd_journal_reliable_fd()</function>, <function>sd_journal_process()</function> and <function>sd_journal_wait()</function> interfaces are @@ -212,7 +272,7 @@ int main(int argc, char *argv[]) { return 1; } for (;;) { - const char *d; + const void *d; size_t l; r = sd_journal_next(j); if (r < 0) { @@ -233,7 +293,7 @@ int main(int argc, char *argv[]) { fprintf(stderr, "Failed to read message field: %s\n", strerror(-r)); continue; } - printf("%.*s\n", (int) l, d); + printf("%.*s\n", (int) l, (const char*) d); } sd_journal_close(j); return 0; @@ -248,15 +308,27 @@ int main(int argc, char *argv[]) { int wait_for_changes(sd_journal *j) { struct pollfd pollfd; - pollfd.fd = sd_journal_get_fd(); - pollfd.events = POLLIN; - poll(&pollfd, 1, sd_journal_reliable_fd() > 0 ? -1 : 2000); + int msec; + + sd_journal_get_timeout(m, &t); + if (t == (uint64_t) -1) + msec = -1; + else { + struct timespec ts; + uint64_t n; + clock_getttime(CLOCK_MONOTONIC, &ts); + n = (uint64_t) ts.tv_sec * 1000000 + ts.tv_nsec / 1000; + msec = t > n ? (int) ((t - n + 999) / 1000) : 0; + } + + pollfd.fd = sd_journal_get_fd(j); + pollfd.events = sd_journal_get_events(j); + poll(&pollfd, 1, msec); return sd_journal_process(j); } </programlisting> </refsect1> - <refsect1> <title>See Also</title> @@ -265,7 +337,8 @@ int wait_for_changes(sd_journal *j) { <citerefentry><refentrytitle>sd-journal</refentrytitle><manvolnum>3</manvolnum></citerefentry>, <citerefentry><refentrytitle>sd_journal_open</refentrytitle><manvolnum>3</manvolnum></citerefentry>, <citerefentry><refentrytitle>sd_journal_next</refentrytitle><manvolnum>3</manvolnum></citerefentry>, - <citerefentry><refentrytitle>poll</refentrytitle><manvolnum>2</manvolnum></citerefentry> + <citerefentry><refentrytitle>poll</refentrytitle><manvolnum>2</manvolnum></citerefentry>, + <citerefentry><refentrytitle>clock_gettime</refentrytitle><manvolnum>2</manvolnum></citerefentry> </para> </refsect1> |