sys_mempool implementation fixes

This commit is contained in:
KaOs1 2015-08-14 09:48:26 +02:00 committed by Nekotekina
parent bc13128afe
commit f3d7c5da9d
1 changed files with 13 additions and 12 deletions

View File

@ -30,7 +30,7 @@ s32 sys_mempool_create(vm::ptr<sys_mempool_t> mempool, vm::ptr<void> chunk, cons
if (block_size > chunk_size) if (block_size > chunk_size)
{ {
return EINVAL; return CELL_EINVAL;
} }
u64 alignment = ralignment; u64 alignment = ralignment;
@ -42,17 +42,18 @@ s32 sys_mempool_create(vm::ptr<sys_mempool_t> mempool, vm::ptr<void> chunk, cons
// Check if alignment is power of two // Check if alignment is power of two
if ((alignment & (alignment - 1)) != 0) if ((alignment & (alignment - 1)) != 0)
{ {
return EINVAL; return CELL_EINVAL;
} }
// Test chunk address aligment // Test chunk address aligment
vm::ptr<u8> test_align = vm::ptr<u8>::make(chunk.addr()); if (chunk % 8)
if (!test_align.aligned())
{ {
return EINVAL; return CELL_EINVAL;
} }
auto id = Emu.GetIdManager().make<memory_pool_t>(); auto id = Emu.GetIdManager().make<memory_pool_t>();
*mempool = id;
auto memory_pool = Emu.GetIdManager().get<memory_pool_t>(id); auto memory_pool = Emu.GetIdManager().get<memory_pool_t>(id);
memory_pool->chunk = chunk; memory_pool->chunk = chunk;
@ -62,12 +63,12 @@ s32 sys_mempool_create(vm::ptr<sys_mempool_t> mempool, vm::ptr<void> chunk, cons
// TODO: check blocks alignment wrt ralignment // TODO: check blocks alignment wrt ralignment
u64 num_blocks = chunk_size / block_size; u64 num_blocks = chunk_size / block_size;
memory_pool->free_blocks.resize(num_blocks);
for (int i = 0; i < num_blocks; ++i) for (int i = 0; i < num_blocks; ++i)
{ {
memory_pool->free_blocks.push_back(vm::ptr<void>::make(chunk.addr() + i * block_size)); memory_pool->free_blocks[i] = vm::ptr<void>::make(chunk.addr() + i * block_size);
} }
*mempool = id;
return CELL_OK; return CELL_OK;
} }
@ -85,26 +86,26 @@ s32 sys_mempool_free_block(sys_mempool_t mempool, vm::ptr<void> block)
auto memory_pool = Emu.GetIdManager().get<memory_pool_t>(mempool); auto memory_pool = Emu.GetIdManager().get<memory_pool_t>(mempool);
if (!memory_pool) if (!memory_pool)
{ {
return EINVAL; return CELL_EINVAL;
} }
// Cannot free a block not belonging to this memory pool // Cannot free a block not belonging to this memory pool
if (block.addr() > memory_pool->chunk.addr() + memory_pool->chunk_size) if (block.addr() > memory_pool->chunk.addr() + memory_pool->chunk_size)
{ {
return EINVAL; return CELL_EINVAL;
} }
memory_pool->free_blocks.push_back(block); memory_pool->free_blocks.push_back(block);
return CELL_OK; return CELL_OK;
} }
s32 sys_mempool_get_count(sys_mempool_t mempool) u64 sys_mempool_get_count(sys_mempool_t mempool)
{ {
sysPrxForUser.Warning("sys_mempool_get_count(mempool=%d)", mempool); sysPrxForUser.Warning("sys_mempool_get_count(mempool=%d)", mempool);
auto memory_pool = Emu.GetIdManager().get<memory_pool_t>(mempool); auto memory_pool = Emu.GetIdManager().get<memory_pool_t>(mempool);
if (!memory_pool) if (!memory_pool)
{ {
return EINVAL; return CELL_EINVAL;
} }
return memory_pool->free_blocks.size(); return memory_pool->free_blocks.size();