| // Copyright 2026 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. |
| |
| use crate::Kernel; |
| use crate::scheduler::State; |
| |
| /// Traces a context switch event. |
| /// |
| /// This function records a context switch event to the kernel's trace buffer. |
| pub fn trace_context_switch<K: Kernel>( |
| kernel: K, |
| current_thread_id: usize, |
| new_thread_id: usize, |
| current_thread_state: State, |
| ) { |
| #[cfg(not(feature = "tracing"))] |
| { |
| // Silence unused variable warnings when tracing is not enabled. |
| let _ = ( |
| kernel, |
| current_thread_id, |
| new_thread_id, |
| current_thread_state, |
| ); |
| } |
| |
| #[cfg(feature = "tracing")] |
| #[allow(clippy::cast_possible_truncation)] |
| { |
| use pw_kernel_tracing::{ContextSwitchEvent, EventType}; |
| use pw_time_core::Clock; |
| kernel.get_state().trace_buffer.add_record( |
| // TODO: https://pigweed.dev/issues/477681143 - Add target specific |
| // timestamp scaling. |
| (K::Clock::now().ticks() >> 8) as u32, |
| EventType::ContextSwitch, |
| ContextSwitchEvent { |
| // TODO: https://pigweed.dev/issues/477681354 - Support 64bit |
| // architectures and their 64 bit thread ids. |
| old_thread_id: current_thread_id as u32, |
| new_thread_id: new_thread_id as u32, |
| old_thread_state: current_thread_state as u8, |
| } |
| .encode(), |
| ); |
| } |
| } |