From eccfa5e1e78f341545d04d5f1a8afd21de77868b Mon Sep 17 00:00:00 2001 From: Sebastian Sumpf Date: Tue, 24 Apr 2018 13:55:08 +0200 Subject: [PATCH] pthread: retrieve stack address and size issue #2791 --- repos/libports/src/lib/pthread/thread.cc | 29 ++++++++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/repos/libports/src/lib/pthread/thread.cc b/repos/libports/src/lib/pthread/thread.cc index 1ebd33c912..6ebe84835f 100644 --- a/repos/libports/src/lib/pthread/thread.cc +++ b/repos/libports/src/lib/pthread/thread.cc @@ -273,21 +273,40 @@ extern "C" { void **stackaddr, ::size_t *stacksize) { - /* FIXME */ - warning("pthread_attr_getstack() called, might not work correctly"); - if (!attr || !*attr || !stackaddr || !stacksize) return EINVAL; pthread_t pthread = (*attr)->pthread; - *stackaddr = pthread->stack_top(); - *stacksize = (addr_t)pthread->stack_top() - (addr_t)pthread->stack_base(); + if (pthread != pthread_self()) { + error("pthread_attr_getstack() called, where pthread != phtread_self"); + *stackaddr = nullptr; + *stacksize = 0; + return EINVAL; + } + + Thread::Stack_info info = Thread::mystack(); + *stackaddr = (void *)info.base; + *stacksize = info.top - info.base; return 0; } + int pthread_attr_getstackaddr(const pthread_attr_t *attr, void **stackaddr) + { + size_t stacksize; + return pthread_attr_getstack(attr, stackaddr, &stacksize); + } + + + int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize) + { + void *stackaddr; + return pthread_attr_getstack(attr, &stackaddr, stacksize); + } + + int pthread_attr_get_np(pthread_t pthread, pthread_attr_t *attr) { if (!attr)