| // Copyright 2019 The Emscripten Authors. All rights reserved. | |
| // Emscripten is available under two separate licenses, the MIT license and the | |
| // University of Illinois/NCSA Open Source License. Both these licenses can be | |
| // found in the LICENSE file. | |
| pthread_t threads[50]; | |
| static void *thread_start(void *arg) { | |
| // This thread quits immediately... | |
| pthread_exit((void*)0); | |
| } | |
| void CreateThread(intptr_t idx) { | |
| int rc = pthread_create(&threads[idx], NULL, thread_start, (void*)idx); | |
| assert(rc == 0); | |
| } | |
| void JoinThread(int idx) { | |
| int rc = pthread_join(threads[idx], NULL); | |
| assert(rc == 0); | |
| } | |
| int main() { | |
| // This test should be run with a prewarmed pool of size 50. They should be fully allocated. | |
| assert(EM_ASM_INT(return PThread.unusedWorkers.length) == 50); | |
| double total = 0; | |
| for (int i = 0; i < 10; ++i) { | |
| double t1 = emscripten_get_now(); | |
| for (int j = 0; j < 50; ++j) { | |
| CreateThread(j); | |
| } | |
| double t2 = emscripten_get_now(); | |
| printf("Took %f ms to allocate 50 threads.\n", t2 - t1); | |
| total += (t2 - t1); | |
| // Join all the threads to clear the queue.. | |
| for (int j = 0; j < 50; ++j) { | |
| JoinThread(j); | |
| } | |
| } | |
| printf("Final average %f ms.\n", total / 10.0); | |
| return 0; | |
| } | |