shm-logging: implement i3-dump-log -f (follow)

This changes the SHM log format, it doesn’t use 0-bytes to separate
entries anymore. Instead of using lots of printf() calls in i3-dump-log,
we now do precisely one big write().

So, to be clear: i3-dump-log and i3 both need to be upgraded.
Mismatching versions will lead to garbage output (no crashes of i3, just
garbage output).

The -f flag uses an inter-process pthread_cond_t in the shared memory
header to broadcast the arrival of new messages to all i3-dump-log
processes. This internally uses futexes and thus doesn’t even mean a
kernel call in most cases. inter-process pthread_cond_ts require NPTL
(the Native Posix Thread Library, introduce in Linux 2.6).
This commit is contained in:
Michael Stapelberg
2012-08-13 00:57:57 +02:00
parent 070a18e598
commit e68a8dd86c
4 changed files with 121 additions and 36 deletions

View File

@ -12,11 +12,33 @@
#define _I3_SHMLOG_H
#include <stdint.h>
#include <pthread.h>
/*
* Header of the shmlog file. Used by i3/src/log.c and i3/i3-dump-log/main.c.
*
*/
typedef struct i3_shmlog_header {
/* Byte offset where the next line will be written to. */
uint32_t offset_next_write;
/* Byte offset where the last wrap occured. */
uint32_t offset_last_wrap;
/* The size of the logfile in bytes. Since the size is limited to 25 MiB
* an uint32_t is sufficient. */
uint32_t size;
/* wrap counter. We need it to reliably signal to clients that we just
* wrapped (clients cannot use offset_last_wrap because that might
* coincidentally be exactly the same as previously). Overflows can happen
* and dont matter — clients use an equality check (==). */
uint32_t wrap_count;
/* pthread condvar which will be broadcasted whenever there is a new
* message in the log. i3-dump-log uses this to implement -f (follow, like
* tail -f) in an efficient way. */
pthread_cond_t condvar;
} i3_shmlog_header;
#endif