Use strong references in context set.

This commit is contained in:
4lDO2
2024-07-12 19:33:38 +02:00
parent 80fe891c6e
commit 7fbe5c72e9
6 changed files with 16 additions and 11 deletions
+9 -4
View File
@@ -104,7 +104,7 @@ pub fn init() {
CONTEXTS
.write()
.insert(ContextRef(Arc::downgrade(&context_lock)));
.insert(ContextRef(Arc::clone(&context_lock)));
unsafe {
let percpu = PercpuBlock::current();
@@ -140,11 +140,16 @@ pub fn current_pid() -> Result<ProcessId> {
Ok(current().read().pid)
}
pub struct ContextRef(pub Weak<RwSpinlock<Context>>);
pub struct ContextRef(pub Arc<RwSpinlock<Context>>);
impl ContextRef {
pub fn upgrade(&self) -> Option<Arc<RwSpinlock<Context>>> {
Some(Arc::clone(&self.0))
}
}
impl Ord for ContextRef {
fn cmp(&self, other: &Self) -> core::cmp::Ordering {
Ord::cmp(&self.0.as_ptr(), &other.0.as_ptr())
Ord::cmp(&Arc::as_ptr(&self.0), &Arc::as_ptr(&other.0))
}
}
impl PartialOrd for ContextRef {
@@ -175,7 +180,7 @@ pub fn spawn(
CONTEXTS
.write()
.insert(ContextRef(Arc::downgrade(&context_lock)));
.insert(ContextRef(Arc::clone(&context_lock)));
process.write().threads.push(Arc::downgrade(&context_lock));
{
+3 -3
View File
@@ -131,7 +131,7 @@ pub fn switch() -> SwitchResult {
for next_context_lock in contexts
// Include all contexts with IDs greater than the current...
.range((
Bound::Excluded(ContextRef(Arc::downgrade(&prev_context_lock))),
Bound::Excluded(ContextRef(Arc::clone(&prev_context_lock))),
Bound::Unbounded,
))
.chain(
@@ -139,10 +139,10 @@ pub fn switch() -> SwitchResult {
// ... and all contexts with IDs less than the current...
.range((
Bound::Unbounded,
Bound::Excluded(ContextRef(Arc::downgrade(&prev_context_lock))),
Bound::Excluded(ContextRef(Arc::clone(&prev_context_lock))),
)),
)
.filter_map(|r| r.0.upgrade())
.filter_map(|r| r.upgrade())
.chain(Some(Arc::clone(&idle_context)))
// ... but not the current context, which is already locked
{
+1 -1
View File
@@ -10,7 +10,7 @@ pub fn resource() -> Result<Vec<u8>> {
let mut rows = Vec::new();
{
let contexts = context::contexts();
for context_lock in contexts.iter().filter_map(|r| r.0.upgrade()) {
for context_lock in contexts.iter().filter_map(|r| r.upgrade()) {
let context = context_lock.read();
rows.push((
context.pid.get(),
+1 -1
View File
@@ -27,7 +27,7 @@ pub fn resource() -> Result<Vec<u8>> {
);
{
let contexts = context::contexts();
for context_ref in contexts.iter().filter_map(|r| r.0.upgrade()) {
for context_ref in contexts.iter().filter_map(|r| r.upgrade()) {
let context = context_ref.read();
let mut stat_string = String::new();
+1 -1
View File
@@ -9,7 +9,7 @@ pub fn resource() -> Result<Vec<u8>> {
let mut rows = Vec::new();
{
let contexts = context::contexts();
for context_ref in contexts.iter().filter_map(|r| r.0.upgrade()) {
for context_ref in contexts.iter().filter_map(|r| r.upgrade()) {
let context = context_ref.read();
rows.push((
context.pid,
+1 -1
View File
@@ -10,7 +10,7 @@ pub fn resource() -> Result<Vec<u8>> {
let mut rows = Vec::new();
{
let contexts = context::contexts();
for context_ref in contexts.iter().filter_map(|r| r.0.upgrade()) {
for context_ref in contexts.iter().filter_map(|r| r.upgrade()) {
let context = context_ref.read();
rows.push((
context.pid.get(),