/* * 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; }