# 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.

config LOG_PRINTK_MAX_STRING_LENGTH
	int "Maximum string length supported by LOG_PRINTK"
	depends on LOG_PRINTK
	depends on (!LOG_MODE_IMMEDIATE || USERSPACE)
	depends on LOG1
	default 128
	help
	  Array is allocated on the stack.

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.

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 LOG1_DEFERRED

config LOG_DETECT_MISSED_STRDUP
	bool "Detect missed handling of transient strings"
	default y
	help
	  If enabled, logger will assert and log error message is it detects
	  that string format specifier (%s) and string address which is not from
	  read only memory section and not from pool used for string duplicates.
	  String argument must be duplicated in that case using log_strdup().
	  Detection is performed during log processing thus it does not impact
	  logging timing.

config LOG_STRDUP_MAX_STRING
	int "Longest string that can be duplicated using log_strdup()"
	range 1 8192
	default 66 if BT
	default 46 if NETWORKING
	default 32
	help
	  Longer strings are truncated.

config LOG_STRDUP_BUF_COUNT
	int "Number of buffers in the pool used by log_strdup()"
	default 8 if BT
	default 4
	help
	  Number of calls to log_strdup() which can be pending before flushed
	  to output. If "<log_strdup alloc failed>" message is seen in the log
	  output, it means this value is too small and should be increased.
	  Each entry takes CONFIG_LOG_STRDUP_MAX_STRING bytes of memory plus
	  some additional fixed overhead.

config LOG_STRDUP_POOL_PROFILING
	bool "Profiling of pool used for log_strdup()"
	help
	  When enabled, maximal utilization of the pool is tracked. It can
	  be read out using shell command.

endif # LOG1_DEFERRED

if LOG2

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 # LOG2

endif # !LOG_MODE_MINIMAL

endmenu
