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

menu "Processing"

if !LOG_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_IMMEDIATE || USERSPACE)
	default 128
	help
	  Array is allocated on the stack.

if !LOG_IMMEDIATE

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 1024 if NO_OPTIMIZATIONS
	default 1024 if XTENSA
	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_IMMEDIATE

if LOG_MODE_DEFERRED

config LOG_DETECT_MISSED_STRDUP
	bool "Detect missed handling of transient strings"
	default y if !LOG_IMMEDIATE
	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 "Enable 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 # LOG_MODE_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"
	help
	  If enabled, logging may take more code size to get faster logging.
endif # LOG2

endif # !LOG_MINIMAL

endmenu
