return;
}
/* either the pool is full or this size doesn't use a pool - free the buf */
- if( b->data )
+ while( b )
{
- free( b->data );
- hb_lock(buffers.lock);
- buffers.allocated -= b->alloc;
- hb_unlock(buffers.lock);
+ hb_buffer_t * next = b->next;
+ if( b->data )
+ {
+ free( b->data );
+ hb_lock(buffers.lock);
+ buffers.allocated -= b->alloc;
+ hb_unlock(buffers.lock);
+ }
+ free( b );
+ b = next;
}
- free( b );
*_b = NULL;
}
return f;
}
+int hb_fifo_size_bytes( hb_fifo_t * f )
+{
+ int ret = 0;
+ hb_buffer_t * link;
+
+ hb_lock( f->lock );
+ link = f->first;
+ while ( link )
+ {
+ ret += link->size;
+ link = link->next;
+ }
+ hb_unlock( f->lock );
+
+ return ret;
+}
+
int hb_fifo_size( hb_fifo_t * f )
{
int ret;
return b;
}
+int hb_fifo_full_wait( hb_fifo_t * f )
+{
+ int result;
+
+ hb_lock( f->lock );
+ if( f->size >= f->capacity )
+ {
+ f->wait_full = 1;
+ hb_cond_timedwait( f->cond_full, f->lock, FIFO_TIMEOUT );
+ }
+ result = ( f->size < f->capacity );
+ hb_unlock( f->lock );
+ return result;
+}
+
void hb_fifo_push_wait( hb_fifo_t * f, hb_buffer_t * b )
{
if( !b )