# Copyright (c) 2017 Intel Corporation
# Copyright (c) 2023 Meta
# Copyright (c) 2024 Tenstorrent AI ULC
#
# SPDX-License-Identifier: Apache-2.0

menuconfig POSIX_THREADS
	bool "POSIX thread support"
	help
	  Select 'y' here to enable POSIX threads, mutexes, condition variables, and thread-specific
	  storage.

	  For more information please see
	  https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_subprofiles.html

if POSIX_THREADS

config POSIX_THREAD_THREADS_MAX
	int "Maximum number of POSIX threads"
	default 5
	help
	  Maximum simultaneously active threads in a POSIX application.

	  For more information, see
	  https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html

config MAX_PTHREAD_MUTEX_COUNT
	int "Maximum number of POSIX mutexes"
	default 5
	help
	  Maximum simultaneously active mutexes in a POSIX application.

config MAX_PTHREAD_COND_COUNT
	int "Maximum number of POSIX condition variables"
	default 5
	help
	  Maximum simultaneously active condition variables in a POSIX application.

config POSIX_THREAD_KEYS_MAX
	int "Maximum number of POSIX thread-specific-storage keys"
	default 5
	help
	  Maximum simultaneously active thread-specific-storage keys in a POSIX application.

	  For more information, see
	  https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html

config PTHREAD_RECYCLER_DELAY_MS
	int "Delay for reclaiming dynamic pthread stacks (ms)"
	default 100
	help
	  Prior to a POSIX thread terminating via k_thread_abort(), scheduled
	  work is added to the system workqueue (SWQ) so that any resources
	  allocated by the thread (e.g. thread stack from a pool or the heap)
	  can be released back to the system. Because resources are also freed
	  on calls to pthread_create() there is no need to worry about resource
	  starvation.

	  This option sets the number of milliseconds by which to defer
	  scheduled work.

	  Note: this option should be considered temporary and will likely be
	  removed once a more synchronous solution is available.

config POSIX_THREAD_ATTR_STACKADDR
	bool "Support getting and setting POSIX thread stack addresses"
	help
	  Enable this option to use pthread_attr_getstackaddr() and
	  pthread_attr_setstackaddr().

	  This option was removed in IEEE 1003.1-2017 in favour of
	  pthread_attr_getstack() and pthread_attr_setstack().

	  For more information, please see
	  https://pubs.opengroup.org/onlinepubs/009696799/functions/pthread_attr_getstackaddr.html
	  https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xsh_chap03.html
	  https://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_09_08

config POSIX_THREAD_ATTR_STACKSIZE
	bool "Support getting and setting POSIX thread stack sizes"
	help
	  Enable this option to use pthread_attr_getstacksize() or
	  pthread_attr_setstacksize().

	  For more information, please see
	  https://pubs.opengroup.org/onlinepubs/009696699/functions/pthread_attr_getstacksize.html

config POSIX_THREADS_EXT
	bool "Extended POSIX thread support"
	help
	  Enable this option to use pthread_attr_getguardsize(), pthread_attr_setguardsize(),
	  pthread_mutexattr_gettype(), or pthread_mutexattr_settype().

	  For more information, please see
	  https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_subprofiles.html

config POSIX_THREAD_PRIORITY_SCHEDULING
	bool "Run POSIX threads with different priorities and schedulers"
	help
	  Enabling this option allows the application to configure different priorities and
	  scheduling algorithms for different threads via functions such as pthread_setschedparam()
	  and pthread_setschedprio(). This is required for Realtime Threads and Advanced Realtime
	  Threads.

	  For more information, please see
	  https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap02.html#tag_02_01_06
	  https://man7.org/linux/man-pages/man7/posixoptions.7.html

config POSIX_PTHREAD_ATTR_STACKSIZE_BITS
	int "Significant bits for pthread_attr_t stacksize"
	range 8 31
	default 23
	help
	  This value plays a part in determining the maximum supported
	  pthread_attr_t stacksize. Valid stacksizes are in the range
	  [1, N], where N = 1 << M, and M is this configuration value.

config POSIX_PTHREAD_ATTR_GUARDSIZE_BITS
	int "Significant bits for pthread_attr_t guardsize"
	range 1 31
	default 9
	help
	  This value plays a part in determining the maximum supported
	  pthread_attr_t guardsize. Valid guardsizes are in the range
	  [0, N-1], where N = 1 << M, and M is this configuration value.

	  Actual guardsize values may be rounded-up.

config POSIX_PTHREAD_ATTR_GUARDSIZE_DEFAULT
	int "Default size of stack guard area"
	default 0
	help
	  This is the default amount of space to reserve at the overflow end of a
	  pthread stack. Since Zephyr already supports both software-based stack
	  protection (canaries) and hardware-based stack protection (MMU or MPU),
	  this is set to 0 by default. However, a conforming application would be
	  required to set this to PAGESIZE. Eventually, this option might
	  facilitate a more dynamic approach to guard areas (via software or
	  hardware) but for now it simply increases the size of thread stacks.

config POSIX_THREAD_PRIO_INHERIT
	bool "POSIX mutex priority inheritance"
	help
	  Select 'y' here to enable POSIX mutex priority inheritance.

	  For more information, please see
	  https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_getprotocol.html

config POSIX_THREAD_PRIO_PROTECT
	bool "POSIX mutex priority protection"
	help
	  Select 'y' here to enable POSIX mutex priority protection.

	  For more information, please see
	  https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_getprotocol.html

config POSIX_THREAD_SAFE_FUNCTIONS
	bool "POSIX thread-safe functions"
	select POSIX_FILE_SYSTEM_R if POSIX_FILE_SYSTEM
	select POSIX_C_LANG_SUPPORT_R
	help
	  Select 'y' here to enable POSIX thread-safe functions including asctime_r(), ctime_r(),
	  flockfile(), ftrylockfile(), funlockfile(), getc_unlocked(), getchar_unlocked(),
	  getgrgid_r(), getgrnam_r(), getpwnam_r(), getpwuid_r(), gmtime_r(), localtime_r(),
	  putc_unlocked(), putchar_unlocked(), rand_r(), readdir_r(), strerror_r(), and strtok_r().

	  For more information, please see
	  https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xsh_chap02.html#tag_22_02_09_07

module = PTHREAD
module-str = POSIX thread
source "subsys/logging/Kconfig.template.log_config"

module = PTHREAD_MUTEX
module-str = POSIX mutex
source "subsys/logging/Kconfig.template.log_config"

module = PTHREAD_COND
module-str = POSIX condition variable
source "subsys/logging/Kconfig.template.log_config"

module = PTHREAD_KEY
module-str = POSIX thread-specific data
source "subsys/logging/Kconfig.template.log_config"

endif # POSIX_THREADS
