Viewing file: atomics-1.C (1.54 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* { dg-do link { target c++11 } } */ /* { dg-final { simulate-thread } } */ /* { dg-require-effective-target sync_char_short } */ /* { dg-require-effective-target sync_int_long } */
/* Test that atomic int and atomic char work properly. */
using namespace std;
#include <atomic> #include <limits.h> #include <stdio.h> #include "simulate-thread.h"
atomic<int> atomi; atomic<char> atomc;
/* No need for parallel threads to do anything */ void simulate_thread_other_threads() { }
/* Verify after every instruction is executed, that the atmoic int and char have one of the 2 legitimate values. */ int simulate_thread_step_verify() { if (atomi != 0 && atomi != INT_MAX) { printf ("FAIL: invalid intermediate result for atomi (%d).\n", (int)atomi); return 1; } if (atomc != 0 && atomc != CHAR_MAX) { printf ("FAIL: invalid intermediate result for atomc (%d).\n", (int)atomc); return 1; } return 0; }
/* Verify that both atmoics have the corerct value. */ int simulate_thread_final_verify() { if (atomi != INT_MAX) { printf ("FAIL: invalid final result for atomi (%d).\n", (int)atomi); return 1; } if (atomc != CHAR_MAX) { printf ("FAIL: invalid final result for atomc (%d).\n", (int)atomc); return 1; } return 0; }
/* Test a store to an atomic int and an atomic char. */ __attribute__((noinline)) void simulate_thread_main() { atomi = INT_MAX; atomc = CHAR_MAX; }
int main () { simulate_thread_main(); simulate_thread_done(); return 0; }
|