Copyright | Will Thompson, Iñaki García Etxebarria and Jonas Platte |
---|---|
License | LGPL-2.1 |
Maintainer | Iñaki García Etxebarria (garetxe@gmail.com) |
Safe Haskell | None |
Language | Haskell2010 |
The GRWLock struct is an opaque data structure to represent a reader-writer lock. It is similar to a #GMutex in that it allows multiple threads to coordinate access to a shared resource.
The difference to a mutex is that a reader-writer lock discriminates
between read-only (reader
) and full (writer
) access. While only
one thread at a time is allowed write access (by holding the writer
lock via g_rw_lock_writer_lock()), multiple threads can gain
simultaneous read-only access (by holding the reader
lock via
g_rw_lock_reader_lock()).
Here is an example for an array with access functions: |[language="C" -- GRWLock lock; GPtrArray *array;
gpointer my_array_get (guint index) { gpointer retval = NULL;
if (!array) return NULL;
g_rw_lock_reader_lock (&lock); if (index array-len) retval = g_ptr_array_index (array, index); g_rw_lock_reader_unlock (&lock);
return retval; }
void my_array_set (guint index, gpointer data) { g_rw_lock_writer_lock (&lock);
if (!array) array = g_ptr_array_new ();
if (index >= array->len) g_ptr_array_set_size (array, index+1); g_ptr_array_index (array, index) = data;
g_rw_lock_writer_unlock (&lock); } ]| This example shows an array which can be accessed by many readers (the my_array_get() function) simultaneously, whereas the writers (the my_array_set() function) will only be allowed one at a time and only if no readers currently access the array. This is because of the potentially dangerous resizing of the array. Using these functions is fully multi-thread safe now.
If a #GRWLock is allocated in static storage then it can be used without initialisation. Otherwise, you should call g_rw_lock_init() on it and g_rw_lock_clear() when done.
A GRWLock should only be accessed with the g_rw_lock_ functions.
- newtype RWLock = RWLock (ForeignPtr RWLock)
- newZeroRWLock :: MonadIO m => m RWLock
- noRWLock :: Maybe RWLock
- data RWLockClearMethodInfo
- rWLockClear :: MonadIO m => RWLock -> m ()
- data RWLockInitMethodInfo
- rWLockInit :: MonadIO m => RWLock -> m ()
- data RWLockReaderLockMethodInfo
- rWLockReaderLock :: MonadIO m => RWLock -> m ()
- data RWLockReaderTrylockMethodInfo
- rWLockReaderTrylock :: MonadIO m => RWLock -> m Bool
- data RWLockReaderUnlockMethodInfo
- rWLockReaderUnlock :: MonadIO m => RWLock -> m ()
- data RWLockWriterLockMethodInfo
- rWLockWriterLock :: MonadIO m => RWLock -> m ()
- data RWLockWriterTrylockMethodInfo
- rWLockWriterTrylock :: MonadIO m => RWLock -> m Bool
- data RWLockWriterUnlockMethodInfo
- rWLockWriterUnlock :: MonadIO m => RWLock -> m ()
Exported types
WrappedPtr RWLock | |
(~) AttrOpTag tag AttrSet => Constructible RWLock tag | |
((~) * signature (m ()), MonadIO m) => MethodInfo * RWLockWriterUnlockMethodInfo RWLock signature | |
((~) * signature (m Bool), MonadIO m) => MethodInfo * RWLockWriterTrylockMethodInfo RWLock signature | |
((~) * signature (m ()), MonadIO m) => MethodInfo * RWLockWriterLockMethodInfo RWLock signature | |
((~) * signature (m ()), MonadIO m) => MethodInfo * RWLockReaderUnlockMethodInfo RWLock signature | |
((~) * signature (m Bool), MonadIO m) => MethodInfo * RWLockReaderTrylockMethodInfo RWLock signature | |
((~) * signature (m ()), MonadIO m) => MethodInfo * RWLockReaderLockMethodInfo RWLock signature | |
((~) * signature (m ()), MonadIO m) => MethodInfo * RWLockInitMethodInfo RWLock signature | |
((~) * signature (m ()), MonadIO m) => MethodInfo * RWLockClearMethodInfo RWLock signature | |
((~) * info (ResolveRWLockMethod t RWLock), MethodInfo * info RWLock p) => IsLabelProxy t (RWLock -> p) | |
type AttributeList RWLock |
newZeroRWLock :: MonadIO m => m RWLock Source
Construct a RWLock
struct initialized to zero.
Methods
rWLockClear
data RWLockClearMethodInfo Source
((~) * signature (m ()), MonadIO m) => MethodInfo * RWLockClearMethodInfo RWLock signature |
rWLockClear :: MonadIO m => RWLock -> m () Source
rWLockInit
data RWLockInitMethodInfo Source
((~) * signature (m ()), MonadIO m) => MethodInfo * RWLockInitMethodInfo RWLock signature |
rWLockInit :: MonadIO m => RWLock -> m () Source
rWLockReaderLock
data RWLockReaderLockMethodInfo Source
((~) * signature (m ()), MonadIO m) => MethodInfo * RWLockReaderLockMethodInfo RWLock signature |
rWLockReaderLock :: MonadIO m => RWLock -> m () Source
rWLockReaderTrylock
data RWLockReaderTrylockMethodInfo Source
((~) * signature (m Bool), MonadIO m) => MethodInfo * RWLockReaderTrylockMethodInfo RWLock signature |
rWLockReaderTrylock :: MonadIO m => RWLock -> m Bool Source
rWLockReaderUnlock
data RWLockReaderUnlockMethodInfo Source
((~) * signature (m ()), MonadIO m) => MethodInfo * RWLockReaderUnlockMethodInfo RWLock signature |
rWLockReaderUnlock :: MonadIO m => RWLock -> m () Source
rWLockWriterLock
data RWLockWriterLockMethodInfo Source
((~) * signature (m ()), MonadIO m) => MethodInfo * RWLockWriterLockMethodInfo RWLock signature |
rWLockWriterLock :: MonadIO m => RWLock -> m () Source
rWLockWriterTrylock
data RWLockWriterTrylockMethodInfo Source
((~) * signature (m Bool), MonadIO m) => MethodInfo * RWLockWriterTrylockMethodInfo RWLock signature |
rWLockWriterTrylock :: MonadIO m => RWLock -> m Bool Source
rWLockWriterUnlock
data RWLockWriterUnlockMethodInfo Source
((~) * signature (m ()), MonadIO m) => MethodInfo * RWLockWriterUnlockMethodInfo RWLock signature |
rWLockWriterUnlock :: MonadIO m => RWLock -> m () Source