#
# For a description of the syntax of this configuration file,
# see the file kconfig-language.txt in the NuttX tools repository.
#

menu "Thread Local Storage (TLS)"

config TLS_ALIGNED
	bool "Require stack alignment"
	default BUILD_KERNEL
	---help---
		Aligned TLS works by fetching thread information from the beginning
		of the stack memory allocation.  In order to do this, the memory
		must be aligned in such a way that the executing logic can simply
		mask the current stack pointer to get the beginning of the stack
		allocation.

		The advantage of using an aligned stack is no OS interface need
		be called to get the beginning of the stack.  It is simply an
		AND operation on the current stack pointer.  The disadvantages
		are that the alignment (1) causes memory fragmentation which can
		be a serious problem for memory limited systems, and (2) limits
		the maximum size of the stack.  Any mask places a limit on the
		maximum size of the stack; stack sizes about that would map to
		an incorrect address.

		In general, CONFIG_TLS_ALIGNED is preferred for the KERNEL
		build where the virtualized stack address can be aligned with
		no implications to physical memory.  In other builds, the
		unaligned stack implementation is usually superior.

config TLS_LOG2_MAXSTACK
	int "Maximum stack size (log2)"
	default 13
	range 11 24
	depends on TLS_ALIGNED
	---help---
		This setting specifies the alignment of the stack as a power of 2:
		11=2KB, 12=4KB, 13=8KB, etc.  The exact alignment is not so critical
		except that (1) a very large value can cause you to run out of
		alignable memory (and fail memory allocations), and (2) smaller
		values will limit the maximum size of the stack (hence the naming
		of this configuration value).

config TLS_NELEM
	int "Number of TLS elements"
	depends on !DISABLE_PTHREAD
	default 0
	range 0 255
	---help---
		The number of unique TLS elements.  These can be accessed with
		the user library functions tls_get_value() and tls_set_value()
		and the OS interfaces tls_alloc() and tls_free().

		NOTE that the special value of CONFIG_TLS_NELEM disables these
		TLS interfaces.

config TLS_TASK_NELEM
	int "Number of Task Local Storage elements"
	depends on !BUILD_KERNEL
	default 0
	range 0 255
	---help---
		The number of unique Task Local Storage elements similar with
		Thread Local Storage.
		These can be accessed with task_tls_alloc/task_tls_get_value/task_tls_set_value.
		NOTE that the 0 value of CONFIG_SCHED_TLS_NELEM disables these
		TLS interfaces.

config TLS_NCLEANUP
	int "Number of cleanup stack levels"
	default 0
	range 0 255
	---help---
		The number of cleanup stack levels.  These are used to support
		POSIX pthread cancellation.  The number of cleanup stack levels
		is the maximum number of pthread_cleanup_push() calls that can
		be made without a corresponding pthread_cleanup_pop() call.

endmenu # Thread Local Storage (TLS)
