Branch Coverage

bloom.h
Criterion Covered Total %
branch 103 282 36.5


line true false branch
143 0 0 if (pid == 0) return 1; /* no owner recorded, assume alive */
144 0 0 return !(kill((pid_t)pid, 0) == -1 && errno == ESRCH);
0 0 return !(kill((pid_t)pid, 0) == -1 && errno == ESRCH);
154 0 0 if (!__atomic_compare_exchange_n(&hdr->rwlock, &observed_rwlock,
160 0 0 if (__atomic_load_n(&hdr->rwlock_waiters, __ATOMIC_RELAXED) > 0)
184 50819 20 if (__builtin_expect(cur_gen == h->cached_fork_gen && h->my_slot_idx != UINT32_MAX, 1))
50819 0 if (__builtin_expect(cur_gen == h->cached_fork_gen && h->my_slot_idx != UINT32_MAX, 1))
195 22 0 for (uint32_t i = 0; i < BF_READER_SLOTS; i++) {
198 20 2 if (__atomic_compare_exchange_n(&h->reader_slots[s].pid,
218 0 0 if (!sub) return;
221 0 0 uint32_t want = (cur > sub) ? cur - sub : 0;
222 0 0 if (__atomic_compare_exchange_n(p, &cur, want,
245 0 0 if (!__atomic_compare_exchange_n(&h->reader_slots[i].pid, &expected, 0,
250 0 0 if (wp) bf_atomic_sub_cap(&hdr->rwlock_waiters, wp);
251 0 0 if (writp) bf_atomic_sub_cap(&hdr->rwlock_writers_waiting, writp);
265 0 0 if (!h->reader_slots) return;
278 0 0 for (uint32_t i = 0; i < BF_READER_SLOTS; i++) {
280 0 0 if (pid == 0) continue;
282 0 0 if (bf_pid_alive(pid)) {
283 0 0 if (sc > 0) any_live_reader = 1;
286 0 0 if (sc > 0) { found_dead_reader = 1; continue; }
303 0 0 if (found_dead_reader && !any_live_reader) {
0 0 if (found_dead_reader && !any_live_reader) {
305 0 0 if (cur > 0 && cur < BF_RWLOCK_WRITER_BIT) {
0 0 if (cur > 0 && cur < BF_RWLOCK_WRITER_BIT) {
306 0 0 if (__atomic_compare_exchange_n(&hdr->rwlock, &cur, 0,
308 0 0 if (__atomic_load_n(&hdr->rwlock_waiters, __ATOMIC_RELAXED) > 0)
312 0 0 for (uint32_t i = 0; i < BF_READER_SLOTS; i++) {
314 0 0 if (pid == 0 || bf_pid_alive(pid)) continue;
0 0 if (pid == 0 || bf_pid_alive(pid)) continue;
327 0 0 if (val >= BF_RWLOCK_WRITER_BIT) {
329 0 0 if (!bf_pid_alive(pid))
341 0 0 if (h->my_slot_idx != UINT32_MAX)
347 0 0 if (h->my_slot_idx != UINT32_MAX)
351 0 0 if (h->my_slot_idx != UINT32_MAX) {
361 0 0 if (h->my_slot_idx != UINT32_MAX) {
379 24821 0 if (h->my_slot_idx != UINT32_MAX)
386 0 24821 if (cur > 0 && cur < BF_RWLOCK_WRITER_BIT) {
0 0 if (cur > 0 && cur < BF_RWLOCK_WRITER_BIT) {
387 0 0 if (__atomic_compare_exchange_n(lock, &cur, cur + 1,
390 24821 0 } else if (cur == 0 && !__atomic_load_n(writers_waiting, __ATOMIC_RELAXED)) {
24821 0 } else if (cur == 0 && !__atomic_load_n(writers_waiting, __ATOMIC_RELAXED)) {
391 24821 0 if (__atomic_compare_exchange_n(lock, &cur, 1,
395 0 0 if (__builtin_expect(spin < BF_RWLOCK_SPIN_LIMIT, 1)) {
402 0 0 if (cur >= BF_RWLOCK_WRITER_BIT || cur == 0) {
0 0 if (cur >= BF_RWLOCK_WRITER_BIT || cur == 0) {
405 0 0 if (rc == -1 && errno == ETIMEDOUT) {
0 0 if (rc == -1 && errno == ETIMEDOUT) {
425 24821 0 if (h->my_slot_idx != UINT32_MAX)
427 24821 0 if (after == 0 && __atomic_load_n(&hdr->rwlock_waiters, __ATOMIC_RELAXED) > 0)
0 24821 if (after == 0 && __atomic_load_n(&hdr->rwlock_waiters, __ATOMIC_RELAXED) > 0)
440 26018 0 if (__atomic_compare_exchange_n(lock, &expected, mypid,
443 0 0 if (__builtin_expect(spin < BF_RWLOCK_SPIN_LIMIT, 1)) {
449 0 0 if (cur != 0) {
452 0 0 if (rc == -1 && errno == ETIMEDOUT) {
0 0 if (rc == -1 && errno == ETIMEDOUT) {
467 0 26018 if (__atomic_load_n(&hdr->rwlock_waiters, __ATOMIC_RELAXED) > 0)
495 1 26 if (v <= BF_MIN_BITS) return BF_MIN_BITS;
527 0 27 if (!h) {
529 0 0 if (backing_fd >= 0) close(backing_fd);
536 4 23 h->path = path ? strdup(path) : NULL;
544 0 2 if (hdr->magic != BF_MAGIC) return 0;
545 0 2 if (hdr->version != BF_VERSION) return 0;
546 2 0 if (hdr->k < BF_MIN_K || hdr->k > BF_MAX_K) return 0;
0 2 if (hdr->k < BF_MIN_K || hdr->k > BF_MAX_K) return 0;
547 2 0 if (hdr->m_bits < BF_MIN_BITS || hdr->m_bits > BF_MAX_BITS) return 0;
0 2 if (hdr->m_bits < BF_MIN_BITS || hdr->m_bits > BF_MAX_BITS) return 0;
548 0 2 if ((hdr->m_bits & (hdr->m_bits - 1)) != 0) return 0; /* power of two */
549 0 2 if (hdr->m_mask != hdr->m_bits - 1) return 0;
550 0 2 if (hdr->capacity == 0) return 0;
551 2 0 if (!(hdr->fp_rate > 0.0 && hdr->fp_rate < 1.0)) return 0;
0 2 if (!(hdr->fp_rate > 0.0 && hdr->fp_rate < 1.0)) return 0;
552 0 2 if (hdr->total_size != file_size) return 0;
553 0 2 if (hdr->total_size != bf_total_size(hdr->m_bits)) return 0;
555 0 2 if (hdr->reader_slots_off != L.reader_slots) return 0;
556 0 2 if (hdr->bits_off != L.bits) return 0;
563 28 0 if (errbuf) errbuf[0] = '\0';
564 0 28 if (capacity < 1) { BF_ERR("capacity must be >= 1"); return 0; }
0 0 if (capacity < 1) { BF_ERR("capacity must be >= 1"); return 0; }
565 28 0 if (!(fp_rate > 0.0 && fp_rate < 1.0)) { BF_ERR("fp_rate must be between 0 and 1 (exclusive)"); return 0; }
0 28 if (!(fp_rate > 0.0 && fp_rate < 1.0)) { BF_ERR("fp_rate must be between 0 and 1 (exclusive)"); return 0; }
0 0 if (!(fp_rate > 0.0 && fp_rate < 1.0)) { BF_ERR("fp_rate must be between 0 and 1 (exclusive)"); return 0; }
569 0 28 if (kl < BF_MIN_K) kl = BF_MIN_K;
570 0 28 if (kl > BF_MAX_K) kl = BF_MAX_K;
577 1 27 if (m_opt_d > (double)BF_MAX_BITS) { BF_ERR("capacity too large for the bit-array cap"); return 0; }
1 0 if (m_opt_d > (double)BF_MAX_BITS) { BF_ERR("capacity too large for the bit-array cap"); return 0; }
588 1 25 if (!bf_validate_create_args(capacity, fp_rate, &k, &m_bits, errbuf)) return NULL;
596 20 5 if (anonymous) {
599 0 20 if (base == MAP_FAILED) { BF_ERR("mmap: %s", strerror(errno)); return NULL; }
0 0 if (base == MAP_FAILED) { BF_ERR("mmap: %s", strerror(errno)); return NULL; }
602 0 5 if (fd < 0) { BF_ERR("open: %s", strerror(errno)); return NULL; }
0 0 if (fd < 0) { BF_ERR("open: %s", strerror(errno)); return NULL; }
603 0 5 if (flock(fd, LOCK_EX) < 0) { BF_ERR("flock: %s", strerror(errno)); close(fd); return NULL; }
0 0 if (flock(fd, LOCK_EX) < 0) { BF_ERR("flock: %s", strerror(errno)); close(fd); return NULL; }
605 0 5 if (fstat(fd, &st) < 0) { BF_ERR("fstat: %s", strerror(errno)); flock(fd, LOCK_UN); close(fd); return NULL; }
0 0 if (fstat(fd, &st) < 0) { BF_ERR("fstat: %s", strerror(errno)); flock(fd, LOCK_UN); close(fd); return NULL; }
607 2 3 if (!is_new && (uint64_t)st.st_size < sizeof(BfHeader)) {
1 1 if (!is_new && (uint64_t)st.st_size < sizeof(BfHeader)) {
608 1 0 BF_ERR("%s: file too small (%lld)", path, (long long)st.st_size);
611 3 1 if (is_new && ftruncate(fd, (off_t)total) < 0) {
0 3 if (is_new && ftruncate(fd, (off_t)total) < 0) {
612 0 0 BF_ERR("ftruncate: %s", strerror(errno)); flock(fd, LOCK_UN); close(fd); return NULL;
614 1 3 map_size = is_new ? (size_t)total : (size_t)st.st_size;
616 0 4 if (base == MAP_FAILED) { BF_ERR("mmap: %s", strerror(errno)); flock(fd, LOCK_UN); close(fd); return NULL; }
0 0 if (base == MAP_FAILED) { BF_ERR("mmap: %s", strerror(errno)); flock(fd, LOCK_UN); close(fd); return NULL; }
617 1 3 if (!is_new) {
618 0 1 if (!bf_validate_header((BfHeader *)base, (uint64_t)st.st_size)) {
619 0 0 BF_ERR("invalid Bloom filter file"); munmap(base, map_size); flock(fd, LOCK_UN); close(fd); return NULL;
626 3 20 if (fd >= 0) { flock(fd, LOCK_UN); close(fd); }
633 0 2 if (!bf_validate_create_args(capacity, fp_rate, &k, &m_bits, errbuf)) return NULL;
636 1 1 int fd = memfd_create(name ? name : "bloom", MFD_CLOEXEC | MFD_ALLOW_SEALING);
637 0 2 if (fd < 0) { BF_ERR("memfd_create: %s", strerror(errno)); return NULL; }
0 0 if (fd < 0) { BF_ERR("memfd_create: %s", strerror(errno)); return NULL; }
638 0 2 if (ftruncate(fd, (off_t)total) < 0) {
639 0 0 BF_ERR("ftruncate: %s", strerror(errno)); close(fd); return NULL;
643 0 2 if (base == MAP_FAILED) { BF_ERR("mmap: %s", strerror(errno)); close(fd); return NULL; }
0 0 if (base == MAP_FAILED) { BF_ERR("mmap: %s", strerror(errno)); close(fd); return NULL; }
649 2 0 if (errbuf) errbuf[0] = '\0';
651 0 2 if (fstat(fd, &st) < 0) { BF_ERR("fstat: %s", strerror(errno)); return NULL; }
0 0 if (fstat(fd, &st) < 0) { BF_ERR("fstat: %s", strerror(errno)); return NULL; }
652 1 1 if ((uint64_t)st.st_size < sizeof(BfHeader)) { BF_ERR("too small"); return NULL; }
1 0 if ((uint64_t)st.st_size < sizeof(BfHeader)) { BF_ERR("too small"); return NULL; }
655 0 1 if (base == MAP_FAILED) { BF_ERR("mmap: %s", strerror(errno)); return NULL; }
0 0 if (base == MAP_FAILED) { BF_ERR("mmap: %s", strerror(errno)); return NULL; }
656 0 1 if (!bf_validate_header((BfHeader *)base, (uint64_t)st.st_size)) {
657 0 0 BF_ERR("invalid Bloom filter table"); munmap(base, ms); return NULL;
660 0 1 if (myfd < 0) { BF_ERR("fcntl: %s", strerror(errno)); munmap(base, ms); return NULL; }
0 0 if (myfd < 0) { BF_ERR("fcntl: %s", strerror(errno)); munmap(base, ms); return NULL; }
665 0 27 if (!h) return;
666 3 24 if (h->backing_fd >= 0) close(h->backing_fd);
667 27 0 if (h->base) munmap(h->base, h->mmap_size);
673 2 0 if (!h || !h->base) return 0;
0 2 if (!h || !h->base) return 0;
698 229642 32806 for (uint32_t i = 0; i < k; i++) {
702 184700 44942 if (!(bits[word] & bit)) { bits[word] |= bit; was_new = 1; }
714 120705 14833 for (uint32_t i = 0; i < k; i++) {
718 9977 110728 if (!(bits[word] & bit)) return 0;
728 4608 8 for (uint64_t i = 0; i < words; i++)
738 0 8 if (X >= m_bits) return h->hdr->capacity; /* saturated */
740 0 8 if (n_est < 0.0) n_est = 0.0;
753 1792 3 for (uint64_t i = 0; i < words; i++)