mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			Add atomic exchange
							parent
							
								
									a71984093a
								
							
						
					
					
						commit
						694adaae8b
					
				| 
						 | 
				
			
			@ -71,6 +71,22 @@ bool core_util_atomic_cas_u32(volatile uint32_t *ptr, uint32_t *expectedCurrentV
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
uint8_t core_util_atomic_exchange_u8(volatile uint8_t *ptr, uint8_t desiredValue)
 | 
			
		||||
{
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint16_t core_util_atomic_exchange_u16(volatile uint16_t *ptr, uint16_t desiredValue)
 | 
			
		||||
{
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t core_util_atomic_exchange_u32(volatile uint32_t *ptr, uint32_t desiredValue)
 | 
			
		||||
{
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
uint8_t core_util_atomic_incr_u8(volatile uint8_t *valuePtr, uint8_t delta)
 | 
			
		||||
{
 | 
			
		||||
    return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -112,6 +128,11 @@ void core_util_atomic_store_u64(volatile uint64_t *valuePtr, uint64_t desiredVal
 | 
			
		|||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint64_t core_util_atomic_exchange_u64(volatile uint64_t *valuePtr, uint64_t desiredValue)
 | 
			
		||||
{
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool core_util_atomic_cas_u64(volatile uint64_t *ptr, uint64_t *expectedCurrentValue, uint64_t desiredValue)
 | 
			
		||||
{
 | 
			
		||||
    return false;
 | 
			
		||||
| 
						 | 
				
			
			@ -133,6 +154,11 @@ bool core_util_atomic_cas_ptr(void *volatile *ptr, void **expectedCurrentValue,
 | 
			
		|||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void *core_util_atomic_exchange_ptr(void *volatile *valuePtr, void *desiredValue)
 | 
			
		||||
{
 | 
			
		||||
    return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void *core_util_atomic_incr_ptr(void *volatile *valuePtr, ptrdiff_t delta)
 | 
			
		||||
{
 | 
			
		||||
    return NULL;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -167,6 +167,39 @@ bool core_util_atomic_cas_u32(volatile uint32_t *ptr, uint32_t *expectedCurrentV
 | 
			
		|||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t core_util_atomic_exchange_u8(volatile uint8_t *valuePtr, uint8_t desiredValue)
 | 
			
		||||
{
 | 
			
		||||
    MBED_BARRIER();
 | 
			
		||||
    uint8_t currentValue;
 | 
			
		||||
    do {
 | 
			
		||||
        currentValue = __LDREXB(valuePtr);
 | 
			
		||||
    } while (__STREXB(desiredValue, valuePtr));
 | 
			
		||||
    MBED_BARRIER();
 | 
			
		||||
    return currentValue;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint16_t core_util_atomic_exchange_u16(volatile uint16_t *valuePtr, uint16_t desiredValue)
 | 
			
		||||
{
 | 
			
		||||
    MBED_BARRIER();
 | 
			
		||||
    uint16_t currentValue;
 | 
			
		||||
    do {
 | 
			
		||||
        currentValue = __LDREXH(valuePtr);
 | 
			
		||||
    } while (__STREXH(desiredValue, valuePtr));
 | 
			
		||||
    MBED_BARRIER();
 | 
			
		||||
    return currentValue;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t core_util_atomic_exchange_u32(volatile uint32_t *valuePtr, uint32_t desiredValue)
 | 
			
		||||
{
 | 
			
		||||
    MBED_BARRIER();
 | 
			
		||||
    uint32_t currentValue;
 | 
			
		||||
    do {
 | 
			
		||||
        currentValue = __LDREXW(valuePtr);
 | 
			
		||||
    } while (__STREXW(desiredValue, valuePtr));
 | 
			
		||||
    MBED_BARRIER();
 | 
			
		||||
    return currentValue;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t core_util_atomic_incr_u8(volatile uint8_t *valuePtr, uint8_t delta)
 | 
			
		||||
{
 | 
			
		||||
    MBED_BARRIER();
 | 
			
		||||
| 
						 | 
				
			
			@ -298,6 +331,34 @@ bool core_util_atomic_cas_u32(volatile uint32_t *ptr, uint32_t *expectedCurrentV
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
uint8_t core_util_atomic_exchange_u8(volatile uint8_t *ptr, uint8_t desiredValue)
 | 
			
		||||
{
 | 
			
		||||
    core_util_critical_section_enter();
 | 
			
		||||
    uint8_t currentValue = *ptr;
 | 
			
		||||
    *ptr = desiredValue;
 | 
			
		||||
    core_util_critical_section_exit();
 | 
			
		||||
    return currentValue;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint16_t core_util_atomic_exchange_u16(volatile uint16_t *ptr, uint16_t desiredValue)
 | 
			
		||||
{
 | 
			
		||||
    core_util_critical_section_enter();
 | 
			
		||||
    uint16_t currentValue = *ptr;
 | 
			
		||||
    *ptr = desiredValue;
 | 
			
		||||
    core_util_critical_section_exit();
 | 
			
		||||
    return currentValue;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t core_util_atomic_exchange_u32(volatile uint32_t *ptr, uint32_t desiredValue)
 | 
			
		||||
{
 | 
			
		||||
    core_util_critical_section_enter();
 | 
			
		||||
    uint32_t currentValue = *ptr;
 | 
			
		||||
    *ptr = desiredValue;
 | 
			
		||||
    core_util_critical_section_exit();
 | 
			
		||||
    return currentValue;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
uint8_t core_util_atomic_incr_u8(volatile uint8_t *valuePtr, uint8_t delta)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t newValue;
 | 
			
		||||
| 
						 | 
				
			
			@ -377,6 +438,15 @@ void core_util_atomic_store_u64(volatile uint64_t *valuePtr, uint64_t desiredVal
 | 
			
		|||
    core_util_critical_section_exit();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint64_t core_util_atomic_exchange_u64(volatile uint64_t *valuePtr, uint64_t desiredValue)
 | 
			
		||||
{
 | 
			
		||||
    core_util_critical_section_enter();
 | 
			
		||||
    uint64_t currentValue = *valuePtr;
 | 
			
		||||
    *valuePtr = desiredValue;
 | 
			
		||||
    core_util_critical_section_exit();
 | 
			
		||||
    return currentValue;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool core_util_atomic_cas_u64(volatile uint64_t *ptr, uint64_t *expectedCurrentValue, uint64_t desiredValue)
 | 
			
		||||
{
 | 
			
		||||
    bool success;
 | 
			
		||||
| 
						 | 
				
			
			@ -414,6 +484,8 @@ uint64_t core_util_atomic_decr_u64(volatile uint64_t *valuePtr, uint64_t delta)
 | 
			
		|||
    return newValue;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
MBED_STATIC_ASSERT(sizeof(void *) == sizeof(uint32_t), "Alas, pointers must be 32-bit");
 | 
			
		||||
 | 
			
		||||
bool core_util_atomic_cas_ptr(void *volatile *ptr, void **expectedCurrentValue, void *desiredValue)
 | 
			
		||||
{
 | 
			
		||||
    return core_util_atomic_cas_u32(
 | 
			
		||||
| 
						 | 
				
			
			@ -422,6 +494,11 @@ bool core_util_atomic_cas_ptr(void *volatile *ptr, void **expectedCurrentValue,
 | 
			
		|||
               (uint32_t)desiredValue);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void *core_util_atomic_exchange_ptr(void *volatile *valuePtr, void *desiredValue)
 | 
			
		||||
{
 | 
			
		||||
    return (void *)core_util_atomic_exchange_u32((volatile uint32_t *)valuePtr, (uint32_t)desiredValue);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void *core_util_atomic_incr_ptr(void *volatile *valuePtr, ptrdiff_t delta)
 | 
			
		||||
{
 | 
			
		||||
    return (void *)core_util_atomic_incr_u32((volatile uint32_t *)valuePtr, (uint32_t)delta);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -354,6 +354,57 @@ MBED_FORCEINLINE void core_util_atomic_store_ptr(void *volatile *valuePtr, void
 | 
			
		|||
    MBED_BARRIER();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Atomic exchange.
 | 
			
		||||
 * @param  valuePtr     Target memory location.
 | 
			
		||||
 * @param  desiredValue The value to store.
 | 
			
		||||
 * @return              The previous value.
 | 
			
		||||
 */
 | 
			
		||||
uint8_t core_util_atomic_exchange_u8(volatile uint8_t *valuePtr, uint8_t desiredValue);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Atomic exchange.
 | 
			
		||||
 * @param  valuePtr     Target memory location.
 | 
			
		||||
 * @param  desiredValue The value to store.
 | 
			
		||||
 * @return              The previous value.
 | 
			
		||||
 */
 | 
			
		||||
uint16_t core_util_atomic_exchange_u16(volatile uint16_t *valuePtr, uint16_t desiredValue);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Atomic exchange.
 | 
			
		||||
 * @param  valuePtr     Target memory location.
 | 
			
		||||
 * @param  desiredValue The value to store.
 | 
			
		||||
 * @return              The previous value.
 | 
			
		||||
 */
 | 
			
		||||
uint32_t core_util_atomic_exchange_u32(volatile uint32_t *valuePtr, uint32_t desiredValue);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Atomic exchange.
 | 
			
		||||
 * @param  valuePtr     Target memory location.
 | 
			
		||||
 * @param  desiredValue The value to store.
 | 
			
		||||
 * @return              The previous value.
 | 
			
		||||
 */
 | 
			
		||||
uint64_t core_util_atomic_exchange_u64(volatile uint64_t *valuePtr, uint64_t desiredValue);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Atomic exchange.
 | 
			
		||||
 * @param  valuePtr     Target memory location.
 | 
			
		||||
 * @param  desiredValue The value to store.
 | 
			
		||||
 * @return              The previous value.
 | 
			
		||||
 */
 | 
			
		||||
MBED_FORCEINLINE bool core_util_atomic_exchange_bool(volatile bool *valuePtr, bool desiredValue)
 | 
			
		||||
{
 | 
			
		||||
    return (bool)core_util_atomic_exchange_u8((volatile uint8_t *)valuePtr, desiredValue);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Atomic exchange.
 | 
			
		||||
 * @param  valuePtr     Target memory location.
 | 
			
		||||
 * @param  desiredValue The value to store.
 | 
			
		||||
 * @return              The previous value.
 | 
			
		||||
 */
 | 
			
		||||
void *core_util_atomic_exchange_ptr(void *volatile *valuePtr, void *desiredValue);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Atomic increment.
 | 
			
		||||
 * @param  valuePtr Target memory location being incremented.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue