diff --git a/include/freerdp/codec/rfx.h b/include/freerdp/codec/rfx.h index 97f5763d9..7e47616d0 100644 --- a/include/freerdp/codec/rfx.h +++ b/include/freerdp/codec/rfx.h @@ -22,6 +22,7 @@ #include #include +#include #include #include diff --git a/libfreerdp/codec/rfx.c b/libfreerdp/codec/rfx.c index a2cb064ae..9ed0d8dbe 100644 --- a/libfreerdp/codec/rfx.c +++ b/libfreerdp/codec/rfx.c @@ -138,6 +138,39 @@ static void rfx_profiler_print(RFX_CONTEXT* context) PROFILER_PRINT_FOOTER; } +void rfx_tile_init(RFX_TILE* tile) +{ + if (tile) + { + tile->x = 0; + tile->y = 0; + } +} + +RFX_TILE* rfx_tile_new() +{ + RFX_TILE* tile = NULL; + + tile = (RFX_TILE*) malloc(sizeof(RFX_TILE)); + + if (tile) + { + ZeroMemory(tile, sizeof(RFX_TILE)); + + tile->data = (BYTE*) malloc(4096 * 4); /* 64x64 * 4 */ + } + + return tile; +} + +void rfx_tile_free(RFX_TILE* tile) +{ + if (tile) + { + free(tile->data); + free(tile); + } +} RFX_CONTEXT* rfx_context_new(void) { @@ -155,7 +188,10 @@ RFX_CONTEXT* rfx_context_new(void) context->priv = (RFX_CONTEXT_PRIV*) malloc(sizeof(RFX_CONTEXT_PRIV)); ZeroMemory(context->priv, sizeof(RFX_CONTEXT_PRIV)); - context->priv->TilePool = Queue_New(TRUE, -1, -1); + context->priv->TilePool = ObjectPool_New(TRUE); + ObjectPool_Object(context->priv->TilePool)->fnObjectNew = (OBJECT_NEW_FN) rfx_tile_new; + ObjectPool_Object(context->priv->TilePool)->fnObjectInit = (OBJECT_INIT_FN) rfx_tile_init; + ObjectPool_Object(context->priv->TilePool)->fnObjectFree = (OBJECT_FREE_FN) rfx_tile_free; /* * align buffers to 16 byte boundary (needed for SSE/NEON instructions) @@ -254,7 +290,7 @@ void rfx_context_free(RFX_CONTEXT* context) { free(context->quants); - Queue_Free(context->priv->TilePool); + ObjectPool_Free(context->priv->TilePool); rfx_profiler_print(context); rfx_profiler_free(context); @@ -311,29 +347,6 @@ void rfx_context_reset(RFX_CONTEXT* context) context->frame_idx = 0; } -RFX_TILE* rfx_tile_pool_take(RFX_CONTEXT* context) -{ - RFX_TILE* tile = NULL; - - tile = Queue_Dequeue(context->priv->TilePool); - - if (!tile) - { - tile = (RFX_TILE*) malloc(sizeof(RFX_TILE)); - - tile->x = tile->y = 0; - tile->data = (BYTE*) malloc(4096 * 4); /* 64x64 * 4 */ - } - - return tile; -} - -int rfx_tile_pool_return(RFX_CONTEXT* context, RFX_TILE* tile) -{ - Queue_Enqueue(context->priv->TilePool, tile); - return 0; -} - static BOOL rfx_process_message_sync(RFX_CONTEXT* context, wStream* s) { UINT32 magic; @@ -724,7 +737,7 @@ static BOOL rfx_process_message_tileset(RFX_CONTEXT* context, RFX_MESSAGE* messa break; } - message->tiles[i] = rfx_tile_pool_take(context); + message->tiles[i] = (RFX_TILE*) ObjectPool_Take(context->priv->TilePool); if (context->priv->UseThreads) { @@ -885,7 +898,9 @@ void rfx_message_free(RFX_CONTEXT* context, RFX_MESSAGE* message) if (message->tiles) { for (i = 0; i < message->num_tiles; i++) - rfx_tile_pool_return(context, message->tiles[i]); + { + ObjectPool_Return(context->priv->TilePool, (void*) message->tiles[i]); + } free(message->tiles); } diff --git a/libfreerdp/codec/rfx_types.h b/libfreerdp/codec/rfx_types.h index 5b875bdba..2675d35ad 100644 --- a/libfreerdp/codec/rfx_types.h +++ b/libfreerdp/codec/rfx_types.h @@ -39,7 +39,7 @@ struct _RFX_CONTEXT_PRIV { - wQueue* TilePool; + wObjectPool* TilePool; BOOL UseThreads; DWORD MinThreadCount; diff --git a/winpr/include/winpr/collections.h b/winpr/include/winpr/collections.h index d493a59b2..8901fe7b6 100644 --- a/winpr/include/winpr/collections.h +++ b/winpr/include/winpr/collections.h @@ -35,12 +35,16 @@ extern "C" { #endif typedef void* (*OBJECT_NEW_FN)(void); +typedef void (*OBJECT_INIT_FN)(void* obj); +typedef void (*OBJECT_UNINIT_FN)(void* obj); typedef void (*OBJECT_FREE_FN)(void* obj); typedef void (*OBJECT_EQUALS_FN)(void* objA, void* objB); struct _wObject { OBJECT_NEW_FN fnObjectNew; + OBJECT_INIT_FN fnObjectInit; + OBJECT_UNINIT_FN fnObjectUninit; OBJECT_FREE_FN fnObjectFree; OBJECT_EQUALS_FN fnObjectEquals; }; diff --git a/winpr/libwinpr/utils/collections/ObjectPool.c b/winpr/libwinpr/utils/collections/ObjectPool.c index c0e36266f..bca31edfd 100644 --- a/winpr/libwinpr/utils/collections/ObjectPool.c +++ b/winpr/libwinpr/utils/collections/ObjectPool.c @@ -54,6 +54,9 @@ void* ObjectPool_Take(wObjectPool* pool) obj = pool->object.fnObjectNew(); } + if (pool->object.fnObjectInit) + pool->object.fnObjectInit(obj); + if (pool->synchronized) LeaveCriticalSection(&pool->lock); @@ -77,6 +80,9 @@ void ObjectPool_Return(wObjectPool* pool, void* obj) pool->array[(pool->size)++] = obj; + if (pool->object.fnObjectUninit) + pool->object.fnObjectUninit(obj); + if (pool->synchronized) LeaveCriticalSection(&pool->lock); }