diff --git a/src/library_pthread.js b/src/library_pthread.js index 5f61840e164e..20e80bbd1d51 100644 --- a/src/library_pthread.js +++ b/src/library_pthread.js @@ -267,6 +267,8 @@ var LibraryPThread = { Atomics.store(HEAPU32, (pthread.threadInfoStruct + {{{ C_STRUCTS.pthread.pid }}} ) >> 2, PROCINFO.pid); // Process ID. Atomics.store(HEAPU32, (pthread.threadInfoStruct + {{{ C_STRUCTS.pthread.attr }}}) >> 2, threadParams.stackSize); + Atomics.store(HEAPU32, (pthread.threadInfoStruct + {{{ C_STRUCTS.pthread.stack_size }}}) >> 2, threadParams.stackSize); + Atomics.store(HEAPU32, (pthread.threadInfoStruct + {{{ C_STRUCTS.pthread.stack }}}) >> 2, threadParams.stackBase); Atomics.store(HEAPU32, (pthread.threadInfoStruct + {{{ C_STRUCTS.pthread.attr }}} + 8) >> 2, threadParams.stackBase); Atomics.store(HEAPU32, (pthread.threadInfoStruct + {{{ C_STRUCTS.pthread.attr }}} + 12) >> 2, threadParams.detached); Atomics.store(HEAPU32, (pthread.threadInfoStruct + {{{ C_STRUCTS.pthread.attr }}} + 20) >> 2, threadParams.schedPolicy); diff --git a/src/struct_info.json b/src/struct_info.json index 2adc060a96eb..f54034eba9a1 100644 --- a/src/struct_info.json +++ b/src/struct_info.json @@ -1544,6 +1544,8 @@ "tsd", "tsd_used", "detached", + "stack", + "stack_size", "attr", "tid", "pid", diff --git a/system/lib/pthread/library_pthread.c b/system/lib/pthread/library_pthread.c index ce02fc2f15c2..baf4f2c028b7 100644 --- a/system/lib/pthread/library_pthread.c +++ b/system/lib/pthread/library_pthread.c @@ -221,6 +221,15 @@ void pthread_testcancel() } } +int pthread_getattr_np(pthread_t t, pthread_attr_t *a) +{ + *a = (pthread_attr_t){0}; + a->_a_detach = !!t->detached; + a->_a_stackaddr = (uintptr_t)t->stack; + a->_a_stacksize = t->stack_size - DEFAULT_STACK_SIZE; + return 0; +} + static uint32_t dummyZeroAddress = 0; int usleep(unsigned usec) diff --git a/system/lib/pthreads.symbols b/system/lib/pthreads.symbols index 703fb1711788..753fdd10d8e7 100644 --- a/system/lib/pthreads.symbols +++ b/system/lib/pthreads.symbols @@ -179,6 +179,7 @@ T pthread_condattr_setclock T pthread_condattr_setpshared T pthread_equal + T pthread_getattr_np T pthread_getspecific T pthread_key_create T pthread_key_delete diff --git a/tests/pthread/test_pthread_create_pthread.cpp b/tests/pthread/test_pthread_create_pthread.cpp index 5e198cbcafbe..718bab2caeb9 100644 --- a/tests/pthread/test_pthread_create_pthread.cpp +++ b/tests/pthread/test_pthread_create_pthread.cpp @@ -9,7 +9,7 @@ volatile int result = 0; static void *thread2_start(void *arg) { EM_ASM(Module['print']('thread2_start!');); - result = 1; + ++result; #ifdef REPORT_RESULT REPORT_RESULT(); @@ -31,6 +31,16 @@ int main() { pthread_t thr; pthread_create(&thr, NULL, thread1_start, 0); + + pthread_attr_t attr; + pthread_getattr_np(thr, &attr); + size_t stack_size; + void *stack_addr; + pthread_attr_getstack(&attr, &stack_addr, &stack_size); + printf("stack_size: %d, stack_addr: %p\n", (int)stack_size, stack_addr); + if (stack_size != 81920 || stack_addr == 0) + result = -100; // Report failure. + // pthread_join(thr, 0); //#ifdef REPORT_RESULT