aboutsummaryrefslogtreecommitdiff
path: root/src/modules/systemlib
diff options
context:
space:
mode:
authorLorenz Meier <lm@inf.ethz.ch>2013-09-20 19:59:48 +0200
committerLorenz Meier <lm@inf.ethz.ch>2013-09-20 19:59:48 +0200
commitcd8854e622793b3f3e7104d29f06e614d4dfac42 (patch)
tree65aef3bdea1c6ee0d98fdacb684c5a6ceeddd28a /src/modules/systemlib
parent3851bf5c10181fe0f56af40fc7e35a3b72bbb845 (diff)
downloadpx4-firmware-cd8854e622793b3f3e7104d29f06e614d4dfac42.tar.gz
px4-firmware-cd8854e622793b3f3e7104d29f06e614d4dfac42.tar.bz2
px4-firmware-cd8854e622793b3f3e7104d29f06e614d4dfac42.zip
Hotfix: Make param saving relatively robust
Diffstat (limited to 'src/modules/systemlib')
-rw-r--r--src/modules/systemlib/param/param.c38
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;