tin  1.5.9
resources.h
Go to the documentation of this file.
1 // Copyright (c) 2026 Tinverse LLC. All rights reserved.
2 // SPDX-License-Identifier: LicenseRef-Tinverse-Commercial
3 
12 
13 #pragma once
14 
15 #include <cstddef>
16 
17 #include "tsm.h"
18 #include "tsm/runtime/coroutine.h"
19 
20 namespace tsm::runtime {
21 
23 {
24  std::size_t max_event_bytes{};
25  std::size_t max_event_alignment{};
26  std::size_t queue_slots{};
28  std::size_t task_count{};
29  std::size_t task_group_count{};
30  std::size_t task_group_entry_count{};
31  std::size_t task_arena_bytes{};
32  std::size_t task_timer_slots{};
33  bool uses_heap{};
34 };
35 
37 {
38  std::size_t max_event_bytes{};
39  std::size_t max_event_alignment{};
40  std::size_t queue_slots{};
42  std::size_t task_count{};
43  std::size_t task_group_count{};
44  std::size_t task_group_entry_count{};
45  std::size_t task_arena_bytes{};
46  std::size_t task_timer_slots{};
47  bool allow_heap{};
48 };
49 
50 [[nodiscard]] consteval bool
51 fits(resource_snapshot const& snapshot, resource_budget const& budget)
52 {
53  return snapshot.max_event_bytes <= budget.max_event_bytes &&
54  snapshot.max_event_alignment <= budget.max_event_alignment &&
55  snapshot.queue_slots <= budget.queue_slots &&
56  snapshot.delayed_event_timer_slots <=
58  snapshot.task_count <= budget.task_count &&
59  snapshot.task_group_count <= budget.task_group_count &&
61  snapshot.task_arena_bytes <= budget.task_arena_bytes &&
62  snapshot.task_timer_slots <= budget.task_timer_slots &&
63  (!snapshot.uses_heap || budget.allow_heap);
64 }
65 
66 namespace detail {
67 
68 template<typename Storage, typename = void>
69 struct storage_capacity
70 {
71  static constexpr std::size_t value = 0U;
72 };
73 
74 template<typename Storage>
75 struct storage_capacity<Storage, std::void_t<decltype(Storage::capacity)>>
76 {
77  static constexpr std::size_t value = Storage::capacity;
78 };
79 
80 } // namespace detail
81 
82 template<typename... Groups>
84 {
85  static constexpr std::size_t group_count = sizeof...(Groups);
86  static constexpr std::size_t entry_count = (Groups::size + ... + 0U);
87 };
88 
94 template<typename Runtime, std::size_t TimerSlots = 0U, typename... Groups>
96 {
98  using events = typename Runtime::events;
101 
102  static constexpr std::size_t max_event_bytes =
104  static constexpr std::size_t max_event_alignment =
106  static constexpr std::size_t queue_slots =
107  detail::storage_capacity<typename Runtime::policy::storage>::value;
108  static constexpr std::size_t delayed_event_timer_slots = TimerSlots;
109  static constexpr std::size_t task_count = task_summary::task_count;
110  static constexpr std::size_t task_group_count =
111  task_group_resources<Groups...>::group_count;
112  static constexpr std::size_t task_group_entry_count =
113  task_group_resources<Groups...>::entry_count;
114  static constexpr std::size_t task_arena_bytes = task_summary::arena_bytes;
115  static constexpr std::size_t task_timer_slots = task_summary::timer_slots;
116  static constexpr bool uses_heap = false;
117 
118  static consteval resource_snapshot snapshot()
119  {
122  queue_slots,
124  task_count,
129  uses_heap };
130  }
131 
132  static consteval bool fits_within(resource_budget const& budget)
133  {
134  return fits(snapshot(), budget);
135  }
136 };
137 
143 template<typename Runtime,
144  resource_budget Budget,
145  std::size_t TimerSlots = 0U,
146  typename... Groups>
148 {
149  using resources = runtime_resources<Runtime, TimerSlots, Groups...>;
150  static constexpr bool fits = resources::fits_within(Budget);
151 
152  static_assert(fits,
153  "tsm: runtime resource snapshot exceeds declared budget");
154 };
155 
162 template<typename Profile,
163  typename Runtime,
164  std::size_t TimerSlots = 0U,
165  typename... Groups>
167 {
168  using resources = runtime_resources<Runtime, TimerSlots, Groups...>;
169 
170  static_assert(Profile::heap_allowed || !resources::uses_heap,
171  "tsm: target profile forbids heap-backed runtime storage");
172  static_assert(Profile::tick_driven_time,
173  "tsm: runtime resources require tick-driven time semantics");
174 };
175 
176 } // namespace tsm::runtime
Static coroutine tasks for tsm runtime executors.
consteval std::size_t max_alignof(type_list< T, Ts... >)
Definition: type_list.h:146
typename as_type_list< T >::type as_type_list_t
Definition: type_list.h:175
consteval std::size_t max_sizeof(type_list< T, Ts... >)
Definition: type_list.h:134
Definition: freertos.h:26
detail::runtime_impl< Definition, Policy, MachinePolicy > Runtime
Definition: runtime.h:531
detail::task_resources< Runtime > task_resources
Definition: coroutine.h:1966
consteval bool fits(resource_snapshot const &snapshot, resource_budget const &budget)
Definition: resources.h:51
Definition: resources.h:167
Definition: resources.h:37
std::size_t task_timer_slots
Definition: resources.h:46
std::size_t max_event_alignment
Definition: resources.h:39
std::size_t delayed_event_timer_slots
Definition: resources.h:41
std::size_t task_group_count
Definition: resources.h:43
std::size_t queue_slots
Definition: resources.h:40
std::size_t task_count
Definition: resources.h:42
bool allow_heap
Definition: resources.h:47
std::size_t max_event_bytes
Definition: resources.h:38
std::size_t task_group_entry_count
Definition: resources.h:44
std::size_t task_arena_bytes
Definition: resources.h:45
Definition: resources.h:148
static constexpr bool fits
Definition: resources.h:150
Definition: resources.h:23
std::size_t max_event_bytes
Definition: resources.h:24
std::size_t delayed_event_timer_slots
Definition: resources.h:27
std::size_t task_timer_slots
Definition: resources.h:32
std::size_t task_arena_bytes
Definition: resources.h:31
std::size_t max_event_alignment
Definition: resources.h:25
bool uses_heap
Definition: resources.h:33
std::size_t queue_slots
Definition: resources.h:26
std::size_t task_group_entry_count
Definition: resources.h:30
std::size_t task_count
Definition: resources.h:28
std::size_t task_group_count
Definition: resources.h:29
Definition: resources.h:96
static constexpr std::size_t task_group_entry_count
Definition: resources.h:112
static constexpr std::size_t max_event_alignment
Definition: resources.h:104
task_resources< Runtime > task_summary
Definition: resources.h:100
static constexpr std::size_t delayed_event_timer_slots
Definition: resources.h:108
static constexpr std::size_t max_event_bytes
Definition: resources.h:102
static consteval bool fits_within(resource_budget const &budget)
Definition: resources.h:132
static constexpr bool uses_heap
Definition: resources.h:116
typename Runtime::events events
Definition: resources.h:98
static constexpr std::size_t task_count
Definition: resources.h:109
static constexpr std::size_t task_arena_bytes
Definition: resources.h:114
static constexpr std::size_t queue_slots
Definition: resources.h:106
static constexpr std::size_t task_group_count
Definition: resources.h:110
tsm::detail::as_type_list_t< events > event_list
Definition: resources.h:99
Runtime runtime_type
Definition: resources.h:97
static consteval resource_snapshot snapshot()
Definition: resources.h:118
static constexpr std::size_t task_timer_slots
Definition: resources.h:115
Definition: resources.h:84
static constexpr std::size_t entry_count
Definition: resources.h:86
static constexpr std::size_t group_count
Definition: resources.h:85