5 Author: Pekka Riikonen <priikone@silcnet.org>
7 Copyright (C) 2001 - 2007 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; version 2 of the License.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
20 /****h* silcutil/SILC Mutex Interface
24 * Interface for mutual exclusion locks and read/write locks. This is
25 * platform independent interface for applications that need concurrency
33 /****s* silcutil/SilcMutexAPI/SilcMutex
37 * typedef struct SilcMutexStruct *SilcMutex;
41 * This context is the actual SILC Mutex and is allocated
42 * by silc_mutex_alloc and given as argument to all silc_mutex_*
43 * functions. It is freed by the silc_mutex_free function.
46 typedef struct SilcMutexStruct *SilcMutex;
48 /****s* silcutil/SilcMutexAPI/SilcRwLock
52 * typedef struct SilcRwLockStruct *SilcRwLock;
56 * This context is the actual SILC read/write lock and is allocated
57 * by silc_rwlock_alloc and given as argument to all silc_rwlock_*
58 * functions. It is freed by the silc_rwlock_free function.
61 typedef struct SilcRwLockStruct *SilcRwLock;
63 /****f* silcutil/SilcMutexAPI/silc_mutex_alloc
67 * SilcBool silc_mutex_alloc(SilcMutex *mutex);
71 * Allocates SILC Mutex object. The mutex object must be allocated
72 * before it can be used. It is freed by the silc_mutex_free function.
73 * This returns TRUE and allocated mutex in to the `mutex' and FALSE
77 SilcBool silc_mutex_alloc(SilcMutex *mutex);
79 /****f* silcutil/SilcMutexAPI/silc_mutex_free
83 * void silc_mutex_free(SilcMutex mutex);
87 * Free SILC Mutex object and frees all allocated memory. If `mutex'
88 * is NULL this function has no effect.
91 void silc_mutex_free(SilcMutex mutex);
93 /****f* silcutil/SilcMutexAPI/silc_mutex_lock
97 * void silc_mutex_lock(SilcMutex mutex);
101 * Locks the mutex. If the mutex is locked by another thread the
102 * current thread will block until the other thread has issued
103 * silc_mutex_unlock for the mutex. If `mutex' is NULL this function
108 * The caller must not call silc_mutex_lock for mutex that has been
109 * already locked in the current thread. In this case deadlock will
113 void silc_mutex_lock(SilcMutex mutex);
115 /****f* silcutil/SilcMutexAPI/silc_mutex_unlock
119 * void silc_mutex_unlock(SilcMutex mutex);
123 * Unlocks the mutex and thus releases it for another thread that
124 * may be waiting for the lock. If `mutex' is NULL this function
129 * The caller must not call the silc_mutex_unlock for an unlocked
130 * mutex or mutex not locked by the current thread.
133 void silc_mutex_unlock(SilcMutex mutex);
135 /****f* silcutil/SilcMutexAPI/silc_mutex_assert_locked
139 * void silc_mutex_assert_locked(SilcMutex mutex);
143 * Asserts that the `mutex' is locked. It is fatal error if the mutex
144 * is not locked. If debugging is not compiled in this function has
145 * no effect (SILC_DEBUG define).
148 void silc_mutex_assert_locked(SilcMutex mutex);
150 /****f* silcutil/SilcMutexAPI/silc_rwlock_alloc
154 * SilcBool silc_rwlock_alloc(SilcRwLock *rwlock);
158 * Allocates SILC read/write lock. The read/write lock must be allocated
159 * before it can be used. It is freed by the silc_rwlock_free function.
160 * This returns TRUE and allocated read/write lock in to the `rwlock' and
164 SilcBool silc_rwlock_alloc(SilcRwLock *rwlock);
166 /****f* silcutil/SilcRwLockAPI/silc_rwlock_free
170 * void silc_rwlock_free(SilcRwLock rwlock);
174 * Free SILC Rwlock object and frees all allocated memory. If `rwlock'
175 * is NULL this function has no effect.
178 void silc_rwlock_free(SilcRwLock rwlock);
180 /****f* silcutil/SilcRwLockAPI/silc_rwlock_rdlock
184 * void silc_rwlock_rdlock(SilcRwLock rwlock);
188 * Acquires read lock of the read/write lock `rwlock'. If the `rwlock'
189 * is locked by a writer the current thread will block until the other
190 * thread has issued silc_rwlock_unlock for the `rwlock'. This function
191 * may be called multiple times to acquire the read lock. There must be
192 * same amount of silc_rwlock_unlock calls. If `rwlock' is NULL this
193 * function has no effect.
196 void silc_rwlock_rdlock(SilcRwLock rwlock);
198 /****f* silcutil/SilcRwLockAPI/silc_rwlock_wrlock
202 * void silc_rwlock_wrlock(SilcRwLock rwlock);
206 * Acquires write lock of the read/write lock `rwlock'. If the `rwlock'
207 * is locked by a writer or a reader the current thread will block until
208 * the other thread(s) have issued silc_rwlock_unlock for the `rwlock'.
209 * If `rwlock' is NULL this function has no effect.
212 void silc_rwlock_wrlock(SilcRwLock rwlock);
214 /****f* silcutil/SilcRwLockAPI/silc_rwlock_unlock
218 * void silc_rwlock_unlock(SilcRwLock rwlock);
222 * Releases the lock of the read/write lock `rwlock'. If `rwlock' was
223 * locked by a writer this will release the writer lock. Otherwise this
224 * releases the reader lock. If `rwlock' is NULL this function has no
228 void silc_rwlock_unlock(SilcRwLock rwlock);