From c75591bfed2025a61d46240e3c57aa8fbf4ccf33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C5=8Dshin?= Date: Tue, 19 Dec 2023 13:20:11 -0500 Subject: [PATCH] Save a redundant load in zipos read/seek When h->pos has changed to something other than SIZE_MAX, we don't need the extra atomic load. --- libc/runtime/zipos-read.c | 16 +++++++--------- libc/runtime/zipos-seek.c | 16 +++++++--------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/libc/runtime/zipos-read.c b/libc/runtime/zipos-read.c index edc6ceab1..a7ca7c8be 100644 --- a/libc/runtime/zipos-read.c +++ b/libc/runtime/zipos-read.c @@ -38,17 +38,15 @@ static ssize_t __zipos_read_impl(struct ZiposHandle *h, const struct iovec *iov, return eisdir(); } if (opt_offset == -1) { - while (true) { - start_pos = atomic_load_explicit(&h->pos, memory_order_relaxed); + Restart: + start_pos = atomic_load_explicit(&h->pos, memory_order_relaxed); + do { if (UNLIKELY(start_pos == SIZE_MAX)) { - continue; + goto Restart; } - if (LIKELY(atomic_compare_exchange_weak_explicit( - &h->pos, &start_pos, SIZE_MAX, memory_order_acquire, - memory_order_relaxed))) { - break; - } - } + } while (!LIKELY(atomic_compare_exchange_weak_explicit( + &h->pos, &start_pos, SIZE_MAX, memory_order_acquire, + memory_order_relaxed))); x = y = start_pos; } else { x = y = opt_offset; diff --git a/libc/runtime/zipos-seek.c b/libc/runtime/zipos-seek.c index e76566a02..d12efc694 100644 --- a/libc/runtime/zipos-seek.c +++ b/libc/runtime/zipos-seek.c @@ -47,10 +47,11 @@ static int64_t Seek(int64_t pos, int64_t offset) { */ int64_t __zipos_seek(struct ZiposHandle *h, int64_t offset, unsigned whence) { int64_t pos, new_pos; - while (true) { - pos = atomic_load_explicit(&h->pos, memory_order_relaxed); +Restart: + pos = atomic_load_explicit(&h->pos, memory_order_relaxed); + do { if (UNLIKELY(pos == SIZE_MAX)) { - continue; + goto Restart; } switch (whence) { case SEEK_SET: @@ -65,11 +66,8 @@ int64_t __zipos_seek(struct ZiposHandle *h, int64_t offset, unsigned whence) { default: new_pos = einval(); } - if (LIKELY(atomic_compare_exchange_weak_explicit( - &h->pos, &pos, new_pos < 0 ? pos : new_pos, memory_order_release, - memory_order_relaxed))) { - break; - } - } + } while (!LIKELY(atomic_compare_exchange_weak_explicit( + &h->pos, &pos, new_pos < 0 ? pos : new_pos, memory_order_release, + memory_order_relaxed))); return new_pos; }