etest/resource/
lock.rs

1use std::sync::Arc;
2
3use crate::Location;
4use crate::trace_resources;
5
6use super::{ ResourceEntry, ResourceManagerNotify };
7
8pub struct ResourceLockGuard {
9    pub(super) managed:	Vec<ResourceEntry>,
10    pub(super) owner:	Location,
11    pub(super) notify:	Arc<ResourceManagerNotify>,
12}
13
14impl std::ops::Drop for ResourceLockGuard {
15    fn drop(&mut self) {
16        trace_resources!("dropping {:?}", self.owner);
17        self.release();
18    }
19}
20
21impl ResourceLockGuard {
22    fn release(&mut self) {
23        let mut changed = false;
24
25        for m in &self.managed {
26            let mut entry = m.write().unwrap();
27
28            if Some(&self.owner) == entry.owner.as_ref() {
29                trace_resources!("  releasing owned {:?}", entry.id);
30                entry.owner = None;
31                changed = true;
32            }
33
34            changed |= entry.users.remove(&self.owner);
35
36            trace_resources!("  entry {:?} used by {:?}", entry.id, entry.users);
37        }
38
39        self.managed.clear();
40
41        if changed {
42            self.notify.notify();
43        }
44    }
45}