diff options
author | Michal Koutný <mkoutny@suse.com> | 2018-11-02 20:56:08 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2018-11-21 11:28:33 +0100 |
commit | aa1f95d2647197eca84c33a0f10adaeada08467d (patch) | |
tree | ef2e4208a68d1b5cc43db4fde64cf752debcb715 /src/getty-generator | |
parent | Merge pull request #10866 from yuwata/libudev-util-cleanups (diff) | |
download | systemd-aa1f95d2647197eca84c33a0f10adaeada08467d.tar.xz systemd-aa1f95d2647197eca84c33a0f10adaeada08467d.zip |
core: Detect initial timer state from serialized data
We keep a mark whether a single-shot timer was triggered in the caller's
variable initial. When such a timer elapses while we are
serializing/deserializing the inner state, we consider the timer
incorrectly as elapsed and don't trigger it later.
This patch exploits last_trigger timestamp that we already serialize,
hence we can eliminate the argument initial completely.
A reproducer for OnBootSec= timers:
cat >repro.c <<EOD
/*
* Compile: gcc repro.c -o repro
* Run: ./repro
*/
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
char command[1024];
int pause;
struct timespec now;
while (1) {
usleep(rand() % 200000); // prevent periodic repeats
clock_gettime(CLOCK_MONOTONIC, &now);
printf("%i\n", now.tv_sec);
system("rm -f $PWD/mark");
snprintf(command, 1024, "systemd-run --user --on-boot=%i --timer-property=AccuracySec=100ms "
"touch $PWD/mark", now.tv_sec + 1);
system(command);
system("systemctl --user list-timers");
pause = (1000000000 - now.tv_nsec)/1000 - 70000; // fiddle to hit the middle of reloading
usleep(pause > 0 ? pause : 0);
system("systemctl --user daemon-reload");
sync();
sleep(2);
if (open("./mark", 0) < 0)
if (errno == ENOENT) {
printf("mark file does not exist\n");
break;
}
}
return 0;
}
EOD
Diffstat (limited to 'src/getty-generator')
0 files changed, 0 insertions, 0 deletions