16#ifndef __STARPU_SPINLOCK_H__
17#define __STARPU_SPINLOCK_H__
23#include <common/config.h>
28#ifdef STARPU_SPINLOCK_CHECK
34 starpu_pthread_mutex_t errcheck_lock;
35 const char *last_taker;
41static inline int __starpu_spin_lock(
struct _starpu_spinlock *lock,
const char *file STARPU_ATTRIBUTE_UNUSED,
int line STARPU_ATTRIBUTE_UNUSED,
const char *func STARPU_ATTRIBUTE_UNUSED)
43 _STARPU_TRACE_LOCKING_SPINLOCK(file, line);
44 int ret = starpu_pthread_mutex_lock(&lock->errcheck_lock);
46 lock->last_taker = func;
47 _STARPU_TRACE_SPINLOCK_LOCKED(file, line);
51static inline void _starpu_spin_checklocked(
struct _starpu_spinlock *lock STARPU_ATTRIBUTE_UNUSED)
53 STARPU_ASSERT(starpu_pthread_mutex_trylock(&lock->errcheck_lock) != 0);
56static inline int __starpu_spin_trylock(
struct _starpu_spinlock *lock,
const char *file STARPU_ATTRIBUTE_UNUSED,
int line STARPU_ATTRIBUTE_UNUSED,
const char *func STARPU_ATTRIBUTE_UNUSED)
58 _STARPU_TRACE_TRYLOCK_SPINLOCK(file, line);
59 int ret = starpu_pthread_mutex_trylock(&lock->errcheck_lock);
60 STARPU_ASSERT(!ret || (ret == EBUSY));
61 if (STARPU_LIKELY(!ret))
63 lock->last_taker = func;
64 _STARPU_TRACE_SPINLOCK_LOCKED(file, line);
69static inline int __starpu_spin_unlock(
struct _starpu_spinlock *lock,
const char *file STARPU_ATTRIBUTE_UNUSED,
int line STARPU_ATTRIBUTE_UNUSED,
const char *func STARPU_ATTRIBUTE_UNUSED)
71 _STARPU_TRACE_UNLOCKING_SPINLOCK(file, line);
72 int ret = starpu_pthread_mutex_unlock(&lock->errcheck_lock);
74 _STARPU_TRACE_SPINLOCK_UNLOCKED(file, line);
83 starpu_pthread_spinlock_t lock;
88 int ret = starpu_pthread_spin_init(&lock->lock, 0);
93#define _starpu_spin_destroy(_lock) starpu_pthread_spin_destroy(&(_lock)->lock)
95static inline int __starpu_spin_lock(
struct _starpu_spinlock *lock,
const char *file STARPU_ATTRIBUTE_UNUSED,
int line STARPU_ATTRIBUTE_UNUSED,
const char *func STARPU_ATTRIBUTE_UNUSED)
97 _STARPU_TRACE_LOCKING_SPINLOCK(file, line);
98 int ret = starpu_pthread_spin_lock(&lock->lock);
100 _STARPU_TRACE_SPINLOCK_LOCKED(file, line);
104#define _starpu_spin_checklocked(_lock) _starpu_pthread_spin_checklocked(&(_lock)->lock)
106static inline int __starpu_spin_trylock(
struct _starpu_spinlock *lock,
const char *file STARPU_ATTRIBUTE_UNUSED,
int line STARPU_ATTRIBUTE_UNUSED,
const char *func STARPU_ATTRIBUTE_UNUSED)
108 _STARPU_TRACE_TRYLOCK_SPINLOCK(file, line);
109 int ret = starpu_pthread_spin_trylock(&lock->lock);
110 STARPU_ASSERT(!ret || (ret == EBUSY));
111 if (STARPU_LIKELY(!ret))
112 _STARPU_TRACE_SPINLOCK_LOCKED(file, line);
116static inline int __starpu_spin_unlock(
struct _starpu_spinlock *lock,
const char *file STARPU_ATTRIBUTE_UNUSED,
int line STARPU_ATTRIBUTE_UNUSED,
const char *func STARPU_ATTRIBUTE_UNUSED)
118 _STARPU_TRACE_UNLOCKING_SPINLOCK(file, line);
119 int ret = starpu_pthread_spin_unlock(&lock->lock);
121 _STARPU_TRACE_SPINLOCK_UNLOCKED(file, line);
126#define _starpu_spin_lock(lock) \
127 __starpu_spin_lock(lock, __FILE__, __LINE__, __starpu_func__)
128#define _starpu_spin_trylock(lock) \
129 __starpu_spin_trylock(lock, __FILE__, __LINE__, __starpu_func__)
130#define _starpu_spin_unlock(lock) \
131 __starpu_spin_unlock(lock, __FILE__, __LINE__, __starpu_func__)
133#define STARPU_SPIN_MAXTRY 10
Definition: starpu_spinlock.h:82