summaryrefslogtreecommitdiff
path: root/lib/replace/replace.c
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2012-03-24 14:43:21 +0100
committerJelmer Vernooij <jelmer@samba.org>2012-03-24 14:43:21 +0100
commitd4c4cb06c52f6ded7d55d75201fb2107e76c1586 (patch)
tree6f71526793427e4a3f093e07508f2e75eba43196 /lib/replace/replace.c
parent1080483319d4eb7a8cdee767fc41f7258e0e2537 (diff)
downloadsamba-d4c4cb06c52f6ded7d55d75201fb2107e76c1586.tar.gz
samba-d4c4cb06c52f6ded7d55d75201fb2107e76c1586.tar.bz2
samba-d4c4cb06c52f6ded7d55d75201fb2107e76c1586.zip
replace: Move memalign() from lib/util/system.c to libreplace.
Diffstat (limited to 'lib/replace/replace.c')
-rw-r--r--lib/replace/replace.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/replace/replace.c b/lib/replace/replace.c
index d9a96ff8ef..f1454cbcd6 100644
--- a/lib/replace/replace.c
+++ b/lib/replace/replace.c
@@ -828,3 +828,35 @@ int rep_clock_gettime(clockid_t clk_id, struct timespec *tp)
return 0;
}
#endif
+
+#ifndef HAVE_MEMALIGN
+void *rep_memalign( size_t align, size_t size )
+{
+#if defined(HAVE_POSIX_MEMALIGN)
+ void *p = NULL;
+ int ret = posix_memalign( &p, align, size );
+ if ( ret == 0 )
+ return p;
+
+ return NULL;
+#else
+ /* On *BSD systems memaligns doesn't exist, but memory will
+ * be aligned on allocations of > pagesize. */
+#if defined(SYSCONF_SC_PAGESIZE)
+ size_t pagesize = (size_t)sysconf(_SC_PAGESIZE);
+#elif defined(HAVE_GETPAGESIZE)
+ size_t pagesize = (size_t)getpagesize();
+#else
+ size_t pagesize = (size_t)-1;
+#endif
+ if (pagesize == (size_t)-1) {
+ DEBUG(0,("memalign functionality not available on this platform!\n"));
+ return NULL;
+ }
+ if (size < pagesize) {
+ size = pagesize;
+ }
+ return malloc(size);
+#endif
+}
+#endif