1bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* 2bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee INTEL CONFIDENTIAL 3bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee Copyright 2009 Intel Corporation All Rights Reserved. 4bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee The source code contained or described herein and all documents related to the source code ("Material") are owned by Intel Corporation or its suppliers or licensors. Title to the Material remains with Intel Corporation or its suppliers and licensors. The Material contains trade secrets and proprietary and confidential information of Intel or its suppliers and licensors. The Material is protected by worldwide copyright and trade secret laws and treaty provisions. No part of the Material may be used, copied, reproduced, modified, published, uploaded, posted, transmitted, distributed, or disclosed in any way without Intel’s prior express written permission. 5bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 6bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee No license under any patent, copyright, trade secret or other intellectual property right is granted to or conferred upon you by disclosure or delivery of the Materials, either expressly, by implication, inducement, estoppel or otherwise. Any license under such intellectual property rights must be express and approved by Intel in writing. 7bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 8bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 9bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/** 10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * SECTION:mixbufferpool 11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @short_description: MI-X Input Buffer Pool 12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * 13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * A data object which stores and manipulates a pool of compressed video buffers. 14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideolog.h" 17bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixbufferpool.h" 18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixbuffer_private.h" 19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIX_LOCK(lock) g_mutex_lock(lock); 21bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIX_UNLOCK(lock) g_mutex_unlock(lock); 22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define SAFE_FREE(p) if(p) { g_free(p); p = NULL; } 24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 25bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic GType _mix_bufferpool_type = 0; 26bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MixParamsClass *parent_class = NULL; 27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define _do_init { _mix_bufferpool_type = g_define_type_id; } 29bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 30bd8388b4555645b3d29abc6a94c303638064d69awonjong.leegboolean mix_bufferpool_copy(MixParams * target, const MixParams * src); 31bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixParams *mix_bufferpool_dup(const MixParams * obj); 32bd8388b4555645b3d29abc6a94c303638064d69awonjong.leegboolean mix_bufferpool_equal(MixParams * first, MixParams * second); 33bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_bufferpool_finalize(MixParams * obj); 34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 35bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeG_DEFINE_TYPE_WITH_CODE (MixBufferPool, mix_bufferpool, MIX_TYPE_PARAMS, 36bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee _do_init); 37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 38bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_bufferpool_init(MixBufferPool * self) { 39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* initialize properties here */ 40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->free_list = NULL; 41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->in_use_list = NULL; 42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->free_list_max_size = 0; 43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->high_water_mark = 0; 44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->reserved1 = NULL; 46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->reserved2 = NULL; 47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->reserved3 = NULL; 48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->reserved4 = NULL; 49bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // TODO: relocate this mutex allocation -we can't communicate failure in ctor. 51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Note that g_thread_init() has already been called by mix_video_init() 52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->objectlock = g_mutex_new(); 53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 56bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_bufferpool_class_init(MixBufferPoolClass * klass) { 57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixParamsClass *mixparams_class = MIX_PARAMS_CLASS(klass); 58bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* setup static parent class */ 60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent_class = (MixParamsClass *) g_type_class_peek_parent(klass); 61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mixparams_class->finalize = mix_bufferpool_finalize; 63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mixparams_class->copy = (MixParamsCopyFunction) mix_bufferpool_copy; 64bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mixparams_class->dup = (MixParamsDupFunction) mix_bufferpool_dup; 65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mixparams_class->equal = (MixParamsEqualFunction) mix_bufferpool_equal; 66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 68bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixBufferPool * 69bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_bufferpool_new(void) { 70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixBufferPool *ret = (MixBufferPool *) g_type_create_instance( 71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_TYPE_BUFFERPOOL); 72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 75bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid mix_bufferpool_finalize(MixParams * obj) { 76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* clean up here. */ 77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixBufferPool *self = MIX_BUFFERPOOL(obj); 79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->objectlock) { 81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_free(self->objectlock); 82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->objectlock = NULL; 83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 85bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Chain up parent */ 86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent_class->finalize) { 87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent_class->finalize(obj); 88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 91bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixBufferPool * 92bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_bufferpool_ref(MixBufferPool * mix) { 93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return (MixBufferPool *) mix_params_ref(MIX_PARAMS(mix)); 94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/** 97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * mix_bufferpool_dup: 98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @obj: a #MixBufferPool object 99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @returns: a newly allocated duplicate of the object. 100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * 101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Copy duplicate of the object. 102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 103bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixParams * 104bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_bufferpool_dup(const MixParams * obj) { 105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixParams *ret = NULL; 106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (MIX_IS_BUFFERPOOL(obj)) { 108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_LOCK(MIX_BUFFERPOOL(obj)->objectlock); 110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixBufferPool *duplicate = mix_bufferpool_new(); 112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix_bufferpool_copy(MIX_PARAMS(duplicate), MIX_PARAMS(obj))) { 113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_PARAMS(duplicate); 114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_bufferpool_unref(duplicate); 116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_UNLOCK(MIX_BUFFERPOOL(obj)->objectlock); 119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/** 125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * mix_bufferpool_copy: 126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @target: copy to target 127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @src: copy from src 128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @returns: boolean indicates if copy is successful. 129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * 130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Copy instance data from @src to @target. 131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 132bd8388b4555645b3d29abc6a94c303638064d69awonjong.leegboolean mix_bufferpool_copy(MixParams * target, const MixParams * src) { 133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixBufferPool *this_target, *this_src; 134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (MIX_IS_BUFFERPOOL(target) && MIX_IS_BUFFERPOOL(src)) { 136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_LOCK(MIX_BUFFERPOOL(src)->objectlock); 138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_LOCK(MIX_BUFFERPOOL(target)->objectlock); 139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Cast the base object to this child object 141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee this_target = MIX_BUFFERPOOL(target); 142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee this_src = MIX_BUFFERPOOL(src); 143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Free the existing properties 145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Duplicate string 147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee this_target->free_list = this_src->free_list; 148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee this_target->in_use_list = this_src->in_use_list; 149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee this_target->free_list_max_size = this_src->free_list_max_size; 150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee this_target->high_water_mark = this_src->high_water_mark; 151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_UNLOCK(MIX_BUFFERPOOL(src)->objectlock); 153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_UNLOCK(MIX_BUFFERPOOL(target)->objectlock); 154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Now chainup base class 156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent_class->copy) { 157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return parent_class->copy(MIX_PARAMS_CAST(target), MIX_PARAMS_CAST( 158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee src)); 159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return TRUE; 161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return FALSE; 164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/** 167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * mix_bufferpool_equal: 168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @first: first object to compare 169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @second: seond object to compare 170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @returns: boolean indicates if instance are equal. 171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * 172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Copy instance data from @src to @target. 173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 174bd8388b4555645b3d29abc6a94c303638064d69awonjong.leegboolean mix_bufferpool_equal(MixParams * first, MixParams * second) { 175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gboolean ret = FALSE; 176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixBufferPool *this_first, *this_second; 177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (MIX_IS_BUFFERPOOL(first) && MIX_IS_BUFFERPOOL(second)) { 179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Deep compare 180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Cast the base object to this child object 181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_LOCK(MIX_BUFFERPOOL(first)->objectlock); 183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_LOCK(MIX_BUFFERPOOL(second)->objectlock); 184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee this_first = MIX_BUFFERPOOL(first); 186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee this_second = MIX_BUFFERPOOL(second); 187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: add comparison for other properties */ 189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (this_first->free_list == this_second->free_list 190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee && this_first->in_use_list == this_second->in_use_list 191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee && this_first->free_list_max_size 192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee == this_second->free_list_max_size 193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee && this_first->high_water_mark == this_second->high_water_mark) { 194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // members within this scope equal. chaining up. 195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixParamsClass *klass = MIX_PARAMS_CLASS(parent_class); 196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->equal) 197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = klass->equal(first, second); 198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = TRUE; 200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_LOCK(MIX_BUFFERPOOL(first)->objectlock); 203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_LOCK(MIX_BUFFERPOOL(second)->objectlock); 204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Class Methods */ 211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/** 213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * mix_bufferpool_initialize: 214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @returns: MIX_RESULT_SUCCESS if successful in creating the buffer pool 215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * 216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Use this method to create a new buffer pool, consisting of a GSList of 217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * buffer objects that represents a pool of buffers. 218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 219bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_bufferpool_initialize(MixBufferPool * obj, guint num_buffers) { 220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (obj == NULL) 224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_LOCK(obj->objectlock); 227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((obj->free_list != NULL) || (obj->in_use_list != NULL)) { 229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //buffer pool is in use; return error; need proper cleanup 230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO need cleanup here? 231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_UNLOCK(obj->objectlock); 233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_ALREADY_INIT; 235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (num_buffers == 0) { 238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee obj->free_list = NULL; 239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee obj->in_use_list = NULL; 241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee obj->free_list_max_size = num_buffers; 243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee obj->high_water_mark = 0; 245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_UNLOCK(obj->objectlock); 247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Initialize the free pool with MixBuffer objects 252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gint i = 0; 254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixBuffer *buffer = NULL; 255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (; i < num_buffers; i++) { 257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee buffer = mix_buffer_new(); 259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (buffer == NULL) { 261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO need to log an error here and do cleanup 262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_UNLOCK(obj->objectlock); 264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NO_MEMORY; 266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Set the pool reference in the private data of the MixBuffer object 269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_buffer_set_pool(buffer, obj); 270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Add each MixBuffer object to the pool list 272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee obj->free_list = g_slist_append(obj->free_list, buffer); 273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee obj->in_use_list = NULL; 277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee obj->free_list_max_size = num_buffers; 279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee obj->high_water_mark = 0; 281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_UNLOCK(obj->objectlock); 283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "End\n"); 285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 286bd8388b4555645b3d29abc6a94c303638064d69awonjong.leereturn MIX_RESULT_SUCCESS; 287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/** 290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * mix_bufferpool_put: 291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @returns: SUCCESS or FAILURE 292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * 293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Use this method to return a buffer to the free pool 294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 295bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_bufferpool_put(MixBufferPool * obj, MixBuffer * buffer) { 296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (obj == NULL || buffer == NULL) 298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_LOCK(obj->objectlock); 301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (obj->in_use_list == NULL) { 303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //in use list cannot be empty if a buffer is in use 304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO need better error code for this 305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_UNLOCK(obj->objectlock); 307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee GSList *element = g_slist_find(obj->in_use_list, buffer); 312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (element == NULL) { 313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Integrity error; buffer not found in in use list 314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO need better error code and handling for this 315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_UNLOCK(obj->objectlock); 317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Remove this element from the in_use_list 321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee obj->in_use_list = g_slist_remove_link(obj->in_use_list, element); 322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Concat the element to the free_list 324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee obj->free_list = g_slist_concat(obj->free_list, element); 325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Note that we do nothing with the ref count for this. We want it to 328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //stay at 1, which is what triggered it to be added back to the free list. 329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_UNLOCK(obj->objectlock); 331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/** 336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * mix_bufferpool_get: 337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @returns: SUCCESS or FAILURE 338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * 339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Use this method to get a buffer from the free pool 340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 341bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_bufferpool_get(MixBufferPool * obj, MixBuffer ** buffer) { 342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (obj == NULL || buffer == NULL) 344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_LOCK(obj->objectlock); 347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (obj->free_list == NULL) { 349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //We are out of buffers 350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO need to log this as well 351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_UNLOCK(obj->objectlock); 353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_POOLEMPTY; 355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Remove a buffer from the free pool 358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //We just remove the one at the head, since it's convenient 360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee GSList *element = obj->free_list; 361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee obj->free_list = g_slist_remove_link(obj->free_list, element); 362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (element == NULL) { 363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Unexpected behavior 364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO need better error code and handling for this 365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_UNLOCK(obj->objectlock); 367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Concat the element to the in_use_list 371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee obj->in_use_list = g_slist_concat(obj->in_use_list, element); 372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO replace with proper logging 374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "buffer refcount%d\n", 376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_PARAMS(element->data)->refcount); 377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Set the out buffer pointer 379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *buffer = (MixBuffer *) element->data; 380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Check the high water mark for buffer use 382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint size = g_slist_length(obj->in_use_list); 383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (size > obj->high_water_mark) 384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee obj->high_water_mark = size; 385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO Log this high water mark 386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Increment the reference count for the buffer 389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_buffer_ref(*buffer); 390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_UNLOCK(obj->objectlock); 392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/** 397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * mix_bufferpool_deinitialize: 398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @returns: SUCCESS or FAILURE 399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * 400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Use this method to teardown a buffer pool 401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 402bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_bufferpool_deinitialize(MixBufferPool * obj) { 403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (obj == NULL) 404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_LOCK(obj->objectlock); 407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 408bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((obj->in_use_list != NULL) || (g_slist_length(obj->free_list) 409bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee != obj->free_list_max_size)) { 410bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO better error code 411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //We have outstanding buffer objects in use and they need to be 412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //freed before we can deinitialize. 413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_UNLOCK(obj->objectlock); 415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 417bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Now remove buffer objects from the list 420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixBuffer *buffer = NULL; 422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while (obj->free_list != NULL) { 424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Get the buffer object from the head of the list 425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee buffer = obj->free_list->data; 426bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //buffer = g_slist_nth_data(obj->free_list, 0); 427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Release it 429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_buffer_unref(buffer); 430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Delete the head node of the list and store the new head 432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee obj->free_list = g_slist_delete_link(obj->free_list, obj->free_list); 433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Repeat until empty 435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee obj->free_list_max_size = 0; 438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //May want to log this information for tuning 440bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee obj->high_water_mark = 0; 441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_UNLOCK(obj->objectlock); 443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIX_BUFFERPOOL_SETTER_CHECK_INPUT(obj) \ 448bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(!obj) return MIX_RESULT_NULL_PTR; \ 449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(!MIX_IS_BUFFERPOOL(obj)) return MIX_RESULT_FAIL; \ 450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIX_BUFFERPOOL_GETTER_CHECK_INPUT(obj, prop) \ 452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(!obj || !prop) return MIX_RESULT_NULL_PTR; \ 453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(!MIX_IS_BUFFERPOOL(obj)) return MIX_RESULT_FAIL; \ 454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 456bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT 457bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_bufferpool_dumpbuffer(MixBuffer *buffer) 458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "\tBuffer %x, ptr %x, refcount %d\n", (guint)buffer, 460bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (guint)buffer->data, MIX_PARAMS(buffer)->refcount); 461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 464bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT 465bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_bufferpool_dumpprint (MixBufferPool * obj) 466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 467bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO replace this with proper logging later 468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "BUFFER POOL DUMP:\n"); 470bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "Free list size is %d\n", g_slist_length(obj->free_list)); 471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "In use list size is %d\n", g_slist_length(obj->in_use_list)); 472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "High water mark is %lu\n", obj->high_water_mark); 473bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Walk the free list and report the contents 475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "Free list contents:\n"); 476bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_slist_foreach(obj->free_list, (GFunc) mix_bufferpool_dumpbuffer, NULL); 477bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Walk the in_use list and report the contents 479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "In Use list contents:\n"); 480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_slist_foreach(obj->in_use_list, (GFunc) mix_bufferpool_dumpbuffer, NULL); 481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 484bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 485