Bug #115
closedMac OSX
Description
Voici 2 patches… le premier me semble sans danger et élimine un warning de clang, le second est pour palier a l’absence de spinlock sur OSX (trouvé sur le web).
ashitaka:genom3-pocolibs felix$ git diff
diff --git a/common/typecopy.h b/common/typecopy.h
index ca0e93c..fce6db4 100644
--- a/common/typecopy.h
++ b/common/typecopy.h@ -253,6 +253,7
@ genom_tcopy_<"[$t mangle]">(<"[$t argument reference dst]">,
<"[$e pass value src->[$e name]]">);
if (s) return s;
<' }'>
return 0; /* fix Wreturn-type / a/server/control_task.h
<' } else {'>
(void)dst; (void)src; / fix -Wunused-parameter */
<' }'>
diff --git a/server/control_task.h b/server/control_task.h
index 8ee261f..c756e76 100644
--
+++ b/server/control_task.h@ -42,6 +42,49
@ lang c
#include "<"$comp">_remotelib.h"
#include "<"$comp">_activity.h"
#ifdef APPLE
+typedef int pthread_spinlock_t;
static inline
+int pthread_spin_init(pthread_spinlock_t *lock, int pshared) {
asm volatile ("" ::: "memory");
+ *lock = 0;
+ return 0;
}
static inline
+int pthread_spin_destroy(pthread_spinlock_t *lock) {
return 0;
}
static inline
+int pthread_spin_lock(pthread_spinlock_t *lock) {
while (1) {
+ int i;
+ for (i=0; i < 10000; i++) {
+ if (sync_bool_compare_and_swap(lock, 0, 1)) {
+ return 0;
+ }
+ }
+ sched_yield();
+ }
}
static __inline
+int pthread_spin_trylock(pthread_spinlock_t *lock) {
if (sync_bool_compare_and_swap(lock, 0, 1)) {
+ return 0;
+ }
+ return EBUSY;
}
static __inline
+int pthread_spin_unlock(pthread_spinlock_t *lock) {
asm volatile ("" ::: "memory");
+ *lock = 0;
+ return 0;
}
#endif
/* --- an enum of all the codels defined ----------------------------------------------------- */
ashitaka:genom3-pocolibs felix$
—
Felix
Files
Updated by François Félix Ingrand over 7 years ago
As for missing spin lock on OSX, there is in fact a "replacement"... so here is another implementation which I prefer...
#include <libkern/OSAtomic.h> typedef OSSpinLock pthread_spinlock_t; static __inline__ int pthread_spin_init(pthread_spinlock_t *lock, int pshared) { __asm__ __volatile__ ("" ::: "memory"); /* this does not hurt to keep it */ *lock = 0; return 0; } static __inline__ int pthread_spin_destroy(pthread_spinlock_t *lock) { return 0; /* Nothing to do, just an int */ } static __inline__ int pthread_spin_lock(pthread_spinlock_t *lock) { OSSpinLockLock(lock); return 0; } static __inline__ int pthread_spin_trylock(pthread_spinlock_t *lock) { if (OSSpinLockTry(lock)) return 0; /* OSSpinLockTry return true on success, and pthread_spin_trylock 0 */ else return EBUSY; } static __inline__ int pthread_spin_unlock(pthread_spinlock_t *lock) { OSSpinLockUnlock(lock); return 0; }
Updated by Anthony Mallet over 7 years ago
- Status changed from New to Closed
Applied in changeset dba71e624df0093469fb9be38ed1af96e9fc9ead.