Branch Coverage

hll.h
Criterion Covered Total %
branch 86 258 33.3


line true false branch
139 0 0 if (pid == 0) return 1; /* no owner recorded, assume alive */
140 0 0 return !(kill((pid_t)pid, 0) == -1 && errno == ESRCH);
0 0 return !(kill((pid_t)pid, 0) == -1 && errno == ESRCH);
150 0 0 if (!__atomic_compare_exchange_n(&hdr->rwlock, &observed_rwlock,
156 0 0 if (__atomic_load_n(&hdr->rwlock_waiters, __ATOMIC_RELAXED) > 0)
180 420720 17 if (__builtin_expect(cur_gen == h->cached_fork_gen && h->my_slot_idx != UINT32_MAX, 1))
420720 0 if (__builtin_expect(cur_gen == h->cached_fork_gen && h->my_slot_idx != UINT32_MAX, 1))
191 19 0 for (uint32_t i = 0; i < HLL_READER_SLOTS; i++) {
194 17 2 if (__atomic_compare_exchange_n(&h->reader_slots[s].pid,
214 0 0 if (!sub) return;
217 0 0 uint32_t want = (cur > sub) ? cur - sub : 0;
218 0 0 if (__atomic_compare_exchange_n(p, &cur, want,
241 0 0 if (!__atomic_compare_exchange_n(&h->reader_slots[i].pid, &expected, 0,
246 0 0 if (wp) hll_atomic_sub_cap(&hdr->rwlock_waiters, wp);
247 0 0 if (writp) hll_atomic_sub_cap(&hdr->rwlock_writers_waiting, writp);
261 0 0 if (!h->reader_slots) return;
274 0 0 for (uint32_t i = 0; i < HLL_READER_SLOTS; i++) {
276 0 0 if (pid == 0) continue;
278 0 0 if (hll_pid_alive(pid)) {
279 0 0 if (sc > 0) any_live_reader = 1;
282 0 0 if (sc > 0) { found_dead_reader = 1; continue; }
299 0 0 if (found_dead_reader && !any_live_reader) {
0 0 if (found_dead_reader && !any_live_reader) {
301 0 0 if (cur > 0 && cur < HLL_RWLOCK_WRITER_BIT) {
0 0 if (cur > 0 && cur < HLL_RWLOCK_WRITER_BIT) {
302 0 0 if (__atomic_compare_exchange_n(&hdr->rwlock, &cur, 0,
304 0 0 if (__atomic_load_n(&hdr->rwlock_waiters, __ATOMIC_RELAXED) > 0)
308 0 0 for (uint32_t i = 0; i < HLL_READER_SLOTS; i++) {
310 0 0 if (pid == 0 || hll_pid_alive(pid)) continue;
0 0 if (pid == 0 || hll_pid_alive(pid)) continue;
323 0 0 if (val >= HLL_RWLOCK_WRITER_BIT) {
325 0 0 if (!hll_pid_alive(pid))
337 0 0 if (h->my_slot_idx != UINT32_MAX)
343 0 0 if (h->my_slot_idx != UINT32_MAX)
347 0 0 if (h->my_slot_idx != UINT32_MAX) {
357 0 0 if (h->my_slot_idx != UINT32_MAX) {
375 23 0 if (h->my_slot_idx != UINT32_MAX)
382 0 23 if (cur > 0 && cur < HLL_RWLOCK_WRITER_BIT) {
0 0 if (cur > 0 && cur < HLL_RWLOCK_WRITER_BIT) {
383 0 0 if (__atomic_compare_exchange_n(lock, &cur, cur + 1,
386 23 0 } else if (cur == 0 && !__atomic_load_n(writers_waiting, __ATOMIC_RELAXED)) {
23 0 } else if (cur == 0 && !__atomic_load_n(writers_waiting, __ATOMIC_RELAXED)) {
387 23 0 if (__atomic_compare_exchange_n(lock, &cur, 1,
391 0 0 if (__builtin_expect(spin < HLL_RWLOCK_SPIN_LIMIT, 1)) {
398 0 0 if (cur >= HLL_RWLOCK_WRITER_BIT || cur == 0) {
0 0 if (cur >= HLL_RWLOCK_WRITER_BIT || cur == 0) {
401 0 0 if (rc == -1 && errno == ETIMEDOUT) {
0 0 if (rc == -1 && errno == ETIMEDOUT) {
421 23 0 if (h->my_slot_idx != UINT32_MAX)
423 23 0 if (after == 0 && __atomic_load_n(&hdr->rwlock_waiters, __ATOMIC_RELAXED) > 0)
0 23 if (after == 0 && __atomic_load_n(&hdr->rwlock_waiters, __ATOMIC_RELAXED) > 0)
436 420714 0 if (__atomic_compare_exchange_n(lock, &expected, mypid,
439 0 0 if (__builtin_expect(spin < HLL_RWLOCK_SPIN_LIMIT, 1)) {
445 0 0 if (cur != 0) {
448 0 0 if (rc == -1 && errno == ETIMEDOUT) {
0 0 if (rc == -1 && errno == ETIMEDOUT) {
463 0 420714 if (__atomic_load_n(&hdr->rwlock_waiters, __ATOMIC_RELAXED) > 0)
513 0 23 if (!h) {
515 0 0 if (backing_fd >= 0) close(backing_fd);
522 4 19 h->path = path ? strdup(path) : NULL;
530 0 2 if (hdr->magic != HLL_MAGIC) return 0;
531 0 2 if (hdr->version != HLL_VERSION) return 0;
532 2 0 if (hdr->precision < HLL_MIN_PRECISION || hdr->precision > HLL_MAX_PRECISION) return 0;
0 2 if (hdr->precision < HLL_MIN_PRECISION || hdr->precision > HLL_MAX_PRECISION) return 0;
533 0 2 if (hdr->m != (1u << hdr->precision)) return 0;
534 0 2 if (hdr->total_size != file_size) return 0;
535 0 2 if (hdr->total_size != hll_total_size(hdr->m)) return 0;
537 0 2 if (hdr->reader_slots_off != L.reader_slots) return 0;
538 0 2 if (hdr->regs_off != L.regs) return 0;
544 23 0 if (errbuf) errbuf[0] = '\0';
545 23 0 if (precision < HLL_MIN_PRECISION || precision > HLL_MAX_PRECISION) {
0 23 if (precision < HLL_MIN_PRECISION || precision > HLL_MAX_PRECISION) {
546 0 0 HLL_ERR("precision must be between %d and %d", HLL_MIN_PRECISION, HLL_MAX_PRECISION);
555 0 21 if (!hll_validate_create_args(precision, &m, errbuf)) return NULL;
563 16 5 if (anonymous) {
566 0 16 if (base == MAP_FAILED) { HLL_ERR("mmap: %s", strerror(errno)); return NULL; }
0 0 if (base == MAP_FAILED) { HLL_ERR("mmap: %s", strerror(errno)); return NULL; }
569 0 5 if (fd < 0) { HLL_ERR("open: %s", strerror(errno)); return NULL; }
0 0 if (fd < 0) { HLL_ERR("open: %s", strerror(errno)); return NULL; }
570 0 5 if (flock(fd, LOCK_EX) < 0) { HLL_ERR("flock: %s", strerror(errno)); close(fd); return NULL; }
0 0 if (flock(fd, LOCK_EX) < 0) { HLL_ERR("flock: %s", strerror(errno)); close(fd); return NULL; }
572 0 5 if (fstat(fd, &st) < 0) { HLL_ERR("fstat: %s", strerror(errno)); flock(fd, LOCK_UN); close(fd); return NULL; }
0 0 if (fstat(fd, &st) < 0) { HLL_ERR("fstat: %s", strerror(errno)); flock(fd, LOCK_UN); close(fd); return NULL; }
574 2 3 if (!is_new && (uint64_t)st.st_size < sizeof(HllHeader)) {
1 1 if (!is_new && (uint64_t)st.st_size < sizeof(HllHeader)) {
575 1 0 HLL_ERR("%s: file too small (%lld)", path, (long long)st.st_size);
578 3 1 if (is_new && ftruncate(fd, (off_t)total) < 0) {
0 3 if (is_new && ftruncate(fd, (off_t)total) < 0) {
579 0 0 HLL_ERR("ftruncate: %s", strerror(errno)); flock(fd, LOCK_UN); close(fd); return NULL;
581 1 3 map_size = is_new ? (size_t)total : (size_t)st.st_size;
583 0 4 if (base == MAP_FAILED) { HLL_ERR("mmap: %s", strerror(errno)); flock(fd, LOCK_UN); close(fd); return NULL; }
0 0 if (base == MAP_FAILED) { HLL_ERR("mmap: %s", strerror(errno)); flock(fd, LOCK_UN); close(fd); return NULL; }
584 1 3 if (!is_new) {
585 0 1 if (!hll_validate_header((HllHeader *)base, (uint64_t)st.st_size)) {
586 0 0 HLL_ERR("invalid HyperLogLog file"); munmap(base, map_size); flock(fd, LOCK_UN); close(fd); return NULL;
593 3 16 if (fd >= 0) { flock(fd, LOCK_UN); close(fd); }
599 0 2 if (!hll_validate_create_args(precision, &m, errbuf)) return NULL;
602 1 1 int fd = memfd_create(name ? name : "hll", MFD_CLOEXEC | MFD_ALLOW_SEALING);
603 0 2 if (fd < 0) { HLL_ERR("memfd_create: %s", strerror(errno)); return NULL; }
0 0 if (fd < 0) { HLL_ERR("memfd_create: %s", strerror(errno)); return NULL; }
604 0 2 if (ftruncate(fd, (off_t)total) < 0) {
605 0 0 HLL_ERR("ftruncate: %s", strerror(errno)); close(fd); return NULL;
609 0 2 if (base == MAP_FAILED) { HLL_ERR("mmap: %s", strerror(errno)); close(fd); return NULL; }
0 0 if (base == MAP_FAILED) { HLL_ERR("mmap: %s", strerror(errno)); close(fd); return NULL; }
615 1 0 if (errbuf) errbuf[0] = '\0';
617 0 1 if (fstat(fd, &st) < 0) { HLL_ERR("fstat: %s", strerror(errno)); return NULL; }
0 0 if (fstat(fd, &st) < 0) { HLL_ERR("fstat: %s", strerror(errno)); return NULL; }
618 0 1 if ((uint64_t)st.st_size < sizeof(HllHeader)) { HLL_ERR("too small"); return NULL; }
0 0 if ((uint64_t)st.st_size < sizeof(HllHeader)) { HLL_ERR("too small"); return NULL; }
621 0 1 if (base == MAP_FAILED) { HLL_ERR("mmap: %s", strerror(errno)); return NULL; }
0 0 if (base == MAP_FAILED) { HLL_ERR("mmap: %s", strerror(errno)); return NULL; }
622 0 1 if (!hll_validate_header((HllHeader *)base, (uint64_t)st.st_size)) {
623 0 0 HLL_ERR("invalid HyperLogLog table"); munmap(base, ms); return NULL;
626 0 1 if (myfd < 0) { HLL_ERR("fcntl: %s", strerror(errno)); munmap(base, ms); return NULL; }
0 0 if (myfd < 0) { HLL_ERR("fcntl: %s", strerror(errno)); munmap(base, ms); return NULL; }
631 0 23 if (!h) return;
632 3 20 if (h->backing_fd >= 0) close(h->backing_fd);
633 23 0 if (h->base) munmap(h->base, h->mmap_size);
639 2 0 if (!h || !h->base) return 0;
0 2 if (!h || !h->base) return 0;
655 136041 292665 if (regs[idx] < rho) { regs[idx] = rho; return 1; }
665 368640 21 for (uint32_t j = 0; j < m; j++) {
670 0 21 if (m == 16) alpha = 0.673;
671 0 21 else if (m == 32) alpha = 0.697;
672 0 21 else if (m == 64) alpha = 0.709;
675 17 4 if (E <= 2.5 * (double)m && V > 0)
17 0 if (E <= 2.5 * (double)m && V > 0)
684 32768 2 for (uint32_t j = 0; j < m; j++)
685 7657 25111 if (src_regs[j] > regs[j]) regs[j] = src_regs[j];