gst-libs/gst/fft/: Use correct struct alignment everywhere to prevent unaligned memor...
authorSebastian Dröge <slomo@circular-chaos.org>
Fri, 16 Jan 2009 11:44:04 +0000 (11:44 +0000)
committerSebastian Dröge <slomo@circular-chaos.org>
Fri, 16 Jan 2009 11:44:04 +0000 (11:44 +0000)
Original commit message from CVS:
* gst-libs/gst/fft/_kiss_fft_guts_f32.h:
* gst-libs/gst/fft/_kiss_fft_guts_f64.h:
* gst-libs/gst/fft/_kiss_fft_guts_s16.h:
* gst-libs/gst/fft/_kiss_fft_guts_s32.h:
* gst-libs/gst/fft/kiss_fftr_f32.c: (kiss_fftr_f32_alloc):
* gst-libs/gst/fft/kiss_fftr_f64.c: (kiss_fftr_f64_alloc):
* gst-libs/gst/fft/kiss_fftr_s16.c: (kiss_fftr_s16_alloc):
* gst-libs/gst/fft/kiss_fftr_s32.c: (kiss_fftr_s32_alloc):
Use correct struct alignment everywhere to prevent unaligned
memory accesses, resulting in SIGBUS on sparc and probably others.
Fixes bug #500833.

ChangeLog
gst-libs/gst/fft/_kiss_fft_guts_f32.h
gst-libs/gst/fft/_kiss_fft_guts_f64.h
gst-libs/gst/fft/_kiss_fft_guts_s16.h
gst-libs/gst/fft/_kiss_fft_guts_s32.h
gst-libs/gst/fft/kiss_fftr_f32.c
gst-libs/gst/fft/kiss_fftr_f64.c
gst-libs/gst/fft/kiss_fftr_s16.c
gst-libs/gst/fft/kiss_fftr_s32.c

index 073c0615226beacf3462c04134eed93c8b33b0d4..b6b58ab6b55e656dcb9264b216a55ce936d52fb8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2009-01-16  Sebastian Dröge  <sebastian.droege@collabora.co.uk>
+
+       * gst-libs/gst/fft/_kiss_fft_guts_f32.h:
+       * gst-libs/gst/fft/_kiss_fft_guts_f64.h:
+       * gst-libs/gst/fft/_kiss_fft_guts_s16.h:
+       * gst-libs/gst/fft/_kiss_fft_guts_s32.h:
+       * gst-libs/gst/fft/kiss_fftr_f32.c: (kiss_fftr_f32_alloc):
+       * gst-libs/gst/fft/kiss_fftr_f64.c: (kiss_fftr_f64_alloc):
+       * gst-libs/gst/fft/kiss_fftr_s16.c: (kiss_fftr_s16_alloc):
+       * gst-libs/gst/fft/kiss_fftr_s32.c: (kiss_fftr_s32_alloc):
+       Use correct struct alignment everywhere to prevent unaligned
+       memory accesses, resulting in SIGBUS on sparc and probably others.
+       Fixes bug #500833.
+
 2009-01-16  Sebastian Dröge  <sebastian.droege@collabora.co.uk>
 
        * gst-libs/gst/tag/gsttagdemux.c: (gst_tag_demux_srcpad_event):
index 15dc06b4148216ae787b34b7f0f2358da67e49f4..78d2e2e81ce0e9739a34a374647c8d30ede83296 100644 (file)
@@ -19,6 +19,20 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 #include "kiss_fft_f32.h"
 #include <limits.h>
 
