/*
* Test program that uses std::string object from more than one thread and
* that also triggers a call to __GI_strlen() (from inside strdup()). See also
* https://bugs.kde.org/show_bug.cgi?id=326091.
*/
#include <list>
#include <string>
#include <cstring>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
char* list2byteArray()
{
size_t data_size = 24;
char *data = new char[data_size];
for (size_t i = 0; i < data_size; i++)
data[i] = 'a';
data[data_size - 1] = 0;
char *ret = strdup(data);
delete[] data;
return ret;
}
int addRecord()
{
char *data = list2byteArray();
usleep(100);
free(data);
return 0;
}
void *fillTable(void *ptr)
{
for (int i = 0; i < 100; i++) {
std::string id("000");
id.append(1, 'a' + i);
std::list<std::string> record;
record.push_back("some data");
addRecord();
}
usleep(1000 * 1000);
return NULL;
}
int main(int argc, char* argv[])
{
pthread_t thread[2];
for (int i = 0; i < sizeof(thread)/sizeof(thread[0]); i++) {
int ret = pthread_create(&thread[i], NULL, &fillTable, NULL);
if (ret) {
fprintf(stderr, "Failed to create thread %d: %d\n", i, ret);
return 1;
}
}
for (int i = 0; i < sizeof(thread)/sizeof(thread[0]); i++) {
int ret = pthread_join(thread[i], NULL);
if (ret != 0) {
fprintf(stderr, "Failed to join thread %d: %d\n", i, ret);
return 1;
}
}
return 0;
}