diff --git a/mysys/my_stack.c b/mysys/my_stack.c index 3eec01092ac..b32925c8f6c 100644 --- a/mysys/my_stack.c +++ b/mysys/my_stack.c @@ -40,56 +40,36 @@ extern void my_get_stack_bounds(void **stack_start, void **stack_end, void *fallback_stack_start, size_t fallback_stack_size) { -#if defined(__GNUC__) || defined(__clang__) /* GCC or Clang compilers */ size_t stack_size; -#if defined(HAVE_PTHREAD_GETATTR_NP) +#if defined(HAVE_PTHREAD_GETATTR_NP) && !defined(_AIX) /* POSIX-compliant system (Linux, macOS, etc.) */ pthread_attr_t attr; pthread_t thread= pthread_self(); - void *stack_base; /* Get the thread attributes */ if (pthread_getattr_np(thread, &attr) == 0) { /* Get stack base and size */ - pthread_attr_getstack(&attr, &stack_base, &stack_size); - /* - stack_base points to start of the stack region to which the - stack grows to - */ - *stack_start= stack_base - stack_size * STACK_DIRECTION; - pthread_attr_destroy(&attr); /* Clean up */ - } - else - { - /* - Fallback: - Use the current stack pointer as an approximation of the start - */ - *stack_start= my_get_stack_pointer(fallback_stack_start); - stack_size= (fallback_stack_size - - MY_MIN(fallback_stack_size, MY_STACK_SAFE_MARGIN)); - } + void *low_addr, *high_addr= NULL; + if (pthread_attr_getstack(&attr, &low_addr, &stack_size) == 0) + { + high_addr= (char *) low_addr + stack_size; +#if STACK_DIRECTION < 0 + *stack_start= high_addr; + *stack_end= low_addr; #else - /* Platform does not have pthread_getattr_np */ + *stack_start= low_addr; + *stack_end= high_addr; +#endif + } + pthread_attr_destroy(&attr); /* Clean up */ + if (high_addr) + return; + } +#endif + /* Platform does not have pthread_getattr_np, or fallback */ *stack_start= my_get_stack_pointer(fallback_stack_start); stack_size= (fallback_stack_size - MY_MIN(fallback_stack_size, MY_STACK_SAFE_MARGIN)); -#endif /* defined(HAVE_PTHREAD_GETATTR_NP) */ - *stack_end= *stack_start + stack_size * STACK_DIRECTION; - -#elif defined(_MSC_VER) && defined(_WIN32) - /* Windows platform (MSVC) */ - NT_TIB* teb= (NT_TIB*)NtCurrentTeb(); - - *stack_start= teb->StackBase; /* Start of the stack */ - *stack_end= teb->StackLimit; /* End of the stack (stack limit) */ -#else - /* Unsupported platform / compiler */ - *stack_start= my_get_stack_pointer(fallback_stack_start); - *stack_end= (*stack_start + - (fallback_stack_size - - MY_MIN(fallback_stack_size, MY_STACK_SAFE_MARGIN)) * - STACK_DIRECTON); -#endif /* defined(__GNUC__) || defined(__clang__) */ + *stack_end= (char *)(*stack_start) + stack_size * STACK_DIRECTION; }