+/* The 2*sizeof(size_t) alignment here is borrowed from
+ * GNU libc, so it should be good most everywhere.
+ * It is more conservative than is needed on some 64-bit
+ * platforms, but ia64 does require a 16-byte alignment.
+ * The SIMD extensions for x86 and ppc32 would want a
+ * larger alignment than this, but we don't need to
+ * do better than malloc.
+ *
+ * Borrowed from GLib's gobject/gtype.c
+ */
+#define STRUCT_ALIGNMENT (2 * sizeof (size_t))
+#define ALIGN_STRUCT(offset) \
+      ((offset + (STRUCT_ALIGNMENT - 1)) & -STRUCT_ALIGNMENT)
+
 #define MAXFACTORS 32
 /* e.g. an fft of length 128 has 4 factors 
  as far as kissfft is concerned
index 276f65eab4a151de5f98964aa044b16fc430e84a..4202716d8c7b5d0fc078a5179fbdac108d921a32 100644 (file)
@@ -19,6 +19,20 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 #include "kiss_fft_f64.h"
 #include <limits.h>
 
+/* The 2*sizeof(size_t) alignment here is borrowed from
+ * GNU libc, so it should be good most everywhere.
+ * It is more conservative than is needed on some 64-bit
+ * platforms, but ia64 does require a 16-byte alignment.
+ * The SIMD extensions for x86 and ppc32 would want a
+ * larger alignment than this, but we don't need to
+ * do better than malloc.
+ *
+ * Borrowed from GLib's gobject/gtype.c
+ */
+#define STRUCT_ALIGNMENT (2 * sizeof (size_t))
+#define ALIGN_STRUCT(offset) \
+      ((offset + (STRUCT_ALIGNMENT - 1)) & -STRUCT_ALIGNMENT)
+
 #define MAXFACTORS 32
 /* e.g. an fft of length 128 has 4 factors 
  as far as kissfft is concerned
index 110ed7b4d78b5a7af0faa9b7d36db7c770691dca..2d8256e0978e4b12abb0b9bbe690cb89221d0b68 100644 (file)
@@ -19,6 +19,20 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 #include "kiss_fft_s16.h"
 #include <limits.h>
 
+/* The 2*sizeof(size_t) alignment here is borrowed from
+ * GNU libc, so it should be good most everywhere.
+ * It is more conservative than is needed on some 64-bit
+ * platforms, but ia64 does require a 16-byte alignment.
+ * The SIMD extensions for x86 and ppc32 would want a
+ * larger alignment than this, but we don't need to
+ * do better than malloc.
+ *
+ * Borrowed from GLib's gobject/gtype.c
+ */
+#define STRUCT_ALIGNMENT (2 * sizeof (size_t))
+#define ALIGN_STRUCT(offset) \
+      ((offset + (STRUCT_ALIGNMENT - 1)) & -STRUCT_ALIGNMENT)
+
 #define MAXFACTORS 32
 /* e.g. an fft of length 128 has 4 factors 
  as far as kissfft is concerned
index 5da7ec3963fc270daeec28a29196f35d7e1ef22a..f0ec9c0f449d9f135e74fda97fffa964e7623c9f 100644 (file)
@@ -19,6 +19,20 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 #include "kiss_fft_s32.h"
 #include <limits.h>
 
+/* The 2*sizeof(size_t) alignment here is borrowed from
+ * GNU libc, so it should be good most everywhere.
+ * It is more conservative than is needed on some 64-bit
+ * platforms, but ia64 does require a 16-byte alignment.
+ * The SIMD extensions for x86 and ppc32 would want a
+ * larger alignment than this, but we don't need to
+ * do better than malloc.
+ *
+ * Borrowed from GLib's gobject/gtype.c
+ */
+#define STRUCT_ALIGNMENT (2 * sizeof (size_t))
+#define ALIGN_STRUCT(offset) \
+      ((offset + (STRUCT_ALIGNMENT - 1)) & -STRUCT_ALIGNMENT)
+
 #define MAXFACTORS 32
 /* e.g. an fft of length 128 has 4 factors 
  as far as kissfft is concerned
index 1f9fdb21a50e4f26c41be485eebedaa76ff1880d..ea45206eb04c29890e304ccbf19dbce9e871bb4f 100644 (file)
@@ -39,9 +39,8 @@ kiss_fftr_f32_alloc (int nfft, int inverse_fft, void *mem, size_t * lenmem)
   nfft >>= 1;
 
   kiss_fft_f32_alloc (nfft, inverse_fft, NULL, &subsize);
-  memneeded =
-      sizeof (struct kiss_fftr_f32_state) + subsize +
-      sizeof (kiss_fft_f32_cpx) * (nfft * 2);
+  memneeded = ALIGN_STRUCT (sizeof (struct kiss_fftr_f32_state))
+      + ALIGN_STRUCT (subsize) + sizeof (kiss_fft_f32_cpx) * (nfft * 2);
 
   if (lenmem == NULL) {
     st = (kiss_fftr_f32_cfg) KISS_FFT_F32_MALLOC (memneeded);
@@ -53,8 +52,9 @@ kiss_fftr_f32_alloc (int nfft, int inverse_fft, void *mem, size_t * lenmem)
   if (!st)
     return NULL;
 
-  st->substate = (kiss_fft_f32_cfg) (st + 1);   /*just beyond kiss_fftr_f32_state struct */
-  st->tmpbuf = (kiss_fft_f32_cpx *) (((char *) st->substate) + subsize);
+  st->substate = (kiss_fft_f32_cfg) (((char *) st) + ALIGN_STRUCT (sizeof (struct kiss_fftr_f32_state)));       /*just beyond kiss_fftr_f32_state struct */
+  st->tmpbuf =
+      (kiss_fft_f32_cpx *) (((char *) st->substate) + ALIGN_STRUCT (subsize));
   st->super_twiddles = st->tmpbuf + nfft;
   kiss_fft_f32_alloc (nfft, inverse_fft, st->substate, &subsize);
 
index d566336d37ef9633aa862fd99c41188c0039d5df..59587147ba0f9edbe0c021108dc7fe5b2e75759a 100644 (file)
@@ -39,9 +39,9 @@ kiss_fftr_f64_alloc (int nfft, int inverse_fft, void *mem, size_t * lenmem)
   nfft >>= 1;
 
   kiss_fft_f64_alloc (nfft, inverse_fft, NULL, &subsize);
