14115c71674415d9a1c92f81913950ca94c0b135ebart/* 24115c71674415d9a1c92f81913950ca94c0b135ebart * Test program that uses std::string object from more than one thread and 34115c71674415d9a1c92f81913950ca94c0b135ebart * that also triggers a call to __GI_strlen() (from inside strdup()). See also 44115c71674415d9a1c92f81913950ca94c0b135ebart * https://bugs.kde.org/show_bug.cgi?id=326091. 54115c71674415d9a1c92f81913950ca94c0b135ebart */ 64115c71674415d9a1c92f81913950ca94c0b135ebart 74115c71674415d9a1c92f81913950ca94c0b135ebart#include <list> 84115c71674415d9a1c92f81913950ca94c0b135ebart#include <string> 94115c71674415d9a1c92f81913950ca94c0b135ebart#include <cstring> 104115c71674415d9a1c92f81913950ca94c0b135ebart#include <pthread.h> 118eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#include <stdlib.h> 124115c71674415d9a1c92f81913950ca94c0b135ebart#include <unistd.h> 134115c71674415d9a1c92f81913950ca94c0b135ebart 144115c71674415d9a1c92f81913950ca94c0b135ebartchar* list2byteArray() 154115c71674415d9a1c92f81913950ca94c0b135ebart{ 164115c71674415d9a1c92f81913950ca94c0b135ebart size_t data_size = 24; 174115c71674415d9a1c92f81913950ca94c0b135ebart char *data = new char[data_size]; 184115c71674415d9a1c92f81913950ca94c0b135ebart for (size_t i = 0; i < data_size; i++) 194115c71674415d9a1c92f81913950ca94c0b135ebart data[i] = 'a'; 204115c71674415d9a1c92f81913950ca94c0b135ebart data[data_size - 1] = 0; 214115c71674415d9a1c92f81913950ca94c0b135ebart char *ret = strdup(data); 224115c71674415d9a1c92f81913950ca94c0b135ebart delete[] data; 234115c71674415d9a1c92f81913950ca94c0b135ebart return ret; 244115c71674415d9a1c92f81913950ca94c0b135ebart} 254115c71674415d9a1c92f81913950ca94c0b135ebart 264115c71674415d9a1c92f81913950ca94c0b135ebartint addRecord() 274115c71674415d9a1c92f81913950ca94c0b135ebart{ 284115c71674415d9a1c92f81913950ca94c0b135ebart char *data = list2byteArray(); 294115c71674415d9a1c92f81913950ca94c0b135ebart usleep(100); 304115c71674415d9a1c92f81913950ca94c0b135ebart free(data); 314115c71674415d9a1c92f81913950ca94c0b135ebart return 0; 324115c71674415d9a1c92f81913950ca94c0b135ebart} 334115c71674415d9a1c92f81913950ca94c0b135ebart 344115c71674415d9a1c92f81913950ca94c0b135ebartvoid *fillTable(void *ptr) 354115c71674415d9a1c92f81913950ca94c0b135ebart{ 364115c71674415d9a1c92f81913950ca94c0b135ebart for (int i = 0; i < 100; i++) { 374115c71674415d9a1c92f81913950ca94c0b135ebart std::string id("000"); 384115c71674415d9a1c92f81913950ca94c0b135ebart id.append(1, 'a' + i); 394115c71674415d9a1c92f81913950ca94c0b135ebart std::list<std::string> record; 404115c71674415d9a1c92f81913950ca94c0b135ebart record.push_back("some data"); 414115c71674415d9a1c92f81913950ca94c0b135ebart addRecord(); 424115c71674415d9a1c92f81913950ca94c0b135ebart } 434115c71674415d9a1c92f81913950ca94c0b135ebart usleep(1000 * 1000); 444115c71674415d9a1c92f81913950ca94c0b135ebart return NULL; 454115c71674415d9a1c92f81913950ca94c0b135ebart} 464115c71674415d9a1c92f81913950ca94c0b135ebart 474115c71674415d9a1c92f81913950ca94c0b135ebartint main(int argc, char* argv[]) 484115c71674415d9a1c92f81913950ca94c0b135ebart{ 494115c71674415d9a1c92f81913950ca94c0b135ebart pthread_t thread[2]; 504115c71674415d9a1c92f81913950ca94c0b135ebart 514115c71674415d9a1c92f81913950ca94c0b135ebart for (int i = 0; i < sizeof(thread)/sizeof(thread[0]); i++) { 524115c71674415d9a1c92f81913950ca94c0b135ebart int ret = pthread_create(&thread[i], NULL, &fillTable, NULL); 534115c71674415d9a1c92f81913950ca94c0b135ebart if (ret) { 544115c71674415d9a1c92f81913950ca94c0b135ebart fprintf(stderr, "Failed to create thread %d: %d\n", i, ret); 554115c71674415d9a1c92f81913950ca94c0b135ebart return 1; 564115c71674415d9a1c92f81913950ca94c0b135ebart } 574115c71674415d9a1c92f81913950ca94c0b135ebart } 584115c71674415d9a1c92f81913950ca94c0b135ebart 594115c71674415d9a1c92f81913950ca94c0b135ebart for (int i = 0; i < sizeof(thread)/sizeof(thread[0]); i++) { 604115c71674415d9a1c92f81913950ca94c0b135ebart int ret = pthread_join(thread[i], NULL); 614115c71674415d9a1c92f81913950ca94c0b135ebart if (ret != 0) { 624115c71674415d9a1c92f81913950ca94c0b135ebart fprintf(stderr, "Failed to join thread %d: %d\n", i, ret); 634115c71674415d9a1c92f81913950ca94c0b135ebart return 1; 644115c71674415d9a1c92f81913950ca94c0b135ebart } 654115c71674415d9a1c92f81913950ca94c0b135ebart } 664115c71674415d9a1c92f81913950ca94c0b135ebart 674115c71674415d9a1c92f81913950ca94c0b135ebart return 0; 684115c71674415d9a1c92f81913950ca94c0b135ebart} 69