From 900aea46fa8fee99348fce2626feae2a8326d6af Mon Sep 17 00:00:00 2001 From: Thomas Vander Stichele Date: Mon, 17 Oct 2005 14:42:22 +0000 Subject: [PATCH] gst/: out. get out. you're fired. to the Attic ! Original commit message from CVS: * gst/gstmemchunk.c: * gst/gstmemchunk.h: * gst/gsttrashstack.c: * gst/gsttrashstack.h: out. get out. you're fired. to the Attic ! --- ChangeLog | 8 ++ gst/gstmemchunk.c | 288 -------------------------------------------- gst/gstmemchunk.h | 48 -------- gst/gsttrashstack.c | 30 ----- gst/gsttrashstack.h | 198 ------------------------------ 5 files changed, 8 insertions(+), 564 deletions(-) delete mode 100644 gst/gstmemchunk.c delete mode 100644 gst/gstmemchunk.h delete mode 100644 gst/gsttrashstack.c delete mode 100644 gst/gsttrashstack.h diff --git a/ChangeLog b/ChangeLog index a2d863ead5..b27aba1e5e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-10-17 Thomas Vander Stichele + + * gst/gstmemchunk.c: + * gst/gstmemchunk.h: + * gst/gsttrashstack.c: + * gst/gsttrashstack.h: + out. get out. you're fired. to the Attic ! + 2005-10-17 Thomas Vander Stichele * gst/gstcaps.c: (gst_caps_intersect): diff --git a/gst/gstmemchunk.c b/gst/gstmemchunk.c deleted file mode 100644 index 580e0d1bbc..0000000000 --- a/gst/gstmemchunk.c +++ /dev/null @@ -1,288 +0,0 @@ -/* GStreamer - * Copyright (C) <1999> Erik Walthinsen - * <2005> Wim Taymans - * - * gstmemchunk.c: implementation of lockfree allocation of fixed - * size memory chunks. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/** - * SECTION:gstmemchunk - * @short_description: Atomic chunk allocator - * @see_also: #GstBuffer, #GstEvent, #GstData - * - * GstMemChunk is an atomic chunk allocator. It uses atomic operations to - * allocate fixed size memory regions and is therefore thread safe without the - * overhead of mutexes or other heavyweight locking mechanisms. - * - * The GstMemChunk is used to allocate critical resources for #GstBuffer and - * #GstEvent. - */ - -#include "gst_private.h" - -#include /* memset */ - -#include "gstmemchunk.h" -#include "gsttrashstack.h" -#ifdef HAVE_VALGRIND -#include -#include -#endif - -#define GST_MEM_CHUNK_AREA(chunk) (((GstMemChunkElement*)(chunk))->area) -#define GST_MEM_CHUNK_DATA(chunk) ((gpointer)(((GstMemChunkElement*)(chunk)) + 1)) -#define GST_MEM_CHUNK_LINK(mem) ((GstMemChunkElement*)((guint8*)(mem) - sizeof (GstMemChunkElement))) - -typedef struct _GstMemChunkElement GstMemChunkElement; - -struct _GstMemChunkElement -{ - GstTrashStackElement elem; /* make sure we can safely push it on the trashstack */ - gpointer area; /* pointer to data areas */ -}; - -struct _GstMemChunk -{ - GstTrashStack stack; - - gchar *name; - gulong area_size; - gulong chunk_size; - gulong atom_size; - gboolean cleanup; -}; - -/******************************************************* - * area size - * +-------------------------------------------------------+ - * chunk size - * +-----------------+ - * - * !next!area|data... !next!area!data.... !next!area!data... - * ! ^ ! ^ ! - * +------------------+ +-----------------+ +--------> NULL - * - */ -static gboolean -populate (GstMemChunk * mem_chunk) -{ - guint8 *area; - guint i; - - if (mem_chunk->cleanup) - return FALSE; - - /* FIXME: if we don't do this here and use g_malloc, valgrind crashes */ -#if HAVE_VALGRIND - if (__gst_in_valgrind ()) { - /* copied from valgrind example */ - area = - (guint8 *) mmap (0, mem_chunk->area_size, - PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, -1, 0); - } else -#endif - { - area = g_malloc0 (mem_chunk->area_size); - } - - for (i = 0; i < mem_chunk->area_size; i += mem_chunk->chunk_size) { - GST_MEM_CHUNK_AREA (area + i) = area; - gst_trash_stack_push (&mem_chunk->stack, area + i); - } - - return TRUE; -} - -/** - * gst_mem_chunk_new: - * @name: the name of the chunk - * @atom_size: the size of the allocated atoms - * @area_size: the initial size of the memory area - * @type: the allocation strategy to use - * - * Creates a new memchunk that will allocate atom_sized memchunks. - * The initial area is set to area_size and will grow automatically - * when it is too small (with a small overhead when that happens) - * - * Returns: a new #GstMemChunk - * - * MT safe. - */ -GstMemChunk * -gst_mem_chunk_new (gchar * name, guint atom_size, gulong area_size, gint type) -{ - GstMemChunk *mem_chunk; - - g_return_val_if_fail (atom_size > 0, NULL); - g_return_val_if_fail (area_size >= atom_size, NULL); - - mem_chunk = g_malloc (sizeof (GstMemChunk)); - - mem_chunk->chunk_size = atom_size + sizeof (GstMemChunkElement); - area_size = (area_size / atom_size) * mem_chunk->chunk_size; - - mem_chunk->name = g_strdup (name); - mem_chunk->atom_size = atom_size; - mem_chunk->area_size = area_size; - mem_chunk->cleanup = FALSE; - gst_trash_stack_init (&mem_chunk->stack); - - populate (mem_chunk); - - return mem_chunk; -} - -static gboolean -free_area (gpointer key, gpointer value, gpointer user_data) -{ -#if HAVE_VALGRIND - GstMemChunk *chunk = (GstMemChunk *) user_data; - - if (__gst_in_valgrind ()) { - /* copied from valgrind example */ - munmap (key, chunk->area_size); - } else -#endif - { - g_free (key); - } - - return TRUE; -} - -/** - * gst_mem_chunk_destroy: - * @mem_chunk: the GstMemChunk to destroy - * - * Free the memory allocated by the memchunk. This function - * is not Threadsafe as it does not wait for all outstanding - * allocations to be freed. - */ -void -gst_mem_chunk_destroy (GstMemChunk * mem_chunk) -{ - GHashTable *elements = g_hash_table_new (NULL, NULL); - gpointer data; - - mem_chunk->cleanup = TRUE; - - data = gst_mem_chunk_alloc (mem_chunk); - while (data) { - GstMemChunkElement *elem = GST_MEM_CHUNK_LINK (data); - - g_hash_table_insert (elements, GST_MEM_CHUNK_AREA (elem), NULL); - - data = gst_mem_chunk_alloc (mem_chunk); - } - g_hash_table_foreach_remove (elements, free_area, mem_chunk); - - g_hash_table_destroy (elements); - g_free (mem_chunk->name); - g_free (mem_chunk); -} - -/** - * gst_mem_chunk_alloc: - * @mem_chunk: the mem chunk to use - * - * Allocate a new memory region from the chunk. The size - * of the allocated memory was specified when the memchunk - * was created. - * - * Returns: a pointer to the allocated memory region. - * - * MT safe. - */ -gpointer -gst_mem_chunk_alloc (GstMemChunk * mem_chunk) -{ - GstMemChunkElement *chunk; - - g_return_val_if_fail (mem_chunk != NULL, NULL); - -again: - chunk = gst_trash_stack_pop (&mem_chunk->stack); - /* chunk is empty, try to refill */ - if (G_UNLIKELY (!chunk)) { - if (G_LIKELY (populate (mem_chunk))) { - goto again; - } else { - /* this happens when we are in cleanup mode and we - * allocate all remaining chunks for cleanup */ - return NULL; - } - } -#ifdef HAVE_VALGRIND - if (G_UNLIKELY (__gst_in_valgrind ())) { - VALGRIND_MALLOCLIKE_BLOCK (GST_MEM_CHUNK_DATA (chunk), mem_chunk->atom_size, - 0, 0); - } -#endif - return GST_MEM_CHUNK_DATA (chunk); -} - -/** - * gst_mem_chunk_alloc0: - * @mem_chunk: the mem chunk to use - * - * Allocate a new memory region from the chunk. The size - * of the allocated memory was specified when the memchunk - * was created. The memory will be set to all zeroes. - * - * Returns: a pointer to the allocated memory region. - * - * MT safe. - */ -gpointer -gst_mem_chunk_alloc0 (GstMemChunk * mem_chunk) -{ - gpointer mem = gst_mem_chunk_alloc (mem_chunk); - - if (G_LIKELY (mem)) - memset (mem, 0, mem_chunk->atom_size); - - return mem; -} - -/** - * gst_mem_chunk_free: - * @mem_chunk: the mem chunk to use - * @mem: the memory region to hand back to the chunk - * - * Free the memeory region allocated from the chunk. - * - * MT safe. - */ -void -gst_mem_chunk_free (GstMemChunk * mem_chunk, gpointer mem) -{ - GstMemChunkElement *chunk; - - g_return_if_fail (mem_chunk != NULL); - g_return_if_fail (mem != NULL); - - chunk = GST_MEM_CHUNK_LINK (mem); - -#ifdef HAVE_VALGRIND - if (G_UNLIKELY (__gst_in_valgrind ())) { - VALGRIND_FREELIKE_BLOCK (mem, 0); - } -#endif - gst_trash_stack_push (&mem_chunk->stack, chunk); -} diff --git a/gst/gstmemchunk.h b/gst/gstmemchunk.h deleted file mode 100644 index 620292b308..0000000000 --- a/gst/gstmemchunk.h +++ /dev/null @@ -1,48 +0,0 @@ -/* GStreamer - * Copyright (C) <1999> Erik Walthinsen - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GST_MEM_CHUNK_H__ -#define __GST_MEM_CHUNK_H__ - -#include - -G_BEGIN_DECLS - -/** - * GstMemChunk: - * - * The memchunk data structure - */ -typedef struct _GstMemChunk GstMemChunk; - -GstMemChunk* gst_mem_chunk_new (gchar *name, - guint atom_size, - gulong area_size, - gint type); - -void gst_mem_chunk_destroy (GstMemChunk *mem_chunk); - -gpointer gst_mem_chunk_alloc (GstMemChunk *mem_chunk); -gpointer gst_mem_chunk_alloc0 (GstMemChunk *mem_chunk); -void gst_mem_chunk_free (GstMemChunk *mem_chunk, - gpointer mem); - -G_END_DECLS - -#endif /* __GST_MEM_CHUNK_H__ */ diff --git a/gst/gsttrashstack.c b/gst/gsttrashstack.c deleted file mode 100644 index e678c6b18f..0000000000 --- a/gst/gsttrashstack.c +++ /dev/null @@ -1,30 +0,0 @@ -/* GStreamer - * Copyright (C) <1999> Erik Walthinsen - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -/** - * SECTION:gsttrashstack - * @short_description: - * - */ - - -#define GST_IMPLEMENT_INLINES 1 -#define __GST_TRASH_STACK_C__ - -#include "gst_private.h" -#include "gsttrashstack.h" diff --git a/gst/gsttrashstack.h b/gst/gsttrashstack.h deleted file mode 100644 index 9311dc9472..0000000000 --- a/gst/gsttrashstack.h +++ /dev/null @@ -1,198 +0,0 @@ -/* GStreamer - * Copyright (C) <1999> Erik Walthinsen - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GST_TRASH_STACK_H__ -#define __GST_TRASH_STACK_H__ - -#include -#include "gstmacros.h" - -G_BEGIN_DECLS - -typedef struct _GstTrashStack GstTrashStack; -typedef struct _GstTrashStackElement GstTrashStackElement; - -struct _GstTrashStackElement { - GstTrashStackElement *next; -}; - -typedef volatile gpointer gst_vgpointer;/* gtk-doc volatile workaround */ -typedef volatile gulong gst_vgulong; /* gtk-doc volatile workaround */ - -struct _GstTrashStack { - gst_vgpointer head; - gst_vgulong count; /* for the ABA problem */ - GMutex *lock; /* lock for C fallback */ -}; - -GST_INLINE_FUNC GstTrashStack* gst_trash_stack_new (void); -GST_INLINE_FUNC void gst_trash_stack_init (GstTrashStack *stack); -GST_INLINE_FUNC void gst_trash_stack_destroy (GstTrashStack *stack); -GST_INLINE_FUNC void gst_trash_stack_free (GstTrashStack *stack); - -GST_INLINE_FUNC void gst_trash_stack_push (GstTrashStack *stack, gpointer mem); -GST_INLINE_FUNC gpointer gst_trash_stack_pop (GstTrashStack *stack); - -#if defined (GST_CAN_INLINE) || defined (__GST_TRASH_STACK_C__) - -#if defined (USE_FAST_STACK_TRASH) && defined (__i386__) && defined (__GNUC__) && __GNUC__ >= 2 - -#ifdef GST_CONFIG_NO_SMP -#define SMP_LOCK "" -#else -#define SMP_LOCK "lock ; " -#endif - -/* - * intel ia32 optimized lockfree implementations - */ -GST_INLINE_FUNC void -gst_trash_stack_init (GstTrashStack *stack) -{ - stack->head = NULL; - stack->count = 0; -} - -GST_INLINE_FUNC void -gst_trash_stack_destroy (GstTrashStack *stack) -{ -} - -GST_INLINE_FUNC void -gst_trash_stack_push (GstTrashStack *stack, gpointer mem) -{ - __asm__ __volatile__ ( - "1: \n\t" - " movl %2, (%1); \n\t" /* mem->next == stack->head */ - SMP_LOCK "cmpxchg %1, %0; \n\t" /* if head unchanged, move mem into it */ - " jnz 1b; \n" /* head changed, retry */ - : - : "m" (*stack), - "r" (mem), - "a" (stack->head) - ); -} - -GST_INLINE_FUNC gpointer -gst_trash_stack_pop (GstTrashStack *stack) -{ - GstTrashStackElement *head; - - /* pop is a little more complicated as we need to avoid the so called ABA - * problem that arises when a pop and push of the same element happens - * right between when we read head->next and try to swing the new pointer - * into place. This is usually solved using a counter which makes it highly - * unlikely that we manage to grab the wrong head->next value. - */ - __asm__ __volatile__ ( - " pushl %%ebx; \n\t" - " testl %%eax, %%eax; \n\t" /* if (head == NULL) return */ - " jz 20f; \n\t" - "10: \n\t" - " movl (%%eax), %%ebx; \n\t" /* take value pointed to by head (head->next) */ - " movl %%edx, %%ecx; \n\t" /* take counter */ - " incl %%ecx; \n\t" /* and increment */ - SMP_LOCK "cmpxchg8b %1; \n\t" /* if eax:edx == *stack, move ebx:ecx to *stack, - * else *stack is moved into eax:edx again... */ - " jz 20f; \n\t" /* success */ - " testl %%eax, %%eax; \n\t" /* if (head == NULL) return */ - " jnz 10b; \n\t" /* else we retry */ - "20: \n\t" - " popl %%ebx \n" - : "=a" (head) - : "m" (*stack), - "a" (stack->head), - "d" (stack->count) - : "ecx" - ); - - return head; -} - -#else - -/* - * generic implementation - */ -GST_INLINE_FUNC void -gst_trash_stack_init (GstTrashStack *stack) -{ - stack->head = NULL; - stack->lock = g_mutex_new(); -} - -GST_INLINE_FUNC void -gst_trash_stack_destroy (GstTrashStack *stack) -{ - g_mutex_free (stack->lock); -} - -GST_INLINE_FUNC void -gst_trash_stack_push (GstTrashStack *stack, gpointer mem) -{ - GstTrashStackElement *elem = (GstTrashStackElement *) mem; - - g_mutex_lock (stack->lock); - elem->next = stack->head; - stack->head = elem; - g_mutex_unlock (stack->lock); -} - -GST_INLINE_FUNC gpointer -gst_trash_stack_pop (GstTrashStack *stack) -{ - GstTrashStackElement *head; - - g_mutex_lock (stack->lock); - head = (GstTrashStackElement *) stack->head; - if (head) - stack->head = head->next; - g_mutex_unlock (stack->lock); - - return head; -} - -#endif - -/* - * common functions - */ -GST_INLINE_FUNC GstTrashStack* -gst_trash_stack_new (void) -{ - GstTrashStack *stack; - - stack = g_new (GstTrashStack, 1); - gst_trash_stack_init (stack); - - return stack; -} - -GST_INLINE_FUNC void -gst_trash_stack_free (GstTrashStack *stack) -{ - gst_trash_stack_destroy (stack); - g_free (stack); -} - -#endif /* defined (GST_CAN_INLINE) || defined (__GST_TRASH_STACK_C__)*/ - -G_END_DECLS - -#endif /* __GST_TRASH_STACK_H__ */