diff options
author | Lorenz Meier <lm@inf.ethz.ch> | 2013-09-20 19:59:48 +0200 |
---|---|---|
committer | Lorenz Meier <lm@inf.ethz.ch> | 2013-09-20 19:59:48 +0200 |
commit | cd8854e622793b3f3e7104d29f06e614d4dfac42 (patch) | |
tree | 65aef3bdea1c6ee0d98fdacb684c5a6ceeddd28a /src | |
parent | 3851bf5c10181fe0f56af40fc7e35a3b72bbb845 (diff) | |
download | px4-firmware-cd8854e622793b3f3e7104d29f06e614d4dfac42.tar.gz px4-firmware-cd8854e622793b3f3e7104d29f06e614d4dfac42.tar.bz2 px4-firmware-cd8854e622793b3f3e7104d29f06e614d4dfac42.zip |
Hotfix: Make param saving relatively robust
Diffstat (limited to 'src')
-rw-r--r-- | src/modules/systemlib/param/param.c | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/src/modules/systemlib/param/param.c b/src/modules/systemlib/param/param.c index 59cbcf5fb..ccdb2ea38 100644 --- a/src/modules/systemlib/param/param.c +++ b/src/modules/systemlib/param/param.c @@ -509,31 +509,57 @@ int param_save_default(void) { int result; + unsigned retries = 0; /* delete the file in case it exists */ struct stat buffer; if (stat(param_get_default_file(), &buffer) == 0) { - result = unlink(param_get_default_file()); + + do { + result = unlink(param_get_default_file()); + if (result != 0) { + retries++; + usleep(1000 * retries); + } + } while (result != OK && retries < 10); + if (result != OK) warnx("unlinking file %s failed.", param_get_default_file()); } /* create the file */ - int fd = open(param_get_default_file(), O_WRONLY | O_CREAT | O_EXCL); + int fd; - if (fd < 0) { + do { /* do another attempt in case the unlink call is not synced yet */ - usleep(5000); fd = open(param_get_default_file(), O_WRONLY | O_CREAT | O_EXCL); + if (fd < 0) { + retries++; + usleep(1000 * retries); + } + } while (fd < 0 && retries < 10); + + if (fd < 0) { + warn("opening '%s' for writing failed", param_get_default_file()); return fd; } - result = param_export(fd, false); + do { + result = param_export(fd, false); + + if (result != OK) { + retries++; + usleep(1000 * retries); + } + + } while (result != 0 && retries < 10); + + close(fd); - if (result != 0) { + if (result != OK) { warn("error exporting parameters to '%s'", param_get_default_file()); (void)unlink(param_get_default_file()); return result; |