# New Ticket Created by Leopold Toetsch
# Please include the string: [perl #22455]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt2/Ticket/Display.html?id=22455 >
Attached patch tests if either posix_memalign or memalign is present.
Additionally the platform interface prototypes are moved to a separate
header file.
I did test it with 2 different libc's one providing posix_memalign and
one with memalign.
Missing is a patch for interpreter.c where Parrot_memalign should be
Parrot_memalign_if_possible, which maps to malloc if no memalign was found.
Finally freeing memaligned memory should be done via
Parrot_memalign_free which on reasonable systems is just free, but ...
Comments welcome as well as adjustments for other platforms.
leo
-- attachment 1 ------------------------------------------------------
url: http://rt.perl.org/rt2/attach/58565/43555/00eca4/config-memalign.patch
--- parrot/config/auto/memalign.pl Mon Feb 10 11:03:55 2003
+++ parrot-leo/config/auto/memalign.pl Mon Jun 2 12:04:19 2003
@@ -16,10 +16,22 @@
}
cc_clean();
+ my $test2 = 0;
+
+ cc_gen('config/auto/memalign/test_c2.in');
+ eval { cc_build(); };
+ unless ($@ || cc_run() !~ /ok/) {
+ $test2 = 1;
+ }
+ cc_clean();
+
+ my $f;
Configure::Data->set(
- memalign => $test
+ memalign => ($f = $test2 ? 'posix_memalign' :
+ $test ? 'memalign' :
+ undef)
);
- print $test ? " (Yep) " : " (no) "
+ print $test ? " (Yep:$f) " : " (no) "
}
1;
--- parrot/config/auto/memalign/test_c.in Mon Feb 10 11:03:53 2003
+++ parrot-leo/config/auto/memalign/test_c.in Mon Jun 2 11:32:23 2003
@@ -2,7 +2,7 @@
* test for memalign function
*
* This file is automatically generated by Configure
- * from testcomputedgoto_c.in.
+ * from test_c.in.
*/
#include <malloc.h>
#include <stdio.h>
--- /dev/null Fri Feb 28 14:27:28 2003
+++ parrot-leo/config/auto/memalign/test_c2.in Mon Jun 2 11:32:23 2003
@@ -0,0 +1,18 @@
+/*
+ * test for posix_memalign function
+ *
+ * This file is automatically generated by Configure
+ * from test_c.in.
+ */
+#include <malloc.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+int main(int argc, char *argv[])
+{
+ void * p;
+ size_t s = 256;
+ int i = posix_memalign(&p, s, s);
+ puts(((int)p & 0xff) == 0 ? "ok" : "nix");
+ return i;
+}
--- parrot/config/gen/feature_h/feature_h.in Thu May 1 10:06:05 2003
+++ parrot-leo/config/gen/feature_h/feature_h.in Mon Jun 2 12:04:01 2003
@@ -11,15 +11,19 @@
print OUT <<EOP;
/* from config/auto/memalign */
EOP
-if (${memalign}) {
- print OUT <<EOP;
-#include <malloc.h>
-#define Parrot_memalign(a, s) memalign((a), (s))
-EOP
-} else {
- print OUT <<EOP;
-#define Parrot_memalign(a, s) mem_sys_allocate(s)
-EOP
+if (${memalign} eq 'posix_memalign') {
+ print OUT <<'END'
+#define HAS_POSIX_MEMALIGN
+#define HAS_SOME_MEMALIGN
+
+END
+}
+elsif (${memalign} eq 'memalign') {
+ print OUT <<'END'
+#define HAS_MEMALIGN
+#define HAS_SOME_MEMALIGN
+
+END
}
print OUT <<EOP;
@@ -38,6 +42,7 @@
#ifdef I386
# define HAS_JIT_FCOMIP
#endif
+
END
}
--- parrot/config/gen/platform.pl Tue Sep 3 10:20:58 2002
+++ parrot-leo/config/gen/platform.pl Mon Jun 2 11:24:34 2003
@@ -17,6 +17,8 @@
copy_if_diff("config/gen/platform/$platform.c", "platform.c");
copy_if_diff("config/gen/platform/$platform.h", "include/parrot/platform.h");
+ copy_if_diff("config/gen/platform/platform_interface.h",
+ "include/parrot/platform_interface.h");
}
1;
--- parrot/config/gen/platform/ansi.h Thu Jul 18 10:02:02 2002
+++ parrot-leo/config/gen/platform/ansi.h Mon Jun 2 11:25:28 2003
@@ -16,20 +16,12 @@
** Miscellaneous:
*/
-void Parrot_sleep(unsigned int seconds);
-INTVAL Parrot_intval_time(void);
-FLOATVAL Parrot_floatval_time(void);
-void Parrot_setenv(const char *name, const char *value);
/*
** Dynamic Loading:
*/
-void *Parrot_dlopen(const char *filename);
-const char *Parrot_dlerror(void);
-void *Parrot_dlsym(void *handle, const char *symbol);
-int Parrot_dlclose(void *handle);
/*
* Local variables:
--- parrot/config/gen/platform/darwin.h Thu Jul 18 10:02:02 2002
+++ parrot-leo/config/gen/platform/darwin.h Mon Jun 2 11:25:28 2003
@@ -1,5 +1,5 @@
/*
-** platform.h [generic version]
+** platform.h [darwin version]
*/
@@ -16,22 +16,12 @@
** Miscellaneous:
*/
-void Parrot_sleep(unsigned int seconds);
-INTVAL Parrot_intval_time(void);
-FLOATVAL Parrot_floatval_time(void);
-void Parrot_setenv(const char *name, const char *value);
-
/*
** Dynamic Loading:
*/
#define PARROT_DLOPEN_FLAGS RTLD_LAZY
-
-void *Parrot_dlopen(const char *filename);
-const char *Parrot_dlerror(void);
-void *Parrot_dlsym(void *handle, const char *symbol);
-int Parrot_dlclose(void *handle);
/*
* Local variables:
--- parrot/config/gen/platform/generic.c Sat Jan 4 11:00:14 2003
+++ parrot-leo/config/gen/platform/generic.c Mon Jun 2 11:51:09 2003
@@ -125,6 +125,37 @@
#endif
}
+#if defined(HAS_POSIX_MEMALIGN)
+#include <stdlib.h>
+
+void *
+Parrot_memalign(size_t align, size_t size)
+{
+ void *p;
+ int i = posix_memalign(p, align, size);
+ return i == 0 ? p : NULL;
+}
+
+# define Parrot_memalign_if_possible(a, s) Parrot_memalign((a), (s))
+
+#elif defined(HAS_MEMALIGN)
+#include <malloc.h>
+
+void *
+Parrot_memalign(size_t align, size_t size)
+{
+ return memalign(align, size);
+}
+
+void *
+Parrot_memalign_if_possible(size_t align, size_t size)
+{
+ return memalign(align, size);
+}
+
+#endif
+
+#define Parrot_free_memalign(p) free(p)
/*
* Local variables:
* c-indentation-style: bsd
--- parrot/config/gen/platform/generic.h Thu Jul 18 10:02:02 2002
+++ parrot-leo/config/gen/platform/generic.h Mon Jun 2 11:25:28 2003
@@ -16,22 +16,12 @@
** Miscellaneous:
*/
-void Parrot_sleep(unsigned int seconds);
-INTVAL Parrot_intval_time(void);
-FLOATVAL Parrot_floatval_time(void);
-void Parrot_setenv(const char *name, const char *value);
-
/*
** Dynamic Loading:
*/
#define PARROT_DLOPEN_FLAGS RTLD_LAZY
-
-void *Parrot_dlopen(const char *filename);
-const char *Parrot_dlerror(void);
-void *Parrot_dlsym(void *handle, const char *symbol);
-int Parrot_dlclose(void *handle);
/*
* Local variables:
--- /dev/null Fri Feb 28 14:27:28 2003
+++ parrot-leo/config/gen/platform/platform_interface.h Mon Jun 2 11:25:28 2003
@@ -0,0 +1,51 @@
+#ifndef PLATFORM_INTERFACE_H_GUARD
+#define PLATFORM_INTERFACE_H_GUARD
+/*
+** platform_interface.h
+*/
+#include "feature.h"
+
+/*
+** I/O:
+*/
+
+/*
+** Memory:
+*/
+
+void *Parrot_memalign(size_t align, size_t size);
+void *Parrot_memalign_if_possible(size_t align, size_t size);
+void Parrot_free_memalign(void *);
+
+#if !defined(HAS_MEMALIGN) && !defined(HAS_POSIX_MEMALIGN)
+# define Parrot_memalign_if_possible(a, s) malloc(a)
+#endif
+
+/*
+** Miscellaneous:
+*/
+
+void Parrot_sleep(unsigned int seconds);
+INTVAL Parrot_intval_time(void);
+FLOATVAL Parrot_floatval_time(void);
+void Parrot_setenv(const char *name, const char *value);
+
+/*
+** Dynamic Loading:
+*/
+
+void *Parrot_dlopen(const char *filename);
+const char *Parrot_dlerror(void);
+void *Parrot_dlsym(void *handle, const char *symbol);
+int Parrot_dlclose(void *handle);
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vim: expandtab shiftwidth=4:
+ */
+#endif
--- parrot/config/gen/platform/win32.h Thu May 1 10:06:06 2003
+++ parrot-leo/config/gen/platform/win32.h Mon Jun 2 11:25:28 2003
@@ -28,20 +28,12 @@
** Miscellaneous:
*/
-void Parrot_sleep(unsigned int seconds);
-INTVAL Parrot_intval_time(void);
-FLOATVAL Parrot_floatval_time(void);
-void Parrot_setenv(const char *name, const char *value);
/*
** Dynamic Loading:
*/
-void *Parrot_dlopen(const char *filename);
-const char *Parrot_dlerror(void);
-void *Parrot_dlsym(void *handle, const char *symbol);
-int Parrot_dlclose(void *handle);
/*
* Local variables:
--- parrot/include/parrot/parrot.h Wed May 14 10:06:39 2003
+++ parrot-leo/include/parrot/parrot.h Mon Jun 2 11:33:28 2003
@@ -190,6 +190,7 @@
#endif
#include "parrot/platform.h"
+#include "parrot/platform_interface.h"
#include "parrot/global_setup.h"
#include "parrot/interpreter.h"
#include "parrot/encoding.h"