lib/util: add allocate_anonymous_shared()
authorStefan Metzmacher <metze@samba.org>
Mon, 22 Mar 2010 08:30:39 +0000 (09:30 +0100)
committerMichael Adam <obnox@samba.org>
Fri, 26 Mar 2010 11:43:03 +0000 (12:43 +0100)
metze
(cherry picked from commit 01f2c023f7d2a4b0e016676638a062a5ba29ec0b)

lib/util/util.c
lib/util/util.h

index af682ac15fcf768d67b5752c4d8746d34b81b429..09517a91868e1e3d553e18d3d2e41686174ff136 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
@@ -916,4 +918,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;
+
+}
 
index defef127d93e4f162a8d2186a5a4ca6f40cf939b..8bae4d126f0b30870604e52139120fc104ff48e1 100644 (file)
@@ -771,4 +771,9 @@ bool unmap_file(void *start, size_t size);
 
 void print_asc(int level, const uint8_t *buf,int len);
 
+/**
+ * Allocate anonymous shared memory of the given size
+ */
+void *allocate_anonymous_shared(size_t bufsz);
+
 #endif /* _SAMBA_UTIL_H_ */