blob: b3b84f6bc92b168785ce5abb06c7796165d7ae5b [file] [log] [blame]
/// Test program that uses the QAtomicInt class.
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include "config.h"
#include <QAtomicInt> // class QAtomicInt
#include <cassert>
#include <cstdio> // fprintf()
#include <cstdlib> // atoi()
#include <new>
#include <pthread.h> // pthread_barrier_t
#include <vector>
static pthread_barrier_t s_barrier;
static QAtomicInt* s_pAtomicInt;
void* thread_func(void* pArg)
{
const int iArg = *reinterpret_cast<int*>(pArg);
pthread_barrier_wait(&s_barrier);
while (! s_pAtomicInt->testAndSetOrdered(iArg, iArg + 1))
;
return NULL;
}
int main(int argc, char** argv)
{
int i;
const int n_threads = 10;
std::vector<int> thread_arg(n_threads);
std::vector<pthread_t> tid(n_threads);
fprintf(stderr, "Start of test.\n");
pthread_barrier_init(&s_barrier, 0, n_threads);
s_pAtomicInt = new QAtomicInt();
for (i = 0; i < n_threads; i++)
{
thread_arg[i] = i;
pthread_create(&tid[i], 0, thread_func, &thread_arg[i]);
}
for (i = 0; i < n_threads; i++)
{
pthread_join(tid[i], NULL);
}
pthread_barrier_destroy(&s_barrier);
if (*s_pAtomicInt == n_threads)
fprintf(stderr, "Test successful.\n");
else
fprintf(stderr, "Test failed: counter = %d, should be %d\n",
static_cast<int>(*s_pAtomicInt), n_threads);
delete s_pAtomicInt;
s_pAtomicInt = 0;
return 0;
}