Exemplo n.º 1
0
uint32_t msg_buffer_t::append(const void* data_, uint32_t size_)
{
    uint32_t ret = 0;

    if (!is_init_i())  //! yunjie: 第一次分配
    {
        if (-1 == init_buffer_i(size_))
        {
            //! yunjie: mem error
            return 0;
        }
    }
    else if (size_ > remain_free_tail_space_i())      //! yunjie: 尾部剩余的堆空间不足
    {
        //! yunjie: 判断头尾空闲内存的总和是否足够
        if (remain_free_head_space_i() +  remain_free_tail_space_i() >= size_)
        {
            //! yunjie: 将数据内存块对齐到头
            marshal_i();
        }
        else
        {
            if (-1 == expand_i(size_ + m_heap_size))
            {
                //! yunjie: mem error or param error
                return 0;
            }
        }
    }

    ret = append_i((char*)data_, size_);

    return ret;
}
Exemplo n.º 2
0
int msg_buffer_t::reserve(uint32_t size_)
{
    int ret = 0;
    if (!is_init_i())  //! yunjie: 第一次分配
    {
        ret = init_buffer_i(size_);
    }
    else
    {
        ret = expand_i(size_);
    }

    return ret;
}
Exemplo n.º 3
0
void emit_icode( instruction t )
{
	if(currInstruction == total_i)
		expand_i();
	
	instruction *p = instructions+currInstruction++;

	p->opcode = t.opcode;
	p->result = t.result;
	p->arg1 = t.arg1;
	p->arg2 = t.arg2;
	p->srcLine = t.srcLine;

}
Exemplo n.º 4
0
int msg_buffer_t::recv_to_buffer(fd_t fd_, int& recv_ret_)
{
    if (!is_init_i())  //! yunjie: 第一次分配
    {
        if (-1 == init_buffer_i(MIN_MSG_BUFFER_SIZE))
        {
            //! yunjie: mem error
            return -1;
        }
    }

    //! yunjie: 被读取了一部分, 如果尾部没有空间就进行marshal
    uint32_t remain_free_tail_space = remain_free_tail_space_i();
    if (0 == remain_free_tail_space)
    {
        marshal_i();

        if (0 == (remain_free_tail_space = remain_free_tail_space_i()))
        {
            return -1;
        }
    }

    recv_ret_ = ::recv(fd_, write_ptr_i(), remain_free_tail_space, 0);

    if (recv_ret_ < 0)
    {
        return 0;
    }

    m_data_size += recv_ret_;

    if ((uint32_t)recv_ret_ == remain_free_tail_space)
    {
        //! yunjie: marshal and expand
        marshal_i();
        if (-1 == expand_i(m_heap_size << 1))
        {
            //! yunjie: mem error or param error
        }
    }

    return 0;
}