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