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