Alien-libhisto
view release on metacpan or search on metacpan
bundled/tools/src/tui_engine.c view on Meta::CPAN
shm->ring->dropped = 0;
shm->ring->flags = flags;
return true;
}
bool histo_shm_open(histo_shm_t *shm, const char *path) {
if (!shm || !path) return false;
memset(shm, 0, sizeof(*shm));
shm->fd = -1;
strncpy(shm->path, path, sizeof(shm->path) - 1);
shm->is_creator = false;
#if defined(_WIN32) || defined(_WIN64)
const char *win_name = path;
while (*win_name == '/' || *win_name == '\\') win_name++;
char clean_name[256];
size_t ki = 0;
for (size_t i = 0; win_name[i] && ki < sizeof(clean_name) - 1; i++) {
clean_name[ki++] = (win_name[i] == '/' || win_name[i] == '\\') ? '_' : win_name[i];
}
clean_name[ki] = '\0';
const char *target_name = clean_name[0] ? clean_name : "histo_shm_default";
HANDLE hMap = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, target_name);
if (!hMap) return false;
shm->os_handle = (void *)hMap;
histo_shm_ring_t *hdr = (histo_shm_ring_t *)MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, sizeof(histo_shm_ring_t));
if (!hdr) {
CloseHandle(hMap);
shm->os_handle = NULL;
return false;
}
if (hdr->magic != HISTO_SHM_MAGIC) {
UnmapViewOfFile(hdr);
CloseHandle(hMap);
shm->os_handle = NULL;
return false;
}
size_t total_size = sizeof(histo_shm_ring_t) + ((hdr->mask + 1) * hdr->entry_size);
UnmapViewOfFile(hdr);
shm->size = total_size;
shm->ring = (histo_shm_ring_t *)MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, total_size);
if (!shm->ring) {
CloseHandle(hMap);
shm->os_handle = NULL;
return false;
}
#else
int fd = -1;
if (path[0] == '/') {
fd = shm_open(path, O_RDWR, 0666);
}
if (fd < 0) {
fd = open(path, O_RDWR, 0666);
}
if (fd < 0) return false;
struct stat st;
if (fstat(fd, &st) != 0 || st.st_size < (off_t)sizeof(histo_shm_ring_t)) {
close(fd);
return false;
}
size_t total_size = (size_t)st.st_size;
void *ptr = mmap(NULL, total_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED) {
close(fd);
return false;
}
histo_shm_ring_t *ring = (histo_shm_ring_t *)ptr;
if (ring->magic != HISTO_SHM_MAGIC) {
munmap(ptr, total_size);
close(fd);
return false;
}
shm->fd = fd;
shm->size = total_size;
shm->ring = ring;
#endif
return true;
}
void histo_shm_close(histo_shm_t *shm) {
if (!shm || !shm->ring) return;
#if defined(_WIN32) || defined(_WIN64)
if (shm->ring) UnmapViewOfFile(shm->ring);
if (shm->os_handle) CloseHandle((HANDLE)shm->os_handle);
#else
if (shm->ring && shm->size > 0) {
munmap(shm->ring, shm->size);
}
if (shm->fd >= 0) {
close(shm->fd);
}
if (shm->is_creator && shm->path[0] != '\0') {
if (shm->path[0] == '/') shm_unlink(shm->path);
else unlink(shm->path);
}
#endif
shm->ring = NULL;
shm->fd = -1;
shm->os_handle = NULL;
shm->size = 0;
}
bool histo_shm_push(histo_shm_ring_t *ring, const void *entry) {
if (!ring || !entry) return false;
uint64_t head = ring->head;
uint64_t tail = ring->tail;
uint64_t cap = ring->mask + 1;
if (head - tail >= cap) {
ring->dropped++;
ring->tail = head - cap + 1;
}
( run in 1.020 second using v1.01-cache-2.11-cpan-cb04b646d8c )