mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-30 13:41:48 +00:00
5aeb28aabd
--
33 lines
531 B
Text
33 lines
531 B
Text
***********************************************
|
|
|
|
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);
|