# Copyright (c) 2021 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

menu "Processing"

if !LOG_MODE_MINIMAL

config LOG_PRINTK
	bool "Process printk messages"
	help
	  LOG_PRINTK messages are formatted in place and logged unconditionally.

if LOG_MODE_DEFERRED && !LOG_FRONTEND_ONLY

config LOG_MODE_OVERFLOW
	bool "Drop oldest message when full"
	default y
	help
	  If enabled, then if there is no space to log a new message, the
	  oldest one is dropped. If disabled, current message is dropped.

config LOG_BLOCK_IN_THREAD
	bool "Block in thread context on full"
	depends on MULTITHREADING
	help
	  When enabled logger will block (if in the thread context) when
	  internal logger buffer is full and new message cannot be allocated.

config LOG_BLOCK_IN_THREAD_TIMEOUT_MS
	int "Maximum time (in milliseconds) thread can be blocked"
	default 1000
	range -1 10000
	depends on LOG_BLOCK_IN_THREAD
	help
	  If new buffer for a log message cannot be allocated in that time, log
	  message is dropped. Forever blocking (-1) is possible however may lead
	  to the logger deadlock if logging is enabled in threads used for
	  logging (e.g. logger or shell thread).

config LOG_PROCESS_TRIGGER_THRESHOLD
	int "Number of buffered log messages before flushing"
	default 10
	depends on MULTITHREADING
	help
	  When number of buffered messages reaches the threshold thread is waken
	  up. Log processing thread ID is provided during log initialization.
	  Set 0 to disable the feature. If LOG_PROCESS_THREAD is enabled then
	  this threshold is used by the internal thread.

config LOG_PROCESS_THREAD
	bool "Use internal thread for log processing"
	depends on MULTITHREADING
	default y
	help
	  When enabled thread is created by the logger subsystem. Thread is
	  waken up periodically (see LOG_PROCESS_THREAD_SLEEP_MS) and whenever
	  number of buffered messages exceeds the threshold (see
	  LOG_PROCESS_TRIGGER_THR).

if LOG_PROCESS_THREAD

config LOG_PROCESS_THREAD_STARTUP_DELAY_MS
	int "Set log processing thread startup delay"
	default 0
	help
	  Log processing thread starts after requested delay given in
	  milliseconds. When started, thread process any buffered messages.

config LOG_PROCESS_THREAD_SLEEP_MS
	int "Set internal log processing thread sleep period"
	default 1000
	help
	  Log processing thread sleeps for requested period given in
	  milliseconds. When waken up, thread process any buffered messages.

config LOG_PROCESS_THREAD_STACK_SIZE
	int "Stack size for the internal log processing thread"
	default 4096 if (X86 && X86_64)
	default 4096 if ARM64
	default 4096 if (ARC && 64BIT)
	default 4096 if SPARC
	default 2048 if COVERAGE_GCOV
	default 2048 if (RISCV && 64BIT)
	default 2048 if LOG_BACKEND_FS
	default 1152 if LOG_BACKEND_NET
	default 4096 if NO_OPTIMIZATIONS
	default 1024 if XTENSA
	default 2048 if ASSERT || SPIN_VALIDATE
	default 768
	help
	  Set the internal stack size for log processing thread.

config LOG_PROCESSING_LATENCY_US
	int "Maximum remote message latency (in microseconds)"
	default 100000
	depends on LOG_MULTIDOMAIN
	help
	  Arbitrary time between log message creation in the remote domain and
	  processing in the local domain. Higher value increases message processing
	  latency but increases chances of maintaining correct ordering of the
	  messages. Option is used only if links are using dedicated buffers
	  for remote messages.

config LOG_PROCESS_THREAD_CUSTOM_PRIORITY
	bool "Custom log thread priority"
	help
	  Set a custom value for the log processing thread.

config LOG_PROCESS_THREAD_PRIORITY
	int "Priority of the log processing thread"
	default 0
	depends on LOG_PROCESS_THREAD_CUSTOM_PRIORITY
	help
	  The priority of the log processing thread.
	  When not set the prority is set to K_LOWEST_APPLICATION_THREAD_PRIO.

endif # LOG_PROCESS_THREAD

config LOG_BUFFER_SIZE
	int "Number of bytes dedicated for the logger internal buffer"
	default 1024
	range 128 65536
	help
	  Number of bytes dedicated for the logger internal buffer.

endif # LOG_MODE_DEFERRED && !LOG_FRONTEND_ONLY

if LOG_MULTIDOMAIN

config LOG_DOMAIN_NAME_CACHE_ENTRY_SIZE
	int "Cache slot size of domain name"
	default 8

config LOG_DOMAIN_NAME_CACHE_ENTRY_COUNT
	int "Number of entries in domain name cache"
	default 2

config LOG_SOURCE_NAME_CACHE_ENTRY_SIZE
	int "Cache slot size of source name"
	default 16

config LOG_SOURCE_NAME_CACHE_ENTRY_COUNT
	int "Number of entries in source name cache"
	default 8

endif # LOG_MULTIDOMAIN

config LOG_TRACE_SHORT_TIMESTAMP
	bool "Use 24 bit timestamp for tracing"
	default y
	help
	  When enabled, shorter timestamp is used and trace message is
	  compressed.

config LOG_TIMESTAMP_64BIT
	bool "Use 64 bit timestamp"

config LOG_SPEED
	bool "Prefer performance over size"
	depends on LOG_MODE_DEFERRED
	depends on !LOG_FRONTEND
	help
	  If enabled, logging may take more code size to get faster logging.

endif # !LOG_MODE_MINIMAL

endmenu
