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; }