aboutsummaryrefslogtreecommitdiff
path: root/macros/src/analyze.rs
diff options
context:
space:
mode:
Diffstat (limited to 'macros/src/analyze.rs')
-rw-r--r--macros/src/analyze.rs36
1 files changed, 25 insertions, 11 deletions
diff --git a/macros/src/analyze.rs b/macros/src/analyze.rs
index 04b462fa..869b5d20 100644
--- a/macros/src/analyze.rs
+++ b/macros/src/analyze.rs
@@ -30,13 +30,14 @@ pub struct Analysis {
pub enum Ownership {
// NOTE priorities and ceilings are "logical" (0 = lowest priority, 255 = highest priority)
Owned { priority: u8 },
+ CoOwned { priority: u8 },
Shared { ceiling: u8 },
}
impl Ownership {
pub fn needs_lock(&self, priority: u8) -> bool {
match *self {
- Ownership::Owned { .. } => false,
+ Ownership::Owned { .. } | Ownership::CoOwned { .. } => false,
Ownership::Shared { ceiling } => {
debug_assert!(ceiling >= priority);
@@ -44,6 +45,13 @@ impl Ownership {
}
}
}
+
+ pub fn is_owned(&self) -> bool {
+ match *self {
+ Ownership::Owned { .. } => true,
+ _ => false,
+ }
+ }
}
pub struct Dispatcher {
@@ -72,18 +80,24 @@ pub fn app(app: &App) -> Analysis {
for (priority, res) in app.resource_accesses() {
if let Some(ownership) = ownerships.get_mut(res) {
match *ownership {
- Ownership::Owned { priority: ceiling } | Ownership::Shared { ceiling } => {
- if priority != ceiling {
- *ownership = Ownership::Shared {
- ceiling: cmp::max(ceiling, priority),
- };
-
- let res = &app.resources[res];
- if res.mutability.is_none() {
- assert_sync.insert(res.ty.clone());
- }
+ Ownership::Owned { priority: ceiling }
+ | Ownership::CoOwned { priority: ceiling }
+ | Ownership::Shared { ceiling }
+ if priority != ceiling =>
+ {
+ *ownership = Ownership::Shared {
+ ceiling: cmp::max(ceiling, priority),
+ };
+
+ let res = &app.resources[res];
+ if res.mutability.is_none() {
+ assert_sync.insert(res.ty.clone());
}
}
+ Ownership::Owned { priority: ceiling } if ceiling == priority => {
+ *ownership = Ownership::CoOwned { priority };
+ }
+ _ => {}
}
continue;