aboutsummaryrefslogtreecommitdiff
path: root/macros/src/codegen/resources.rs
diff options
context:
space:
mode:
Diffstat (limited to 'macros/src/codegen/resources.rs')
-rw-r--r--macros/src/codegen/resources.rs44
1 files changed, 43 insertions, 1 deletions
diff --git a/macros/src/codegen/resources.rs b/macros/src/codegen/resources.rs
index 8cb788d1..1af95ada 100644
--- a/macros/src/codegen/resources.rs
+++ b/macros/src/codegen/resources.rs
@@ -17,9 +17,12 @@ pub fn codegen(
Vec<TokenStream2>,
// mod_resources -- the `resources` module
TokenStream2,
+ // mod_gresources -- the `gresources` module
+ TokenStream2,
) {
let mut const_app = vec![];
let mut mod_resources = vec![];
+ let mut mod_gresources = vec![];
for (name, res, expr, loc) in app.resources(analysis) {
let cfgs = &res.cfgs;
@@ -77,6 +80,8 @@ pub fn codegen(
if let Some(Ownership::Contended { ceiling }) = analysis.ownerships.get(name) {
let cfg_core = util::cfg_core(loc.core().expect("UNREACHABLE"), app.args.cores);
+ // TODO generate less code -- we don't always need both `gresources::foo` and
+ // `resources::foo`
mod_resources.push(quote!(
#[allow(non_camel_case_types)]
#(#cfgs)*
@@ -114,8 +119,37 @@ pub fn codegen(
name,
quote!(#ty),
*ceiling,
+ ptr.clone(),
+ ));
+
+ mod_gresources.push(quote!(
+ #[allow(non_camel_case_types)]
+ #(#cfgs)*
+ #cfg_core
+ pub struct #name {
+ _not_send_or_sync: core::marker::PhantomData<*mut ()>,
+ }
+
+ #(#cfgs)*
+ #cfg_core
+ impl #name {
+ #[inline(always)]
+ pub unsafe fn new() -> Self {
+ #name { _not_send_or_sync: core::marker::PhantomData }
+ }
+ }
+ ));
+
+ const_app.push(util::impl_gmutex(
+ extra,
+ cfgs,
+ cfg_core.as_ref(),
+ name,
+ quote!(#ty),
+ *ceiling,
ptr,
));
+
}
}
@@ -129,5 +163,13 @@ pub fn codegen(
})
};
- (const_app, mod_resources)
+ let mod_gresources = if mod_gresources.is_empty() {
+ quote!()
+ } else {
+ quote!(mod gresources {
+ #(#mod_gresources)*
+ })
+ };
+
+ (const_app, mod_resources, mod_gresources)
}