| 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++) |