00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __trash_stack
00018 #define __trash_stack
00019
00020 #include <glib.h>
00021 #include <string.h>
00022
00023 typedef struct trash_stack_list {
00024 struct trash_stack_list *next;
00025 } trash_stack_list;
00026
00027 typedef struct {
00028 unsigned item_size;
00029 trash_stack_list *free_list;
00030 unsigned next_index;
00031 GSList *buffers;
00032 } trash_stack;
00033
00034 trash_stack *mesh_create_trash_stack(unsigned item_size);
00035
00036 void mesh_destroy_trash_stack(trash_stack *stack);
00037
00038 gpointer mesh_trash_stack_alloc_slow(trash_stack *stack);
00039
00040 inline static
00041 gpointer mesh_trash_stack_alloc(trash_stack *stack) {
00042
00043
00044 if(stack->free_list) {
00045 trash_stack_list *item = stack->free_list;
00046 stack->free_list = item->next;
00047 return item;
00048 }
00049
00050
00051 return mesh_trash_stack_alloc_slow(stack);
00052 }
00053
00054 inline static
00055 gpointer mesh_trash_stack_alloc0(trash_stack *stack) {
00056 gpointer *item = mesh_trash_stack_alloc(stack);
00057 memset(item, 0, stack->item_size);
00058 return item;
00059 }
00060
00061 inline static
00062 void mesh_trash_stack_free(trash_stack *stack, gpointer item) {
00063
00064 trash_stack_list *head = item;
00065 head->next = stack->free_list;
00066 stack->free_list = head;
00067 }
00068
00069 #endif