/* Copyright (C) 2011-2013 Open Information Security Foundation * * You can copy, redistribute or modify this Program under the terms of * the GNU General Public License version 2 as published by the Free * Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * version 2 along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. */ /** * \file * * \author Ken Steele, Tilera Corporation */ #ifndef __THREADS_ARCH_TILE_H__ #define __THREADS_ARCH_TILE_H__ #include #include /* NOTE: On Tilera datapath threads use the TMC (Tilera Multicore * Components) library spin mutexes while the control threads use * pthread mutexes. So the pthread mutex types are split out so that * their use can be differentiated. */ /* ctrl mutex */ #define SCCtrlMutex pthread_mutex_t #define SCCtrlMutexAttr pthread_mutexattr_t #define SCCtrlMutexInit(mut, mutattr ) pthread_mutex_init(mut, mutattr) #define SCCtrlMutexLock(mut) pthread_mutex_lock(mut) #define SCCtrlMutexTrylock(mut) pthread_mutex_trylock(mut) #define SCCtrlMutexUnlock(mut) pthread_mutex_unlock(mut) #define SCCtrlMutexDestroy pthread_mutex_destroy /* ctrl cond */ #define SCCtrlCondT pthread_cond_t #define SCCtrlCondInit pthread_cond_init #define SCCtrlCondSignal pthread_cond_signal #define SCCtrlCondTimedwait pthread_cond_timedwait #define SCCtrlCondWait pthread_cond_wait #define SCCtrlCondDestroy pthread_cond_destroy /* mutex */ #define SCMutex tmc_spin_queued_mutex_t #define SCMutexAttr #define SCMutexDestroy(x) ({ (void)(x); 0; }) #define SCMUTEX_INITIALIZER TMC_SPIN_QUEUED_MUTEX_INIT #define SCMutexInit(mut, mutattr) ({ \ int ret = 0; \ tmc_spin_queued_mutex_init(mut); \ ret; \ }) #define SCMutexLock(mut) ({ \ int ret = 0; \ tmc_spin_queued_mutex_lock(mut); \ ret; \ }) #define SCMutexTrylock(mut) ({ \ int ret = (tmc_spin_queued_mutex_trylock(mut) == 0) ? 0 : EBUSY; \ ret; \ }) #define SCMutexUnlock(mut) ({ \ int ret = 0; \ tmc_spin_queued_mutex_unlock(mut); \ ret; \ }) /* conditions */ /* Ignore signals when using spin locks */ #define SCCondT uint8_t #define SCCondInit(x,y) ({ 0; }) #define SCCondSignal(x) ({ 0; }) #define SCCondDestroy(x) ({ 0; }) static inline void cycle_sleep(int cycles) { uint64_t end = get_cycle_count() + cycles; while (get_cycle_count() < end) ; } #define SCCondWait(x,y) cycle_sleep(300) /* spinlocks */ #define SCSpinlock tmc_spin_queued_mutex_t #define SCSpinLock(spin) ({ tmc_spin_queued_mutex_lock(spin); 0; }) #define SCSpinTrylock(spin) (tmc_spin_queued_mutex_trylock(spin) ? EBUSY : 0) #define SCSpinUnlock(spin) ({ tmc_spin_queued_mutex_unlock(spin); 0; }) #define SCSpinInit(spin, spin_attr) ({ tmc_spin_queued_mutex_init(spin); 0; }) #define SCSpinDestroy(spin) ({ (void)(spin); 0; }) /* rwlocks */ #define SCRWLock tmc_spin_rwlock_t #define SCRWLockDestroy(x) ({ (void)(x); 0; }) #define SCRWLockInit(rwl, rwlattr ) ({ tmc_spin_rwlock_init(rwl); 0; }) #define SCRWLockWRLock(rwl) ({ tmc_spin_rwlock_wrlock(rwl); 0; }) #define SCRWLockRDLock(rwl) ({ tmc_spin_rwlock_rdlock(rwl); 0; }) #define SCRWLockTryWRLock(rwl) (tmc_spin_rwlock_trywrlock(rwl) ? EBUSY : 0) #define SCRWLockTryRDLock(rwl) (tmc_spin_rwlock_tryrdlock(rwl) ? EBUSY : 0) #define SCRWLockUnlock(rwl) ({ tmc_spin_rwlock_unlock(rwl); 0; }) #endif