-  memneeded =
-      sizeof (struct kiss_fftr_f64_state) + subsize +
-      sizeof (kiss_fft_f64_cpx) * (nfft * 2);
+  memneeded = ALIGN_STRUCT (sizeof (struct kiss_fftr_f64_state))
+      + ALIGN_STRUCT (subsize)
+      sizeof (kiss_fft_f64_cpx) * (nfft * 2);
 
   if (lenmem == NULL) {
     st = (kiss_fftr_f64_cfg) KISS_FFT_F64_MALLOC (memneeded);
@@ -53,8 +53,9 @@ kiss_fftr_f64_alloc (int nfft, int inverse_fft, void *mem, size_t * lenmem)
   if (!st)
     return NULL;
 
-  st->substate = (kiss_fft_f64_cfg) (st + 1);   /*just beyond kiss_fftr_f64_state struct */
-  st->tmpbuf = (kiss_fft_f64_cpx *) (((char *) st->substate) + subsize);
+  st->substate = (kiss_fft_f64_cfg) (((char *) st) + ALIGN_STRUCT (sizeof (struct kiss_fftr_f64_state)));       /*just beyond kiss_fftr_f64_state struct */
+  st->tmpbuf =
+      (kiss_fft_f64_cpx *) (((char *) st->substate) + ALIGN_STRUCT (subsize));
   st->super_twiddles = st->tmpbuf + nfft;
   kiss_fft_f64_alloc (nfft, inverse_fft, st->substate, &subsize);
 
index 2df51557a24bbb7974fc979b8164f61707ac0dd6..803fa6338087212502da23b2b2946346c537c1b1 100644 (file)
@@ -39,9 +39,9 @@ kiss_fftr_s16_alloc (int nfft, int inverse_fft, void *mem, size_t * lenmem)
   nfft >>= 1;
 
   kiss_fft_s16_alloc (nfft, inverse_fft, NULL, &subsize);
-  memneeded =
-      sizeof (struct kiss_fftr_s16_state) + subsize +
-      sizeof (kiss_fft_s16_cpx) * (nfft * 2);
+  memneeded = ALIGN_STRUCT (sizeof (struct kiss_fftr_s16_state))
+      + ALIGN_STRUCT (subsize)
+      sizeof (kiss_fft_s16_cpx) * (nfft * 2);
 
   if (lenmem == NULL) {
     st = (kiss_fftr_s16_cfg) KISS_FFT_S16_MALLOC (memneeded);
@@ -53,8 +53,9 @@ kiss_fftr_s16_alloc (int nfft, int inverse_fft, void *mem, size_t * lenmem)
   if (!st)
     return NULL;
 
-  st->substate = (kiss_fft_s16_cfg) (st + 1);   /*just beyond kiss_fftr_s16_state struct */
-  st->tmpbuf = (kiss_fft_s16_cpx *) (((char *) st->substate) + subsize);
+  st->substate = (kiss_fft_s16_cfg) (((char *) st) + ALIGN_STRUCT (sizeof (struct kiss_fftr_s16_state)));       /*just beyond kiss_fftr_s16_state struct */
+  st->tmpbuf =
+      (kiss_fft_s16_cpx *) (((char *) st->substate) + ALIGN_STRUCT (subsize));
   st->super_twiddles = st->tmpbuf + nfft;
   kiss_fft_s16_alloc (nfft, inverse_fft, st->substate, &subsize);
 
index 47dc1870360e75eff9b8cf741de56663e97f734d..e2a8541a5a791fb8804c18728b4ec07629aae7ba 100644 (file)
@@ -39,9 +39,9 @@ kiss_fftr_s32_alloc (int nfft, int inverse_fft, void *mem, size_t * lenmem)
   nfft >>= 1;
 
   kiss_fft_s32_alloc (nfft, inverse_fft, NULL, &subsize);
-  memneeded =
-      sizeof (struct kiss_fftr_s32_state) + subsize +
-      sizeof (kiss_fft_s32_cpx) * (nfft * 2);
+  memneeded = ALIGN_STRUCT (sizeof (struct kiss_fftr_s32_state))
+      + ALIGN_STRUCT (subsize)
+      sizeof (kiss_fft_s32_cpx) * (nfft * 2);
 
   if (lenmem == NULL) {
     st = (kiss_fftr_s32_cfg) KISS_FFT_S32_MALLOC (memneeded);
@@ -53,8 +53,9 @@ kiss_fftr_s32_alloc (int nfft, int inverse_fft, void *mem, size_t * lenmem)
   if (!st)
     return NULL;
 
-  st->substate = (kiss_fft_s32_cfg) (st + 1);   /*just beyond kiss_fftr_s32_state struct */
-  st->tmpbuf = (kiss_fft_s32_cpx *) (((char *) st->substate) + subsize);
+  st->substate = (kiss_fft_s32_cfg) (((char *) st) + ALIGN_STRUCT (sizeof (struct kiss_fftr_s32_state)));       /*just beyond kiss_fftr_s32_state struct */
+  st->tmpbuf =
+      (kiss_fft_s32_cpx *) (((char *) st->substate) + ALIGN_STRUCT (subsize));
   st->super_twiddles = st->tmpbuf + nfft;
   kiss_fft_s32_alloc (nfft, inverse_fft, st->substate, &subsize);