lib/util: add allocate_anonymous_shared()
[obnox/samba-ctdb.git] / lib / util / util.c
index 0148bdb00d4d43a4246130b9e5993c6f67253d48..89893775d9e189ac18f700ab79bbd793d7ef0ecb 100644 (file)
@@ -25,6 +25,8 @@
 #include "system/network.h"
 #include "system/filesys.h"
 #include "system/locale.h"
+#include "system/shmem.h"
+
 #undef malloc
 #undef strcasecmp
 #undef strncasecmp
@@ -921,4 +923,30 @@ bool next_token_no_ltrim_talloc(TALLOC_CTX *ctx,
        return next_token_internal_talloc(ctx, ptr, pp_buff, sep, false);
 }
 
+/* Map a shared memory buffer of at least nelem counters. */
+void *allocate_anonymous_shared(size_t bufsz)
+{
+       void *buf;
+       size_t pagesz = getpagesize();
+
+       if (bufsz % pagesz) {
+               bufsz = (bufsz + pagesz) % pagesz; /* round up to pagesz */
+       }
+
+#ifdef MAP_ANON
+       /* BSD */
+       buf = mmap(NULL, bufsz, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED,
+                       -1 /* fd */, 0 /* offset */);
+#else
+       buf = mmap(NULL, bufsz, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED,
+                       open("/dev/zero", O_RDWR), 0 /* offset */);
+#endif
+
+       if (buf == MAP_FAILED) {
+               return NULL;
+       }
+
+       return buf;
+
+}