Files
rtems/testsuites/smptests/smpatomic01/tasks.c
Sebastian Huber 29f7d31782 score: Use unsigned long for atomic integers
Use unsigned long instead of uint_fast32_t since C11 provides only a
ATOMIC_LONG_LOCK_FREE macro constant.  This makes it also possible to
use properly typed integer literals like 123UL.  It is now clear which
compatible type should be used for the atomic integer.
2013-09-03 11:07:36 +02:00

74 lines
2.2 KiB
C

/*
* Copyright (c) 2012 Deng Hengyi.
*
* This test case is to test atomic load operation.
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.com/license/LICENSE.
*
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "system.h"
#include <stdlib.h>
#include <rtems/rtems/atomic.h>
#define TEST_REPEAT 1000
#define ATOMIC_LOAD_NO_BARRIER(NAME, TYPE, R_TYPE, cpuid, mem_bar) \
{ \
Atomic_##TYPE t; \
R_TYPE a; \
R_TYPE b; \
unsigned int i; \
for (i = 0; i < TEST_REPEAT; i++){ \
b = (R_TYPE)rand(); \
atomic_init(&t, b); \
a = _Atomic_Load_##NAME(&t, mem_bar); \
rtems_test_assert(a == b); \
} \
locked_printf("\nCPU%d Atomic_Load_" #NAME ": SUCCESS\n", cpuid); \
}
rtems_task Test_task(
rtems_task_argument argument
)
{
uint32_t cpu_num;
char name[5];
char *p;
/* Get the task name */
p = rtems_object_get_name( RTEMS_SELF, 5, name );
rtems_test_assert( p != NULL );
/* Get the CPU Number */
cpu_num = rtems_smp_get_current_processor();
/* Print that the task is up and running. */
/* test relaxed barrier */
ATOMIC_LOAD_NO_BARRIER(ulong, Ulong, unsigned long, cpu_num, ATOMIC_ORDER_RELAXED);
ATOMIC_LOAD_NO_BARRIER(ptr, Pointer, uintptr_t, cpu_num, ATOMIC_ORDER_RELAXED);
/* test acquire barrier */
ATOMIC_LOAD_NO_BARRIER(ulong, Ulong, unsigned long, cpu_num, ATOMIC_ORDER_ACQUIRE);
ATOMIC_LOAD_NO_BARRIER(ptr, Pointer, unsigned long, cpu_num, ATOMIC_ORDER_ACQUIRE);
// ATOMIC_LOAD_NO_BARRIER(64, cpu_num);
/* Set the flag that the task is up and running */
TaskRan[cpu_num] = true;
/* Drop into a loop which will keep this task on
* running on the cpu.
*/
while(1);
}