diff options
Diffstat (limited to 'ot_fdstate.c')
| -rw-r--r-- | ot_fdstate.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/ot_fdstate.c b/ot_fdstate.c index 7d742da..09daf50 100644 --- a/ot_fdstate.c +++ b/ot_fdstate.c | |||
| @@ -91,7 +91,7 @@ uint32_t fdstate_open(int fd, void *cookie, ot_time expiry) { | |||
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | word = atomic_load_explicit(&slot->state, memory_order_relaxed); | 93 | word = atomic_load_explicit(&slot->state, memory_order_relaxed); |
| 94 | atomic_store_explicit(&slot->cookie, cookie, memory_order_relaxed); | 94 | atomic_store_explicit(&slot->cookie, cookie, memory_order_release); |
| 95 | atomic_store_explicit(&slot->expiry, expiry, memory_order_relaxed); | 95 | atomic_store_explicit(&slot->expiry, expiry, memory_order_relaxed); |
| 96 | /* Publishes the two above to whoever claims the slot next */ | 96 | /* Publishes the two above to whoever claims the slot next */ |
| 97 | atomic_store_explicit(&slot->state, FD_WORD(FD_GEN(word), FD_IDLE), memory_order_release); | 97 | atomic_store_explicit(&slot->state, FD_WORD(FD_GEN(word), FD_IDLE), memory_order_release); |
| @@ -183,14 +183,17 @@ int fdstate_next_expired(ot_time now, int *cursor) { | |||
| 183 | void *fdstate_cookie(int fd) { | 183 | void *fdstate_cookie(int fd) { |
| 184 | ot_fdslot *slot = fdstate_slot(fd); | 184 | ot_fdslot *slot = fdstate_slot(fd); |
| 185 | 185 | ||
| 186 | return slot ? atomic_load_explicit(&slot->cookie, memory_order_relaxed) : NULL; | 186 | /* Pairs with the release in fdstate_set_cookie and fdstate_open */ |
| 187 | return slot ? atomic_load_explicit(&slot->cookie, memory_order_acquire) : NULL; | ||
| 187 | } | 188 | } |
| 188 | 189 | ||
| 189 | void fdstate_set_cookie(int fd, void *cookie) { | 190 | void fdstate_set_cookie(int fd, void *cookie) { |
| 190 | ot_fdslot *slot = fdstate_slot(fd); | 191 | ot_fdslot *slot = fdstate_slot(fd); |
| 191 | 192 | ||
| 193 | /* Publishes what the cookie points at to whoever reads it next, which may | ||
| 194 | be another thread entirely */ | ||
| 192 | if (slot) | 195 | if (slot) |
| 193 | atomic_store_explicit(&slot->cookie, cookie, memory_order_relaxed); | 196 | atomic_store_explicit(&slot->cookie, cookie, memory_order_release); |
| 194 | } | 197 | } |
| 195 | 198 | ||
| 196 | void fdstate_set_expiry(int fd, ot_time expiry) { | 199 | void fdstate_set_expiry(int fd, ot_time expiry) { |
