PatchworkOS  28a9544
A non-POSIX operating system.
Loading...
Searching...
No Matches
seqlock.h
Go to the documentation of this file.
1#pragma once
2
3#include <kernel/sync/lock.h>
4
5#include <stdatomic.h>
6
29typedef struct
30{
31 atomic_uint64_t sequence;
33} seqlock_t;
34
40#define SEQLOCK_CREATE {.sequence = ATOMIC_VAR_INIT(0), .writeLock = LOCK_CREATE}
41
47static inline void seqlock_init(seqlock_t* seqlock)
48{
49 atomic_init(&seqlock->sequence, 0);
50 lock_init(&seqlock->writeLock);
51}
52
60static inline void seqlock_write_acquire(seqlock_t* seqlock)
61{
62 lock_acquire(&seqlock->writeLock);
64}
65
71static inline void seqlock_write_release(seqlock_t* seqlock)
72{
74 lock_release(&seqlock->writeLock);
75}
76
92static inline uint64_t seqlock_read_begin(seqlock_t* seqlock)
93{
95}
96
104static inline bool seqlock_read_retry(seqlock_t* seqlock, uint64_t seq)
105{
107 return (atomic_load_explicit(&seqlock->sequence, memory_order_relaxed) != seq) || (seq & 1);
108}
109
static void lock_init(lock_t *lock)
Initializes a lock.
Definition lock.h:82
static void lock_release(lock_t *lock)
Releases a lock.
Definition lock.h:142
static void lock_acquire(lock_t *lock)
Acquires a lock, blocking until it is available.
Definition lock.h:99
static uint64_t seqlock_read_begin(seqlock_t *seqlock)
Begins a read operation on a sequence lock.
Definition seqlock.h:92
static void seqlock_write_release(seqlock_t *seqlock)
Releases the write lock of a sequence lock.
Definition seqlock.h:71
static bool seqlock_read_retry(seqlock_t *seqlock, uint64_t seq)
Checks if a read operation on a sequence lock needs to be retried.
Definition seqlock.h:104
static void seqlock_init(seqlock_t *seqlock)
Initializes a sequence lock.
Definition seqlock.h:47
static void seqlock_write_acquire(seqlock_t *seqlock)
Acquires the write lock of a sequence lock.
Definition seqlock.h:60
@ memory_order_release
Definition stdatomic.h:119
@ memory_order_relaxed
Definition stdatomic.h:116
@ memory_order_acquire
Definition stdatomic.h:118
#define atomic_fetch_add_explicit(object, operand, order)
Definition stdatomic.h:259
#define atomic_load_explicit(object, order)
Definition stdatomic.h:264
#define atomic_thread_fence(order)
Definition stdatomic.h:135
#define atomic_init(obj, value)
Definition stdatomic.h:75
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
A simple ticket lock implementation.
Definition lock.h:43
Sequence lock structure.
Definition seqlock.h:30
lock_t writeLock
Definition seqlock.h:32
atomic_uint64_t sequence
Definition seqlock.h:31