00001 00044 #ifndef GENERIC_ATOMIC_H_INCLUDED 00045 #define GENERIC_ATOMIC_H_INCLUDED 00046 00047 #include <compiler.h> 00048 #include <interrupt.h> 00049 00061 typedef struct atomic_object { 00063 atomic_value_t value; 00064 } atomic_t; 00065 00066 static inline atomic_value_t atomic_read(atomic_t *ptr) 00067 { 00068 barrier(); 00069 return ptr->value; 00070 } 00071 00072 static inline void atomic_write(atomic_t *ptr, atomic_value_t value) 00073 { 00074 ptr->value = value; 00075 barrier(); 00076 } 00077 00078 static inline atomic_t atomic_add(atomic_t *ptr, atomic_value_t value) 00079 { 00080 atomic_t result; 00081 irqflags_t iflags; 00082 00083 iflags = cpu_irq_save(); 00084 result.value = ptr->value + value; 00085 ptr->value = result.value; 00086 cpu_irq_restore(iflags); 00087 00088 return result; 00089 } 00090 00091 static inline atomic_t atomic_sub(atomic_t *ptr, atomic_value_t value) 00092 { 00093 atomic_t result; 00094 irqflags_t iflags; 00095 00096 iflags = cpu_irq_save(); 00097 result.value = ptr->value - value; 00098 ptr->value = result.value; 00099 cpu_irq_restore(iflags); 00100 00101 return result; 00102 } 00103 00105 00106 #endif /* GENERIC_ATOMIC_H_INCLUDED */
1.6.3