diff --git a/docs/random/wtay/rwlocks b/docs/random/wtay/rwlocks new file mode 100644 index 0000000000..07a18212de --- /dev/null +++ b/docs/random/wtay/rwlocks @@ -0,0 +1,33 @@ +*********************************************** + +typedef struct { + int pre_count; + int post_count; + Mutex *lock; +} RWLock; + + +reader: + + retry: + post = atomic_get (lock->post_count); + + ... do read ... + + if (atomic_get (lock->pre_count) != post) { + /* wait for writer to finish then retry */ + lock (lock->mutex); + unlock (lock->mutex); + goto retry; + } + + +writer: + + lock (lock->mutex); + atomic_inc (lock->pre_count); + + ... update ... + + atomic_inc (lock->post_count); + unlock (lock->mutex);