int read_shm_queue(void*handle, char *to_read_buf, int buf_len)
{
	int ret;
	shm_queue_handle_t *shmq_handle = (shm_queue_handle_t*)handle;

	if(NULL == shmq_handle)
	{
		return SHM_HANDLE_NULL;
	}
	
	if(shmq_handle->op_mode != OP_MODE_READ)
	{
		return SHM_OP_WRONG;
	}

	ret = is_empty(shmq_handle->que);
	if(ret > 0)
	{
		return SHM_NO_DATA;
	}

	block_info_t *to_read_block;
	int off_set = sizeof(shm_queue_info_t) + sizeof(circular_array_t) + sizeof(block_info_t) * shmq_handle->op_pos;
	to_read_block = (block_info_t*)((char*)(shmq_handle->shm_que_info) + off_set);

	if(shmq_handle->op_pos == shmq_handle->que->tail)
	{
		return SHM_NO_DATA;
	}

	ret = get_read_num(shmq_handle->self_id);
	
	if(to_read_block->flags[ret] == FLAG_TRUE)
	{
		return SHM_DATA_READED_YET;
	}
	
	if(to_read_block->block_size <= 0)
	{
		return SHM_NO_DATA;
	}
	
	if(to_read_block->block_size > buf_len)
	{
		return SHM_BUF_SHORT;
	}
	
	int read_len = read_block(to_read_block,shmq_handle,to_read_buf, buf_len);

	to_read_block->flags[ret] = FLAG_TRUE;
	
	shmq_handle->op_total += (to_read_block->block_size);
	
	shmq_handle->op_pos = (shmq_handle->op_pos + 1) % shmq_handle->para_queue_size;
	
	return read_len;
}
int  get_miss_stat(void*handle, int id, unsigned long long *miss_block, unsigned long long *miss_betys)
{
	shm_queue_handle_t *shmq_handle = (shm_queue_handle_t*)handle;
	
	if(NULL == shmq_handle)
	{
		return SHM_FAIL;
	}
	int i = get_read_num(id);

	*miss_block = shmq_handle->readers_miss[i].miss_block_num;
	*miss_betys = shmq_handle->readers_miss [i].miss_bytes;
	return SHM_OK;
}
int destroy_shm_queue_handle(void*handle)
{

	shm_queue_handle_t *shmq_handle = (shm_queue_handle_t*)handle;
	int ret = -1;
	if(shmq_handle->op_mode == OP_MODE_READ)
	{
		shmq_handle->shm_que_info->read_flags[get_read_num(shmq_handle->self_id)] = '0';
		
		pthread_mutex_lock(&shmq_handle->shm_que_info->mutex);
		shmq_handle->shm_que_info->op_num--;
		pthread_mutex_unlock(&shmq_handle->shm_que_info->mutex);
		
		shmdt((char*)shmq_handle->shm_que_info);
		ret = SHM_OK;
	}	
	else if(shmq_handle->op_mode == OP_MODE_WRITE)
	{	
		ret = close_shm_queue(handle);
	}      
	free(handle);
	return ret;
}