X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Funix%2Fsilcunixthread.c;h=2415a380e31eb3bb21509ff4be74b9c58ce07d2b;hb=0d56eecc0a4e39d1a0b1695a576ab2a51fb87470;hp=487faf051d1343591ade8af90addb71df65f77db;hpb=b10d20e3497a39aeb68903c25d1bc944611c452b;p=crypto.git diff --git a/lib/silcutil/unix/silcunixthread.c b/lib/silcutil/unix/silcunixthread.c index 487faf05..2415a380 100644 --- a/lib/silcutil/unix/silcunixthread.c +++ b/lib/silcutil/unix/silcunixthread.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 2001 - 2006 Pekka Riikonen + Copyright (C) 2001 - 2007 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -97,6 +97,14 @@ SilcBool silc_thread_wait(SilcThread thread, void **exit_value) #endif } +void silc_thread_yield(void) +{ +#ifdef SILC_THREADS +#ifdef HAVE_SCHED_YIELD + sched_yield(); +#endif /* HAVE_SCHED_YIELD */ +#endif /* SILC_THREADS */ +} /***************************** SILC Mutex API *******************************/ @@ -104,9 +112,8 @@ SilcBool silc_thread_wait(SilcThread thread, void **exit_value) struct SilcMutexStruct { #ifdef SILC_THREADS pthread_mutex_t mutex; -#else - void *tmp; #endif /* SILC_THREADS */ + unsigned int locked : 1; }; SilcBool silc_mutex_alloc(SilcMutex *mutex) @@ -116,6 +123,7 @@ SilcBool silc_mutex_alloc(SilcMutex *mutex) if (*mutex == NULL) return FALSE; pthread_mutex_init(&(*mutex)->mutex, NULL); + (*mutex)->locked = FALSE; return TRUE; #else return FALSE; @@ -136,8 +144,8 @@ void silc_mutex_lock(SilcMutex mutex) { #ifdef SILC_THREADS if (mutex) { - if (pthread_mutex_lock(&mutex->mutex)) - assert(FALSE); + SILC_VERIFY(pthread_mutex_lock(&mutex->mutex) == 0); + mutex->locked = TRUE; } #endif /* SILC_THREADS */ } @@ -146,14 +154,79 @@ void silc_mutex_unlock(SilcMutex mutex) { #ifdef SILC_THREADS if (mutex) { - if (pthread_mutex_unlock(&mutex->mutex)) - assert(FALSE); + mutex->locked = FALSE; + SILC_VERIFY(pthread_mutex_unlock(&mutex->mutex) == 0); } #endif /* SILC_THREADS */ } +void silc_mutex_assert_locked(SilcMutex mutex) +{ +#ifdef SILC_THREADS + if (mutex) + SILC_VERIFY(mutex->locked); +#endif /* SILC_THREADS */ +} + +/***************************** 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 ******************************/ +/****************************** SILC Cond API *******************************/ /* SILC Conditional Variable context */ struct SilcCondStruct {