From 417dbad3742037e7bcf129cddb369d5e3b2cfc19 Mon Sep 17 00:00:00 2001 From: amir Date: Sat, 7 Mar 2026 11:36:11 +0100 Subject: [PATCH] Bug fixes in lock free MPMC queue Fix bug slots used before initialization,compare and swap is protecting updating committed, but it is not protecting the memory initialization. Adding atomic_flag commit_lock to protect against that Fix bug multiple threads committing at the same time, fixed by using atomic_flag commit_lock and re-checking committed after acquiring the lock Reorder helper functions --- binaries/changlog.txt | 6 +- binaries/file_hasher_v3.3.exe | Bin 0 -> 165376 bytes platform.h | 1 + platform_windows.c | 130 ++++++++++++++++++++-------------- 4 files changed, 82 insertions(+), 55 deletions(-) create mode 100644 binaries/file_hasher_v3.3.exe diff --git a/binaries/changlog.txt b/binaries/changlog.txt index 07bcec1..587df6a 100644 --- a/binaries/changlog.txt +++ b/binaries/changlog.txt @@ -8,8 +8,12 @@ v2.1: Uses AVX2 instead of SSE2 v3.0: Simple mutex/critical section based MPMC queue reusable hashing buffer -v3.1: Lock free MPMC queue +v3.1: Lock free MPMC queue Vyukov-style v3.2: Making the lock free MPMC queue growable Add padding to avoir false sharing Add sleep() and SwitchToThread() to limit spinning + +v3.3: Fix bug slots used before initialization,compare and swap is protecting updating committed, but it is not protecting the memory initialization. Adding atomic_flag commit_lock to protect against that +Fix bug multiple threads committing at the same time, fixed by using atomic_flag commit_lock and re-checking committed after acquiring the lock +Reorder helper functions diff --git a/binaries/file_hasher_v3.3.exe b/binaries/file_hasher_v3.3.exe new file mode 100644 index 0000000000000000000000000000000000000000..1712169a29dbfdccdcad601c3cd21ba13f6a1070 GIT binary patch literal 165376 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 // ----------------------------- Globals ------------------------------------ static atomic_uint_fast64_t g_files_found = 0; @@ -30,6 +31,25 @@ static uint64_t filetime_to_epoch(const FILETIME *ft) { return (ull.QuadPart - 116444736000000000ULL) / 10000000ULL; } +// ----------------------------- Format time helper ------------------------- +static void format_time(uint64_t t, char *out, size_t out_sz) { + if (t == 0) { + snprintf(out, out_sz, "N/A"); + return; + } + + time_t tt = (time_t)t; + struct tm tm; + +#if PLATFORM_WINDOWS + localtime_s(&tm, &tt); +#else + localtime_r(&tt, &tm); +#endif + + strftime(out, out_sz, "%Y-%m-%d %H:%M:%S", &tm); +} + // ----------------------------- Resolve file owner --------------------- static void get_file_owner(const char *path, char *out, size_t out_sz) { PSID sid = NULL; @@ -57,23 +77,22 @@ static void get_file_owner(const char *path, char *out, size_t out_sz) { LocalFree(sd); } -// ----------------------------- Format time helper ------------------------- -static void format_time(uint64_t t, char *out, size_t out_sz) { - if (t == 0) { - snprintf(out, out_sz, "N/A"); - return; +// ----------------------------- Get file metadata ------------------------- +void platform_get_file_times(const char *path, uint64_t *out_created, + uint64_t *out_modified) { + WIN32_FILE_ATTRIBUTE_DATA fad; + if (GetFileAttributesExA(path, GetFileExInfoStandard, &fad)) { + *out_created = filetime_to_epoch(&fad.ftCreationTime); + *out_modified = filetime_to_epoch(&fad.ftLastWriteTime); + } else { + *out_created = 0; + *out_modified = 0; } +} - time_t tt = (time_t)t; - struct tm tm; - -#if PLATFORM_WINDOWS - localtime_s(&tm, &tt); -#else - localtime_r(&tt, &tm); -#endif - - strftime(out, out_sz, "%Y-%m-%d %H:%M:%S", &tm); +void platform_get_file_owner(const char *path, char *out_owner, + size_t out_owner_size) { + get_file_owner(path, out_owner, out_owner_size); } // --------------- parallel directory scanning ---------------- @@ -96,6 +115,7 @@ void mpmc_init(MPMCQueue *q, size_t max_capacity) { } q->commit_step = (64ull * 1024 * 1024) / sizeof(MPMCSlot); + atomic_flag_clear(&q->commit_lock); q->committed = q->commit_step; @@ -112,15 +132,28 @@ void mpmc_init(MPMCQueue *q, size_t max_capacity) { } static void mpmc_commit_more(MPMCQueue *q) { - size_t start = q->committed; + + if (atomic_flag_test_and_set(&q->commit_lock)) + return; + + size_t start = atomic_load_explicit(&q->committed, memory_order_acquire); + size_t tail = atomic_load_explicit(&q->tail, memory_order_relaxed); + + // another thread already committed enough + if (tail < start) { + atomic_flag_clear(&q->commit_lock); + return; + } + + if (start >= q->capacity) { + atomic_flag_clear(&q->commit_lock); + return; + } size_t new_commit = start + q->commit_step; if (new_commit > q->capacity) new_commit = q->capacity; - if (!atomic_compare_exchange_strong(&q->committed, &start, new_commit)) - return; // another thread already committed - size_t count = new_commit - start; VirtualAlloc(&q->slots[start], count * sizeof(MPMCSlot), MEM_COMMIT, @@ -130,6 +163,10 @@ static void mpmc_commit_more(MPMCQueue *q) { atomic_init(&q->slots[i].seq, i); q->slots[i].data = NULL; } + + atomic_store_explicit(&q->committed, new_commit, memory_order_release); + + atomic_flag_clear(&q->commit_lock); } void mpmc_push(MPMCQueue *q, FileEntry *item) { @@ -139,6 +176,16 @@ void mpmc_push(MPMCQueue *q, FileEntry *item) { for (;;) { pos = atomic_load_explicit(&q->tail, memory_order_relaxed); + + // ensure the slot is committed BEFORE accessing it + size_t committed = + atomic_load_explicit(&q->committed, memory_order_relaxed); + + if (pos >= committed) { + mpmc_commit_more(q); + continue; + } + slot = &q->slots[pos & q->mask]; size_t seq = atomic_load_explicit(&slot->seq, memory_order_acquire); @@ -151,21 +198,13 @@ void mpmc_push(MPMCQueue *q, FileEntry *item) { memory_order_relaxed)) break; - } else if (diff < 0) { - - size_t committed = - atomic_load_explicit(&q->committed, memory_order_relaxed); - - if (pos >= committed) { - mpmc_commit_more(q); - continue; - } - - Sleep(1000); // queue actually full - - } else { + } else if (diff < 0) { // queue actually full Sleep(1000); + + } else { // waiting to grow + + Sleep(0); } } @@ -195,11 +234,12 @@ FileEntry *mpmc_pop(MPMCQueue *q) { memory_order_relaxed)) break; - } else if (diff < 0) { + } else if (diff < 0) { // queue is empty - Sleep(1000); + Sleep(500); + + } else { // slot is still transitioning (written by another thread) - } else { if (++spins > 10) { SwitchToThread(); // yield CPU @@ -207,7 +247,7 @@ FileEntry *mpmc_pop(MPMCQueue *q) { } else { - _mm_pause(); + _mm_pause(); // busy waiting } } } @@ -478,24 +518,6 @@ DWORD WINAPI progress_thread(void *arg) { return 0; } -// ----------------------------- Get file metadata ------------------------- -void platform_get_file_times(const char *path, uint64_t *out_created, - uint64_t *out_modified) { - WIN32_FILE_ATTRIBUTE_DATA fad; - if (GetFileAttributesExA(path, GetFileExInfoStandard, &fad)) { - *out_created = filetime_to_epoch(&fad.ftCreationTime); - *out_modified = filetime_to_epoch(&fad.ftLastWriteTime); - } else { - *out_created = 0; - *out_modified = 0; - } -} - -void platform_get_file_owner(const char *path, char *out_owner, - size_t out_owner_size) { - get_file_owner(path, out_owner, out_owner_size); -} - // ----------------------------- Main --------------------------------------- int main(int argc, char **argv) { char folders[64][MAX_PATHLEN]; // up to 64 input folders