aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/suricata/src/threads-arch-tile.h
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/suricata/src/threads-arch-tile.h')
-rw-r--r--framework/src/suricata/src/threads-arch-tile.h114
1 files changed, 114 insertions, 0 deletions
diff --git a/framework/src/suricata/src/threads-arch-tile.h b/framework/src/suricata/src/threads-arch-tile.h
new file mode 100644
index 00000000..d022d90e
--- /dev/null
+++ b/framework/src/suricata/src/threads-arch-tile.h
@@ -0,0 +1,114 @@
+/* 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 <suricata@tilera.com>
+ */
+
+#ifndef __THREADS_ARCH_TILE_H__
+#define __THREADS_ARCH_TILE_H__
+
+#include <tmc/spin.h>
+#include <arch/cycle.h>
+
+/* 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