| 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]; |