+/***************************** SILC Rwlock API ******************************/
+
+/* SILC read/write lock structure */
+struct SilcRwLockStruct {
+#ifdef SILC_THREADS
+ pthread_rwlock_t rwlock;
+#else
+ void *tmp;
+#endif /* SILC_THREADS */
+};
+
+SilcBool silc_rwlock_alloc(SilcRwLock *rwlock)
+{
+#ifdef SILC_THREADS
+ *rwlock = silc_calloc(1, sizeof(**rwlock));
+ if (*rwlock == NULL)
+ return FALSE;
+ pthread_rwlock_init(&(*rwlock)->rwlock, NULL);
+ return TRUE;
+#else
+ return FALSE;
+#endif /* SILC_THREADS */
+}
+
+void silc_rwlock_free(SilcRwLock rwlock)
+{
+#ifdef SILC_THREADS
+ if (rwlock) {
+ pthread_rwlock_destroy(&rwlock->rwlock);
+ silc_free(rwlock);
+ }
+#endif /* SILC_THREADS */
+}
+
+void silc_rwlock_rdlock(SilcRwLock rwlock)
+{
+#ifdef SILC_THREADS
+ if (rwlock)
+ pthread_rwlock_rdlock(&rwlock->rwlock);
+#endif /* SILC_THREADS */
+}
+
+void silc_rwlock_wrlock(SilcRwLock rwlock)
+{
+#ifdef SILC_THREADS
+ if (rwlock)
+ SILC_VERIFY(pthread_rwlock_wrlock(&rwlock->rwlock) == 0);
+#endif /* SILC_THREADS */
+}
+
+void silc_rwlock_unlock(SilcRwLock rwlock)
+{
+#ifdef SILC_THREADS
+ if (rwlock)
+ SILC_VERIFY(pthread_rwlock_unlock(&rwlock->rwlock) == 0);
+#endif /* SILC_THREADS */
+}
+
+/****************************** SILC Cond API *******************************/