From 17ff81fc7da50860060fc78119508c403e1332c7 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 10 Jun 2011 13:59:31 +0200 Subject: [PATCH] memory: respect configured alignment Move the alignment from GstBuffer to GstMemory. make sure memory is at least aligned to the configured values. --- configure.ac | 18 +++++++++--------- gst/gstbuffer.c | 24 ------------------------ gst/gstmemory.c | 23 +++++++++++++++++++++++ 3 files changed, 32 insertions(+), 33 deletions(-) diff --git a/configure.ac b/configure.ac index 2d8ce35..cf94327 100644 --- a/configure.ac +++ b/configure.ac @@ -556,22 +556,22 @@ dnl bit of a misnomer, but keep the conditional named like this so we don't dnl have to change too much elsewhere AM_CONDITIONAL(HAVE_CHECK, test "x$BUILD_CHECK" = "xyes") -dnl configure the desired buffer alignment -AC_ARG_WITH([buffer-alignment], - AS_HELP_STRING([--with-buffer-alignment],[8,N,malloc,pagesize (default is 32)]), +dnl configure the desired memory alignment +AC_ARG_WITH([memory-alignment], + AS_HELP_STRING([--with-memory-alignment],[8,N,malloc,pagesize (default is 32)]), [ if test "x$withval" = "xyes" then - AC_DEFINE(BUFFER_ALIGNMENT, 32, [Buffer alignment to use]) + AC_DEFINE(MEMORY_ALIGNMENT, 32, [Memory alignment to use]) else case "${withval}" in - malloc) AC_DEFINE(BUFFER_ALIGNMENT_MALLOC, 1, [Buffer alignment by malloc default]) ;; - pagesize) AC_DEFINE(BUFFER_ALIGNMENT_PAGESIZE, 1, [Buffer alignment by pagesize]) ;; - *) AC_DEFINE_UNQUOTED(BUFFER_ALIGNMENT, ${withval}, [Buffer alignment to use]) ;; + malloc) AC_DEFINE(MEMORY_ALIGNMENT_MALLOC, 1, [Memory alignment by malloc default]) ;; + pagesize) AC_DEFINE(MEMORY_ALIGNMENT_PAGESIZE, 1, [Memory alignment by pagesize]) ;; + *) AC_DEFINE_UNQUOTED(MEMORY_ALIGNMENT, ${withval}, [Memory alignment to use]) ;; esac fi ], [ - AC_DEFINE(BUFFER_ALIGNMENT_MALLOC, 1, [Buffer alignment by malloc default]) + AC_DEFINE(MEMORY_ALIGNMENT_MALLOC, 1, [Memory alignment by malloc default]) ] ) @@ -798,7 +798,7 @@ sed \ -e 's/.* HAVE_WIN32$/#define HAVE_WIN32 1/' \ -e 's/.* HAVE_WINSOCK2_H$/#define HAVE_WINSOCK2_H 1/' \ -e 's/.* HOST_CPU$/#define HOST_CPU "i686"/' \ - -e 's/.* BUFFER_ALIGNMENT_MALLOC/#define BUFFER_ALIGNMENT_MALLOC 1/' \ + -e 's/.* MEMORY_ALIGNMENT_MALLOC/#define MEMORY_ALIGNMENT_MALLOC 1/' \ -e 's/.* LIBDIR$/#ifdef _DEBUG\n# define LIBDIR PREFIX "\\\\debug\\\\lib"\n#else\n# define LIBDIR PREFIX "\\\\lib"\n#endif/' \ -e 's/.* LOCALEDIR$/#define LOCALEDIR PREFIX "\\\\share\\\\locale"/' \ -e 's/.* PACKAGE$/#define PACKAGE "gstreamer"/' \ diff --git a/gst/gstbuffer.c b/gst/gstbuffer.c index c1778c7..6c87971 100644 --- a/gst/gstbuffer.c +++ b/gst/gstbuffer.c @@ -211,35 +211,11 @@ _memory_add (GstBuffer * buffer, GstMemory * mem) GST_BUFFER_MEM_LEN (buffer) = len + 1; } -#if 0 -/* buffer alignment in bytes - 1 - * an alignment of 7 would be the same as malloc() guarantees - */ -#ifdef HAVE_POSIX_MEMALIGN -#if defined(BUFFER_ALIGNMENT_MALLOC) -static size_t _gst_buffer_data_alignment = 7; -#elif defined(BUFFER_ALIGNMENT_PAGESIZE) -static size_t _gst_buffer_data_alignment = 0; -#elif defined(BUFFER_ALIGNMENT) -static size_t _gst_buffer_data_alignment = BUFFER_ALIGNMENT - 1; -#else -#error "No buffer alignment configured" -#endif -#endif /* HAVE_POSIX_MEMALIGN */ -#endif - void _gst_buffer_initialize (void) { if (G_LIKELY (_gst_buffer_type == 0)) { _gst_buffer_type = gst_mini_object_register ("GstBuffer"); -#if 0 -#ifdef HAVE_GETPAGESIZE -#ifdef BUFFER_ALIGNMENT_PAGESIZE - _gst_buffer_data_alignment = getpagesize () - 1; -#endif -#endif -#endif } } diff --git a/gst/gstmemory.c b/gst/gstmemory.c index cd1d7dc..a040cef 100644 --- a/gst/gstmemory.c +++ b/gst/gstmemory.c @@ -63,6 +63,21 @@ #include "gstmemory.h" +/* buffer alignment in bytes - 1 + * an alignment of 7 would be the same as malloc() guarantees + */ +#ifdef HAVE_POSIX_MEMALIGN +#if defined(MEMORY_ALIGNMENT_MALLOC) +static size_t _gst_memory_alignment = 7; +#elif defined(MEMORY_ALIGNMENT_PAGESIZE) +static size_t _gst_memory_alignment = 0; +#elif defined(MEMORY_ALIGNMENT) +static size_t _gst_memory_alignment = MEMORY_ALIGNMENT - 1; +#else +#error "No memory alignment configured" +#endif +#endif /* HAVE_POSIX_MEMALIGN */ + struct _GstMemoryAllocator { GQuark name; @@ -131,6 +146,8 @@ _default_mem_new_block (gsize maxsize, gsize align, gsize offset, gsize size) gsize aoffset, slice_size; guint8 *data; + /* ensure configured alignment */ + align |= _gst_memory_alignment; /* allocate more to compensate for alignment */ maxsize += align; /* alloc header and data in one block */ @@ -300,6 +317,12 @@ _gst_memory_init (void) allocators = g_hash_table_new (g_str_hash, g_str_equal); +#ifdef HAVE_GETPAGESIZE +#ifdef MEMORY_ALIGNMENT_PAGESIZE + _gst_memory_alignment = getpagesize () - 1; +#endif +#endif + _default_mem_impl = gst_memory_allocator_register ("GstMemoryDefault", &_mem_info); -- 2.7.4