void vma_shmem_stats_close() { if (g_sh_mem_info.p_sh_stats && g_sh_mem_info.p_sh_stats != MAP_FAILED) { __log_dbg("file '%s' fd %d shared memory at %p with %d max blocks\n", g_sh_mem_info.filename_sh_stats, g_sh_mem_info.fd_sh_stats, g_sh_mem_info.p_sh_stats, safe_mce_sys().stats_fd_num_max); BULLSEYE_EXCLUDE_BLOCK_START if (munmap(g_sh_mem_info.p_sh_stats, SHMEM_STATS_SIZE(safe_mce_sys().stats_fd_num_max)) != 0) { vlog_printf(VLOG_ERROR, "%s: file [%s] fd [%d] error while unmap shared memory at [%p]\n", __func__, g_sh_mem_info.filename_sh_stats, g_sh_mem_info.fd_sh_stats, g_sh_mem_info.p_sh_stats); } BULLSEYE_EXCLUDE_BLOCK_END g_sh_mem_info.p_sh_stats = MAP_FAILED; if (g_sh_mem_info.fd_sh_stats) close(g_sh_mem_info.fd_sh_stats); if(!g_is_forked_child) unlink(g_sh_mem_info.filename_sh_stats); } else if (g_sh_mem_info.p_sh_stats != MAP_FAILED) {
void vma_shmem_stats_open(vlog_levels_t** p_p_vma_log_level, uint8_t** p_p_vma_log_details) { void *buf = NULL; void *p_shmem = NULL; int ret; size_t shmem_size = 0; mode_t saved_mode; g_p_stats_data_reader = new stats_data_reader(); BULLSEYE_EXCLUDE_BLOCK_START if (NULL == g_p_stats_data_reader) { vlog_printf(VLOG_ERROR,"%s:%d: Can't allocate g_p_stats_data_reader \n", __func__, __LINE__); goto shmem_error; } BULLSEYE_EXCLUDE_BLOCK_END shmem_size = SHMEM_STATS_SIZE(safe_mce_sys().stats_fd_num_max); buf = malloc(shmem_size); if (buf == NULL) goto shmem_error; memset(buf, 0, shmem_size); p_shmem = buf; if (strlen(safe_mce_sys().stats_shmem_dirname) <= 0) goto no_shmem; g_sh_mem_info.filename_sh_stats[0] = '\0'; g_sh_mem_info.p_sh_stats = MAP_FAILED; ret = snprintf(g_sh_mem_info.filename_sh_stats, sizeof(g_sh_mem_info.filename_sh_stats), "%s/vmastat.%d", safe_mce_sys().stats_shmem_dirname, getpid()); if (!((0 < ret) && (ret < (int)sizeof(g_sh_mem_info.filename_sh_stats)))) { vlog_printf(VLOG_ERROR, "%s: Could not create file under %s %m\n", __func__, safe_mce_sys().stats_shmem_dirname, errno); goto no_shmem; } saved_mode = umask(0); g_sh_mem_info.fd_sh_stats = open(g_sh_mem_info.filename_sh_stats, O_CREAT|O_RDWR, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); umask(saved_mode); BULLSEYE_EXCLUDE_BLOCK_START if (g_sh_mem_info.fd_sh_stats < 0) { vlog_printf(VLOG_ERROR, "%s: Could not open %s %m\n", __func__, g_sh_mem_info.filename_sh_stats, errno); goto no_shmem; } BULLSEYE_EXCLUDE_BLOCK_END ret = write(g_sh_mem_info.fd_sh_stats, buf, shmem_size); BULLSEYE_EXCLUDE_BLOCK_START if (ret < 0) { vlog_printf(VLOG_ERROR, "%s: Could not write to %s - %m\n", __func__, g_sh_mem_info.filename_sh_stats, errno); goto no_shmem; } BULLSEYE_EXCLUDE_BLOCK_END g_sh_mem_info.p_sh_stats = mmap(0, shmem_size, PROT_WRITE|PROT_READ, MAP_SHARED, g_sh_mem_info.fd_sh_stats, 0); BULLSEYE_EXCLUDE_BLOCK_START if (g_sh_mem_info.p_sh_stats == MAP_FAILED) { vlog_printf(VLOG_ERROR, "%s: MAP_FAILED for %s - %m\n", __func__, g_sh_mem_info.filename_sh_stats); goto no_shmem; } BULLSEYE_EXCLUDE_BLOCK_END p_shmem = g_sh_mem_info.p_sh_stats; free(buf); buf = NULL; goto success; no_shmem: if (g_sh_mem_info.p_sh_stats == MAP_FAILED) { if (g_sh_mem_info.fd_sh_stats > 0) { close(g_sh_mem_info.fd_sh_stats); unlink(g_sh_mem_info.filename_sh_stats); } } g_sh_mem_info.p_sh_stats = 0; success: MAP_SH_MEM(g_sh_mem, p_shmem); write_version_details_to_shmem(&g_sh_mem->ver_info); memcpy(g_sh_mem->stats_protocol_ver, STATS_PROTOCOL_VER, min(sizeof(g_sh_mem->stats_protocol_ver), sizeof(STATS_PROTOCOL_VER))); g_sh_mem->max_skt_inst_num = safe_mce_sys().stats_fd_num_max; g_sh_mem->reader_counter = 0; __log_dbg("file '%s' fd %d shared memory at %p with %d max blocks\n", g_sh_mem_info.filename_sh_stats, g_sh_mem_info.fd_sh_stats, g_sh_mem_info.p_sh_stats, safe_mce_sys().stats_fd_num_max); // Update the shmem initial log values g_sh_mem->log_level = **p_p_vma_log_level; g_sh_mem->log_details_level = **p_p_vma_log_details; // Update the shmem with initial fd dump values g_sh_mem->fd_dump = STATS_FD_STATISTICS_DISABLED; g_sh_mem->fd_dump_log_level = STATS_FD_STATISTICS_LOG_LEVEL_DEFAULT; // ReMap internal log level to ShMem area *p_p_vma_log_level = &g_sh_mem->log_level; *p_p_vma_log_details = &g_sh_mem->log_details_level; g_p_stats_data_reader->register_to_timer(); return; shmem_error: BULLSEYE_EXCLUDE_BLOCK_START g_sh_mem_info.fd_sh_stats = -1; g_sh_mem_info.p_sh_stats = MAP_FAILED; g_sh_mem = &g_local_sh_mem; g_sh_mem->reset(); *p_p_vma_log_level = &g_sh_mem->log_level; *p_p_vma_log_details = &g_sh_mem->log_details_level; BULLSEYE_EXCLUDE_BLOCK_END }
void vma_shmem_stats_open(uint8_t** p_p_vma_log_level, uint8_t** p_p_vma_log_details) { void* buf; int ret; size_t shmem_size = 0; mode_t saved_mode; g_p_stats_data_reader = new stats_data_reader(); BULLSEYE_EXCLUDE_BLOCK_START if ( NULL == g_p_stats_data_reader ) { vlog_printf(VLOG_ERROR,"%s:%d: Can't allocate g_p_stats_data_reader \n", __func__, __LINE__); goto shmem_error; } BULLSEYE_EXCLUDE_BLOCK_END g_sh_mem_info.filename_sh_stats[0] = '\0'; g_sh_mem_info.p_sh_stats = MAP_FAILED; sprintf(g_sh_mem_info.filename_sh_stats, "/tmp/vmastat.%d", getpid()); saved_mode = umask(0); g_sh_mem_info.fd_sh_stats = open(g_sh_mem_info.filename_sh_stats, O_CREAT|O_RDWR, S_IRWXU | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); umask(saved_mode); BULLSEYE_EXCLUDE_BLOCK_START if (g_sh_mem_info.fd_sh_stats < 0) { vlog_printf(VLOG_ERROR, "%s: Could not open %s %m\n", __func__, g_sh_mem_info.filename_sh_stats, errno); goto shmem_error; } BULLSEYE_EXCLUDE_BLOCK_END shmem_size = SHMEM_STATS_SIZE(mce_sys.stats_fd_num_max); buf = malloc(shmem_size); memset(buf, 0, shmem_size); ret = write(g_sh_mem_info.fd_sh_stats, buf, shmem_size); free(buf); BULLSEYE_EXCLUDE_BLOCK_START if (ret < 0) { vlog_printf(VLOG_ERROR, "%s: Could not write to %s - %m\n", __func__, g_sh_mem_info.filename_sh_stats, errno); goto shmem_error; } BULLSEYE_EXCLUDE_BLOCK_END g_sh_mem_info.p_sh_stats = mmap(0, shmem_size, PROT_WRITE|PROT_READ, MAP_SHARED, g_sh_mem_info.fd_sh_stats, 0); BULLSEYE_EXCLUDE_BLOCK_START if (g_sh_mem_info.p_sh_stats == MAP_FAILED) { vlog_printf(VLOG_ERROR, "%s: MAP_FAILED for %s - %m\n", __func__, g_sh_mem_info.filename_sh_stats); goto shmem_error; } BULLSEYE_EXCLUDE_BLOCK_END MAP_SH_MEM(g_sh_mem, g_sh_mem_info.p_sh_stats); write_version_details_to_shmem(&g_sh_mem->ver_info); g_sh_mem->max_skt_inst_num = mce_sys.stats_fd_num_max; g_sh_mem->reader_counter = 0; vlog_printf(VLOG_DEBUG, "%s: file '%s' fd %d shared memory at %p with %d max blocks\n", __func__, g_sh_mem_info.filename_sh_stats, g_sh_mem_info.fd_sh_stats, g_sh_mem_info.p_sh_stats, mce_sys.stats_fd_num_max); // Update the shmem initial log values g_sh_mem->log_level = **p_p_vma_log_level; g_sh_mem->log_details_level = **p_p_vma_log_details; // ReMap internal log level to ShMem area *p_p_vma_log_level = &g_sh_mem->log_level; *p_p_vma_log_details = &g_sh_mem->log_details_level; g_p_stats_data_reader->register_to_timer(); return; shmem_error: BULLSEYE_EXCLUDE_BLOCK_START if (g_sh_mem_info.fd_sh_stats > 0) { close(g_sh_mem_info.fd_sh_stats); unlink(g_sh_mem_info.filename_sh_stats); } g_sh_mem_info.fd_sh_stats = -1; g_sh_mem_info.p_sh_stats = MAP_FAILED; g_sh_mem = &g_local_sh_mem; memset((void*)g_sh_mem, 0, sizeof(sh_mem_t)); *p_p_vma_log_level = &g_sh_mem->log_level; *p_p_vma_log_details = &g_sh_mem->log_details_level; BULLSEYE_EXCLUDE_BLOCK_END }