pipebuffer: New callback to flush all temporary-held buffers.
Used mostly to aid debugging memory issues or to clean up resources when the drivers are long lived.
This commit is contained in:
@@ -129,7 +129,7 @@ pb_malloc_buffer_create(size_t size,
|
||||
|
||||
|
||||
static struct pb_buffer *
|
||||
pb_malloc_buffer_create_buffer(struct pb_manager *mgr,
|
||||
pb_malloc_bufmgr_create_buffer(struct pb_manager *mgr,
|
||||
size_t size,
|
||||
const struct pb_desc *desc)
|
||||
{
|
||||
@@ -137,6 +137,13 @@ pb_malloc_buffer_create_buffer(struct pb_manager *mgr,
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
pb_malloc_bufmgr_flush(struct pb_manager *mgr)
|
||||
{
|
||||
/* No-op */
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
pb_malloc_bufmgr_destroy(struct pb_manager *mgr)
|
||||
{
|
||||
@@ -146,8 +153,9 @@ pb_malloc_bufmgr_destroy(struct pb_manager *mgr)
|
||||
|
||||
static struct pb_manager
|
||||
pb_malloc_bufmgr = {
|
||||
pb_malloc_buffer_create_buffer,
|
||||
pb_malloc_bufmgr_destroy
|
||||
pb_malloc_bufmgr_destroy,
|
||||
pb_malloc_bufmgr_create_buffer,
|
||||
pb_malloc_bufmgr_flush
|
||||
};
|
||||
|
||||
|
||||
|
@@ -69,13 +69,22 @@ struct pipe_winsys;
|
||||
*/
|
||||
struct pb_manager
|
||||
{
|
||||
void
|
||||
(*destroy)( struct pb_manager *mgr );
|
||||
|
||||
struct pb_buffer *
|
||||
(*create_buffer)( struct pb_manager *mgr,
|
||||
size_t size,
|
||||
const struct pb_desc *desc);
|
||||
|
||||
/**
|
||||
* Flush all temporary-held buffers.
|
||||
*
|
||||
* Used mostly to aid debugging memory issues or to clean up resources when
|
||||
* the drivers are long lived.
|
||||
*/
|
||||
void
|
||||
(*destroy)( struct pb_manager *mgr );
|
||||
(*flush)( struct pb_manager *mgr );
|
||||
};
|
||||
|
||||
|
||||
@@ -153,9 +162,6 @@ struct pb_manager *
|
||||
pb_cache_manager_create(struct pb_manager *provider,
|
||||
unsigned usecs);
|
||||
|
||||
void
|
||||
pb_cache_flush(struct pb_manager *mgr);
|
||||
|
||||
|
||||
/**
|
||||
* Fenced buffer manager.
|
||||
|
@@ -75,6 +75,21 @@ pb_alt_manager_create_buffer(struct pb_manager *_mgr,
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
pb_alt_manager_flush(struct pb_manager *_mgr)
|
||||
{
|
||||
struct pb_alt_manager *mgr = pb_alt_manager(_mgr);
|
||||
|
||||
assert(mgr->provider1->flush);
|
||||
if(mgr->provider1->flush)
|
||||
mgr->provider1->flush(mgr->provider1);
|
||||
|
||||
assert(mgr->provider2->flush);
|
||||
if(mgr->provider2->flush)
|
||||
mgr->provider2->flush(mgr->provider2);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
pb_alt_manager_destroy(struct pb_manager *mgr)
|
||||
{
|
||||
@@ -97,6 +112,7 @@ pb_alt_manager_create(struct pb_manager *provider1,
|
||||
|
||||
mgr->base.destroy = pb_alt_manager_destroy;
|
||||
mgr->base.create_buffer = pb_alt_manager_create_buffer;
|
||||
mgr->base.flush = pb_alt_manager_flush;
|
||||
mgr->provider1 = provider1;
|
||||
mgr->provider2 = provider2;
|
||||
|
||||
|
@@ -306,8 +306,8 @@ pb_cache_manager_create_buffer(struct pb_manager *_mgr,
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
pb_cache_flush(struct pb_manager *_mgr)
|
||||
static void
|
||||
pb_cache_manager_flush(struct pb_manager *_mgr)
|
||||
{
|
||||
struct pb_cache_manager *mgr = pb_cache_manager(_mgr);
|
||||
struct list_head *curr, *next;
|
||||
@@ -323,13 +323,17 @@ pb_cache_flush(struct pb_manager *_mgr)
|
||||
next = curr->next;
|
||||
}
|
||||
pipe_mutex_unlock(mgr->mutex);
|
||||
|
||||
assert(mgr->provider->flush);
|
||||
if(mgr->provider->flush)
|
||||
mgr->provider->flush(mgr->provider);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
pb_cache_manager_destroy(struct pb_manager *mgr)
|
||||
{
|
||||
pb_cache_flush(mgr);
|
||||
pb_cache_manager_flush(mgr);
|
||||
FREE(mgr);
|
||||
}
|
||||
|
||||
@@ -349,6 +353,7 @@ pb_cache_manager_create(struct pb_manager *provider,
|
||||
|
||||
mgr->base.destroy = pb_cache_manager_destroy;
|
||||
mgr->base.create_buffer = pb_cache_manager_create_buffer;
|
||||
mgr->base.flush = pb_cache_manager_flush;
|
||||
mgr->provider = provider;
|
||||
mgr->usecs = usecs;
|
||||
LIST_INITHEAD(&mgr->delayed);
|
||||
|
@@ -313,6 +313,16 @@ pb_debug_manager_create_buffer(struct pb_manager *_mgr,
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
pb_debug_manager_flush(struct pb_manager *_mgr)
|
||||
{
|
||||
struct pb_debug_manager *mgr = pb_debug_manager(_mgr);
|
||||
assert(mgr->provider->flush);
|
||||
if(mgr->provider->flush)
|
||||
mgr->provider->flush(mgr->provider);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
pb_debug_manager_destroy(struct pb_manager *_mgr)
|
||||
{
|
||||
@@ -336,6 +346,7 @@ pb_debug_manager_create(struct pb_manager *provider, size_t band_size)
|
||||
|
||||
mgr->base.destroy = pb_debug_manager_destroy;
|
||||
mgr->base.create_buffer = pb_debug_manager_create_buffer;
|
||||
mgr->base.flush = pb_debug_manager_flush;
|
||||
mgr->provider = provider;
|
||||
mgr->band_size = band_size;
|
||||
|
||||
|
@@ -94,6 +94,19 @@ fenced_bufmgr_create_buffer(struct pb_manager *mgr,
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
fenced_bufmgr_flush(struct pb_manager *mgr)
|
||||
{
|
||||
struct fenced_pb_manager *fenced_mgr = fenced_pb_manager(mgr);
|
||||
|
||||
fenced_buffer_list_check_free(fenced_mgr->fenced_list, TRUE);
|
||||
|
||||
assert(fenced_mgr->provider->flush);
|
||||
if(fenced_mgr->provider->flush)
|
||||
fenced_mgr->provider->flush(fenced_mgr->provider);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
fenced_bufmgr_destroy(struct pb_manager *mgr)
|
||||
{
|
||||
@@ -123,6 +136,7 @@ fenced_bufmgr_create(struct pb_manager *provider,
|
||||
|
||||
fenced_mgr->base.destroy = fenced_bufmgr_destroy;
|
||||
fenced_mgr->base.create_buffer = fenced_bufmgr_create_buffer;
|
||||
fenced_mgr->base.flush = fenced_bufmgr_flush;
|
||||
|
||||
fenced_mgr->provider = provider;
|
||||
fenced_mgr->fenced_list = fenced_buffer_list_create(winsys);
|
||||
|
@@ -199,6 +199,13 @@ mm_bufmgr_create_buffer(struct pb_manager *mgr,
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
mm_bufmgr_flush(struct pb_manager *mgr)
|
||||
{
|
||||
/* No-op */
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
mm_bufmgr_destroy(struct pb_manager *mgr)
|
||||
{
|
||||
@@ -230,8 +237,9 @@ mm_bufmgr_create_from_buffer(struct pb_buffer *buffer,
|
||||
if (!mm)
|
||||
return NULL;
|
||||
|
||||
mm->base.create_buffer = mm_bufmgr_create_buffer;
|
||||
mm->base.destroy = mm_bufmgr_destroy;
|
||||
mm->base.create_buffer = mm_bufmgr_create_buffer;
|
||||
mm->base.flush = mm_bufmgr_flush;
|
||||
|
||||
mm->size = size;
|
||||
mm->align2 = align2; /* 64-byte alignment */
|
||||
|
@@ -202,6 +202,13 @@ pool_bufmgr_create_buffer(struct pb_manager *mgr,
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
pool_bufmgr_flush(struct pb_manager *mgr)
|
||||
{
|
||||
/* No-op */
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
pool_bufmgr_destroy(struct pb_manager *mgr)
|
||||
{
|
||||
@@ -238,6 +245,7 @@ pool_bufmgr_create(struct pb_manager *provider,
|
||||
|
||||
pool->base.destroy = pool_bufmgr_destroy;
|
||||
pool->base.create_buffer = pool_bufmgr_create_buffer;
|
||||
pool->base.flush = pool_bufmgr_flush;
|
||||
|
||||
LIST_INITHEAD(&pool->free);
|
||||
|
||||
|
@@ -406,6 +406,17 @@ pb_slab_manager_create_buffer(struct pb_manager *_mgr,
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
pb_slab_manager_flush(struct pb_manager *_mgr)
|
||||
{
|
||||
struct pb_slab_manager *mgr = pb_slab_manager(_mgr);
|
||||
|
||||
assert(mgr->provider->flush);
|
||||
if(mgr->provider->flush)
|
||||
mgr->provider->flush(mgr->provider);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
pb_slab_manager_destroy(struct pb_manager *_mgr)
|
||||
{
|
||||
@@ -430,6 +441,7 @@ pb_slab_manager_create(struct pb_manager *provider,
|
||||
|
||||
mgr->base.destroy = pb_slab_manager_destroy;
|
||||
mgr->base.create_buffer = pb_slab_manager_create_buffer;
|
||||
mgr->base.flush = pb_slab_manager_flush;
|
||||
|
||||
mgr->provider = provider;
|
||||
mgr->bufSize = bufSize;
|
||||
@@ -465,6 +477,19 @@ pb_slab_range_manager_create_buffer(struct pb_manager *_mgr,
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
pb_slab_range_manager_flush(struct pb_manager *_mgr)
|
||||
{
|
||||
struct pb_slab_range_manager *mgr = pb_slab_range_manager(_mgr);
|
||||
|
||||
/* Individual slabs don't hold any temporary buffers so no need to call them */
|
||||
|
||||
assert(mgr->provider->flush);
|
||||
if(mgr->provider->flush)
|
||||
mgr->provider->flush(mgr->provider);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
pb_slab_range_manager_destroy(struct pb_manager *_mgr)
|
||||
{
|
||||
@@ -499,6 +524,7 @@ pb_slab_range_manager_create(struct pb_manager *provider,
|
||||
|
||||
mgr->base.destroy = pb_slab_range_manager_destroy;
|
||||
mgr->base.create_buffer = pb_slab_range_manager_create_buffer;
|
||||
mgr->base.flush = pb_slab_range_manager_flush;
|
||||
|
||||
mgr->provider = provider;
|
||||
mgr->minBufSize = minBufSize;
|
||||
|
Reference in New Issue
Block a user