use proc_macro2::TokenStream as TokenStream2; use quote::quote; use rtic_syntax::{ast::App, Context}; use crate::{ analyze::Analysis, check::Extra, codegen::{locals, module, resources_struct, util}, }; pub fn codegen( app: &App, analysis: &Analysis, extra: &Extra, ) -> ( // const_app_software_tasks -- free queues, buffers and `${task}Resources` constructors Vec, // root_software_tasks -- items that must be placed in the root of the crate: // - `${task}Locals` structs // - `${task}Resources` structs // - `${task}` modules Vec, // user_software_tasks -- the `#[task]` functions written by the user Vec, ) { let mut const_app = vec![]; let mut root = vec![]; let mut user_tasks = vec![]; for (name, task) in &app.software_tasks { let receiver = task.args.core; let inputs = &task.inputs; let (_, _, _, input_ty) = util::regroup_inputs(inputs); let cap = task.args.capacity; let cap_lit = util::capacity_literal(cap); let cap_ty = util::capacity_typenum(cap, true); // create free queues and inputs / instants buffers if let Some(free_queues) = analysis.free_queues.get(name) { for (&sender, &ceiling) in free_queues { let cfg_sender = util::cfg_core(sender, app.args.cores); let fq = util::fq_ident(name, sender); let (loc, fq_ty, fq_expr, bss, mk_uninit): ( _, _, _, _, Box Option<_>>, ) = if receiver == sender { ( cfg_sender.clone(), quote!(rtic::export::SCFQ<#cap_ty>), quote!(rtic::export::Queue(unsafe { rtic::export::iQueue::u8_sc() })), util::link_section("bss", sender), Box::new(|| util::link_section_uninit(Some(sender))), ) } else { let shared = if cfg!(feature = "heterogeneous") { Some(quote!(#[rtic::export::shared])) } else { None }; ( shared, quote!(rtic::export::MCFQ<#cap_ty>), quote!(rtic::export::Queue(rtic::export::iQueue::u8())), None, Box::new(|| util::link_section_uninit(None)), ) }; let loc = &loc; const_app.push(quote!( /// Queue version of a free-list that keeps track of empty slots in /// the following buffers #loc #bss static mut #fq: #fq_ty = #fq_expr; )); // Generate a resource proxy if needed if let Some(ceiling) = ceiling { const_app.push(quote!( #cfg_sender struct #fq<'a> { priority: &'a rtic::export::Priority, } )); const_app.push(util::impl_mutex( extra, &[], cfg_sender.as_ref(), false, &fq, fq_ty, ceiling, quote!(&mut #fq), )); } let ref elems = (0..cap) .map(|_| quote!(core::mem::MaybeUninit::uninit())) .collect::>(); if app.uses_schedule(receiver) { let m = extra.monotonic(); let instants = util::instants_ident(name, sender); let uninit = mk_uninit(); const_app.push(quote!( #loc #uninit /// Buffer that holds the instants associated to the inputs of a task static mut #instants: [core::mem::MaybeUninit<<#m as rtic::Monotonic>::Instant>; #cap_lit] = [#(#elems,)*]; )); } let uninit = mk_uninit(); let inputs = util::inputs_ident(name, sender); const_app.push(quote!( #loc #uninit /// Buffer that holds the inputs of a task static mut #inputs: [core::mem::MaybeUninit<#input_ty>; #cap_lit] = [#(#elems,)*]; )); } } // `${task}Resources` let mut needs_lt = false; if !task.args.resources.is_empty() { let (item, constructor) = resources_struct::codegen( Context::SoftwareTask(name), task.args.priority, &mut needs_lt, app, analysis, ); root.push(item); const_app.push(constructor); } // `${task}Locals` let mut locals_pat = None; if !task.locals.is_empty() { let (struct_, pat) = locals::codegen(Context::SoftwareTask(name), &task.locals, receiver, app); locals_pat = Some(pat); root.push(struct_); } let cfg_receiver = util::cfg_core(receiver, app.args.cores); let section = util::link_section("text", receiver); let context = &task.context; let attrs = &task.attrs; let cfgs = &task.cfgs; let stmts = &task.stmts; let locals_pat = locals_pat.iter(); user_tasks.push(quote!( #(#attrs)* #(#cfgs)* #[allow(non_snake_case)] #cfg_receiver #section fn #name(#(#locals_pat,)* #context: #name::Context #(,#inputs)*) { use rtic::Mutex as _; #(#stmts)* } )); root.push(module::codegen( Context::SoftwareTask(name), needs_lt, app, extra, )); } (const_app, root, user_tasks) } ue='feat/create-astro-replace-component-selector-with-astro-add'>feat/create-astro-replace-component-selector-with-astro-add Unnamed repository; edit this file 'description' to name the repository.
aboutsummaryrefslogtreecommitdiff
AgeCommit message (Expand)AuthorFilesLines
2025-04-02feat: Add `eagerness` support for `prefetch()` (#13405)Gravatar Marocco2 2-2/+40
2025-04-02chore(deps): update tj-actions/changed-files action to v46.0.3 (#13497)Gravatar renovate[bot] 1-1/+1
2025-03-31[ci] release (#13513)astro@5.5.6@astrojs/vue@5.0.9@astrojs/svelte@7.0.9@astrojs/studio@0.1.6@astrojs/solid-js@5.0.7@astrojs/react@4.2.3@astrojs/preact@4.0.8@astrojs/netlify@6.2.5@astrojs/mdx@4.2.3@astrojs/markdoc@0.13.3@astrojs/db@0.14.10@astrojs/cloudflare@12.4.0@astrojs/alpinejs@0.4.5Gravatar Houston (Bot) 54-178/+238
2025-03-31fix: update `vite` to latest version (#13526)Gravatar Junseong Park 15-101/+118
2025-03-31[ci] formatGravatar Emanuele Stoppa 3-4/+2
2025-03-31fix(i18n): return value from `preferredLocale` (#13524)Gravatar Emanuele Stoppa 5-15/+51
2025-03-31chore(tailwind): delete integration (#13511)Gravatar Florian Lefebvre 16-1083/+1
2025-03-31fix(deps): update all non-major dependencies (#13521)Gravatar renovate[bot] 14-163/+163
2025-03-31[ci] formatGravatar Matt Kane 3-4/+3
2025-03-31feat(cloudflare): add KV session storage support (#13514)Gravatar Matt Kane 19-487/+490
2025-03-31fix(deps): update astro client runtimes (#13522)Gravatar renovate[bot] 4-6/+7
2025-03-27fix(deps): update astro dependencies (#13498)Gravatar renovate[bot] 47-412/+427
2025-03-27[ci] formatGravatar Emanuele Stoppa 3-8/+7
2025-03-27refactor(actions): use `Omit` to avoid leaking types to shared context (#13429)Gravatar Emanuele Stoppa 5-11/+41
2025-03-26[ci] release (#13504)astro@5.5.5@astrojs/vue@5.0.8@astrojs/tailwind@6.0.2@astrojs/svelte@7.0.8@astrojs/studio@0.1.5@astrojs/solid-js@5.0.6@astrojs/react@4.2.2@astrojs/preact@4.0.7@astrojs/netlify@6.2.4@astrojs/mdx@4.2.2@astrojs/markdoc@0.13.2@astrojs/db@0.14.9@astrojs/cloudflare@12.3.1@astrojs/alpinejs@0.4.4Gravatar Houston (Bot) 56-132/+197
2025-03-26[ci] formatGravatar Florian Lefebvre 2-2/+2
2025-03-26fix(astro): dynamically import actions (#13510)Gravatar Florian Lefebvre 12-51/+96
2025-03-26[ci] formatGravatar Matt Kane 2-2/+2
2025-03-26fix: cache raw cookie value and decode when getting (#13485)Gravatar Matt Kane 3-17/+37
2025-03-25fix: update vite (#13505)Gravatar Emanuele Stoppa 16-104/+123
2025-03-24[ci] formatGravatar Emanuele Stoppa 1-1/+1
2025-03-24fix(app): call renderer when routes don't match (#13483)Gravatar Emanuele Stoppa 4-1/+30
2025-03-21[ci] release (#13460)astro@5.5.4@astrojs/vercel@8.1.3@astrojs/tailwind@6.0.1@astrojs/svelte@7.0.7@astrojs/preact@4.0.6@astrojs/cloudflare@12.3.0Gravatar Houston (Bot) 45-118/+119
2025-03-21fix: better error handling on Stackblitz (#13484)Gravatar Matt Kane 2-0/+12
2025-03-21Repair server islands to work with client router (#13481)Gravatar Martin Trapp 2-6/+11
2025-03-21fix: generate correct external redirects (#13480)Gravatar Matt Kane 3-4/+21
2025-03-21fix(deps): update all non-major dependencies (#13440)Gravatar renovate[bot] 24-435/+436
2025-03-21[ci] formatGravatar Florian Lefebvre 2-2/+2
2025-03-21feat(cloudflare): global env (#13444)Gravatar Florian Lefebvre 6-47/+130
2025-03-21fix(deps): update astro client runtimes (#13474)Gravatar renovate[bot] 7-345/+348
2025-03-20Small change to linking style (#13472)Gravatar Chris Swithinbank 1-1/+1
2025-03-20Add deprecation notice to Tailwind integration README (#13471)Gravatar Chris Swithinbank 2-6/+11
2025-03-20[ci] formatGravatar Matt Kane 2-2/+1
2025-03-20fix(preact,svelte): empty target container before rendering `client:only` isl...Gravatar Matt Kane 5-5/+41
2025-03-20chore(renovate): group updates (#13466)Gravatar Emanuele Stoppa 1-11/+58
2025-03-19[ci] formatGravatar Matt Kane 1-3/+2
2025-03-19fix: don't attempt to move files after build with base (#13463)Gravatar Matt Kane 8-13/+66
2025-03-19[ci] formatGravatar Emanuele Stoppa 2-6/+18
2025-03-19fix(routing): don't add site to static redirects (#13447)Gravatar Emanuele Stoppa 7-10/+49
2025-03-18[ci] formatGravatar Matt Kane 2-2/+1
2025-03-18fix: set correct statusText for custom error pages (#13457)Gravatar Matt Kane 4-2/+19
2025-03-18chore(deps): update github-actions (#13459)Gravatar renovate[bot] 9-13/+13
2025-03-18chore(deps): update github-actions (#13458)Gravatar renovate[bot] 1-5/+5
2025-03-18[ci] formatGravatar Emanuele Stoppa 1-1/+3
2025-03-18chore: remove deprecated package (#13455)Gravatar Emanuele Stoppa 3-23/+16
2025-03-18fix(deps): update dependency miniflare to v4 (#13441)Gravatar renovate[bot] 2-31/+31