this fixes leaking of files in /dev/shm which happens if corosync is
started and stopped repeatedly.
Regards
-steve
Index: exec/logsys.c
===================================================================
--- exec/logsys.c (revision 2962)
+++ exec/logsys.c (working copy)
@@ -225,6 +225,9 @@
int res;
const char *file = "fdata-XXXXXX";
char path[128];
+ char buffer[128];
+ int i;
+ int written;
sprintf (path, "/dev/shm/%s", file);
@@ -237,10 +240,27 @@
}
}
- res = ftruncate (fd, bytes);
+ /*
+ * ftruncate doesn't return ENOSPC
+ * have to use write to determine if shared memory is actually available
+ */
+ res = ftruncate (fd, 0);
if (res == -1) {
close (fd);
}
+ memset (buffer, 0, sizeof (buffer));
+ for (i = 0; i < (bytes / 64); i++) {
+retry_write:
+ written = write (fd, buffer, 64);
+ if (written == -1 && errno == EINTR) {
+ goto retry_write;
+ }
+ if (written != 64) {
+ return (-1);
+ }
+ }
+
+ unlink (path);
addr_orig = mmap (NULL, bytes << 1, PROT_NONE,
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
@@ -1011,6 +1031,7 @@
int _logsys_rec_init (unsigned int fltsize)
{
size_t flt_real_size;
+ int res;
sem_init (&logsys_thread_start, 0, 0);
@@ -1034,7 +1055,10 @@
flt_real_size = ROUNDUP(fltsize, sysconf(_SC_PAGESIZE)) * 4;
- circular_memory_map ((void **)&flt_data, flt_real_size);
+ res = circular_memory_map ((void **)&flt_data, flt_real_size);
+ if (res == -1) {
+ return (-1);
+ }
memset (flt_data, 0, flt_real_size * 2);
/*
_______________________________________________
Openais mailing list
Openais@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/openais