use { crate::{invoke_context::InvokeContext, timings::ExecuteDetailsTimings}, solana_sdk::{instruction::InstructionError, saturating_add_assign}, }; /// Program executor pub trait Executor: std::fmt::Debug + Send + Sync { /// Execute the program fn execute(&self, invoke_context: &mut InvokeContext) -> Result<(), InstructionError>; } #[derive(Debug, Default)] pub struct CreateMetrics { pub program_id: String, pub register_syscalls_us: u64, pub load_elf_us: u64, pub verify_code_us: u64, pub jit_compile_us: u64, } impl CreateMetrics { pub fn submit_datapoint(&self, timings: &mut ExecuteDetailsTimings) { saturating_add_assign!( timings.create_executor_register_syscalls_us, self.register_syscalls_us ); saturating_add_assign!(timings.create_executor_load_elf_us, self.load_elf_us); saturating_add_assign!(timings.create_executor_verify_code_us, self.verify_code_us); saturating_add_assign!(timings.create_executor_jit_compile_us, self.jit_compile_us); datapoint_trace!( "create_executor_trace", ("program_id", self.program_id, String), ("register_syscalls_us", self.register_syscalls_us, i64), ("load_elf_us", self.load_elf_us, i64), ("verify_code_us", self.verify_code_us, i64), ("jit_compile_us", self.jit_compile_us, i64), ); } }