1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* 2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov * Test program that uses std::string object from more than one thread and 3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov * that also triggers a call to __GI_strlen() (from inside strdup()). See also 4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov * https://bugs.kde.org/show_bug.cgi?id=326091. 5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <list> 8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <string> 9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <cstring> 10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <pthread.h> 11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <unistd.h> 12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovchar* list2byteArray() 14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov size_t data_size = 24; 16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov char *data = new char[data_size]; 17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for (size_t i = 0; i < data_size; i++) 18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov data[i] = 'a'; 19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov data[data_size - 1] = 0; 20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov char *ret = strdup(data); 21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov delete[] data; 22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return ret; 23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint addRecord() 26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov char *data = list2byteArray(); 28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov usleep(100); 29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov free(data); 30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return 0; 31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid *fillTable(void *ptr) 34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for (int i = 0; i < 100; i++) { 36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov std::string id("000"); 37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov id.append(1, 'a' + i); 38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov std::list<std::string> record; 39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov record.push_back("some data"); 40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addRecord(); 41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov usleep(1000 * 1000); 43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return NULL; 44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint main(int argc, char* argv[]) 47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov pthread_t thread[2]; 49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for (int i = 0; i < sizeof(thread)/sizeof(thread[0]); i++) { 51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov int ret = pthread_create(&thread[i], NULL, &fillTable, NULL); 52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (ret) { 53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fprintf(stderr, "Failed to create thread %d: %d\n", i, ret); 54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return 1; 55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for (int i = 0; i < sizeof(thread)/sizeof(thread[0]); i++) { 59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov int ret = pthread_join(thread[i], NULL); 60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (ret != 0) { 61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fprintf(stderr, "Failed to join thread %d: %d\n", i, ret); 62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return 1; 63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return 0; 67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 68