У меня возникла проблема. Имеется кросс компилятор под архитектуру Sparc. Но он не поддерживает Built-in functions for atomic memory access. Меня интересует функция __sync_val_compare_and_swap (long *ptr, long oldval long newval) она выполняет атомарную операцию сравнения и обмена: That is, if the current value of *ptr is oldval, then write newval into *ptr. Вот есть реализация для i386: Код (Text): struct __xchg_dummy { unsigned long a[100]; }; #define __xg(x) ((struct __xchg_dummy *)(x)) static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) { unsigned long prev; switch (size) { case 1: __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2" : "=a"(prev) : "q"(new), "m"(*__xg(ptr)), "0"(old) : "memory"); return prev; case 2: __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2" : "=a"(prev) : "q"(new), "m"(*__xg(ptr)), "0"(old) : "memory"); return prev; case 4: __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2" : "=a"(prev) : "q"(new), "m"(*__xg(ptr)), "0"(old) : "memory"); return prev; } return old; } #define cmpxchg(ptr,o,n)\ ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\ (unsigned long)(n),sizeof(*(ptr)))) Кто-нибудь знаком с написанием ассемблерных вставок (для кода на языке C) под архитектуру Sparc V8? Буду очень благодарен помощи
Goliath Вам не приходило в голову, что на Sparc могут отсутствовать некоторые интеловские извращения и нужно использовать другие механизмы синхронизации?!