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