/*
* Test program that triggers strcpy() from one thread and a memory allocation
* immediately after the region read by strcpy() from another thread. Without
* strcpy() intercept there is about 50% chance that this test program triggers
* a false positive race report on Ubuntu 12.10 amd64.
*
* See also https://bugs.kde.org/show_bug.cgi?id=326436.
*/
#include <locale.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <string>
#include <sstream>
#include <list>
using namespace std;
class SubTest {
public:
SubTest() {
list<int *> ffList;
ffList.push_back((int *) NULL);
for (list<int*>::iterator ff = ffList.begin(); ff != ffList.end(); ff++) {
usleep(1000);
}
}
void subTest() {
list<int *> ffList;
ffList.push_back((int *) NULL);
for (list<int*>::const_iterator ff = ffList.begin(); ff != ffList.end(); ff++) {
usleep(1000);
}
}
};
class Test {
SubTest *subTest;
public:
void setUp() {
subTest = new SubTest();
setlocale(LC_ALL, "English");
}
void tearDown() {
delete subTest; }
void func1() {
for (size_t i = 0; i < 10000; i++) {
subTest->subTest();
usleep(1000);
}
}
void func2() {
usleep(1000);
}
};
void *func1(void *instance)
{
Test *casted = reinterpret_cast<Test*>(instance);
casted->setUp();
casted->func1();
casted->tearDown();
return NULL;
}
void *func2(void *instance)
{
Test *casted = reinterpret_cast<Test*>(instance);
casted->setUp();
casted->func2();
casted->tearDown();
return NULL;
}
int main(int argc, char* argv[])
{
int err;
pthread_t thread1;
pthread_t thread2;
Test instance1;
Test instance2;
// create
err = pthread_create(&thread1, NULL, &func1, &instance1);
if (err != 0)
throw string("failed to create a thread.");
err = pthread_create(&thread2, NULL, &func2, &instance2);
if (err != 0)
throw string("failed to create a thread.");
// join
err = pthread_join(thread1, NULL);
if (err != 0)
throw string("Thread::join(): failed to join.");
err = pthread_join(thread2, NULL);
if (err != 0)
throw string("Thread::join(): failed to join.");
}