示例#1
0
文件: memory.c 项目: meastp/ocilib
void * OCI_MemAlloc
(
    int     ptr_type,
    size_t  block_size,
    size_t  block_count,
    boolean zero_fill
)
{
    OCI_MemoryBlock * mem_block = NULL;
    size_t size = sizeof(OCI_MemoryBlock) + (block_size * block_count);

    mem_block = (OCI_MemoryBlock *)malloc(size);

    if (mem_block)
    {
        if (zero_fill)
        {
            memset(mem_block, 0, size);
        }

        mem_block->type = ptr_type;
        mem_block->size = (unsigned int) size;

        OCI_MemUpdateBytes(mem_block->type, mem_block->size);
    }
    else
    {
        OCI_ExceptionMemory(ptr_type, size, NULL, NULL);
    }

    return ((unsigned char *) mem_block) + sizeof(*mem_block);
}
示例#2
0
void * OCI_MemRealloc
(
    void * ptr_mem,
    int    ptr_type,
    size_t block_size,
    size_t block_count
)
{
    OCI_MemoryBlock * mem_block = NULL;
	size_t size = 0;

    if (ptr_mem)
    {
        mem_block = (OCI_MemoryBlock *) (((unsigned char*)ptr_mem) - sizeof(*mem_block));
    }

    size = sizeof(OCI_MemoryBlock) + (block_size * block_count);

    if (!mem_block || mem_block->size < size)
    {
        void *ptr_new = realloc(mem_block, size);

        if (ptr_new)
        {
            big_int size_diff = 0;
            mem_block = (OCI_MemoryBlock *) ptr_new;

            size_diff = (big_int) size - mem_block->size;

            mem_block->type = ptr_type;
            mem_block->size = (unsigned int) size;

            OCI_MemUpdateBytes(mem_block->type, size_diff);
        }
        else if (ptr_mem)
        { 
            OCI_MemFree(ptr_mem);

            OCI_ExceptionMemory(ptr_type, size, NULL, NULL);

            mem_block = NULL;
        }
    }

    return mem_block ? ((unsigned char *)mem_block) + sizeof(*mem_block) : NULL;
}