# Copyright 2023 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

menu "pw_thread"

config PIGWEED_THREAD_SLEEP
    bool "Link and set pw_thread.sleep library backend"
    select PIGWEED_CHRONO_SYSTEM_CLOCK
    select PIGWEED_ASSERT
    help
      See :ref:`module-pw_thread` for module details.

config PIGWEED_THREAD
    bool "Link and set pw_thread.thread and pw_thread.id backends"
    select PIGWEED_ASSERT
    help
      See :ref:`module-pw_thread` for module details.

config PIGWEED_THREAD_ITERATION
    bool "Link and set pw_thread.thread_iteration backend"
    select PIGWEED_ASSERT
    select PIGWEED_THREAD
    help
      See :ref:`module-pw_thread` for module details.

if PIGWEED_THREAD

config PIGWEED_THREAD_DEFAULT_PRIORITY
  int "Default thread priority"
  default MAIN_THREAD_PRIORITY

config PIGWEED_THREAD_NUM_COOP_PRIORITIES
  int "Number of cooperative thread priorities"
  default NUM_COOP_PRIORITIES
  range 0 NUM_COOP_PRIORITIES

config PIGWEED_THREAD_NUM_PREEMPT_PRIORITIES
  int "Number of preemptible thread priorities"
  default NUM_PREEMPT_PRIORITIES
  range 0 NUM_PREEMPT_PRIORITIES

endif # PIGWEED_THREAD

endmenu
