diff --git a/kernel/aster-nix/src/thread/work_queue/mod.rs b/kernel/aster-nix/src/thread/work_queue/mod.rs index af212a84..6d8f45d1 100644 --- a/kernel/aster-nix/src/thread/work_queue/mod.rs +++ b/kernel/aster-nix/src/thread/work_queue/mod.rs @@ -141,6 +141,9 @@ impl WorkQueue { .lock_irq_disabled() .pending_work_items .push(work_item); + if let Some(worker_pool) = self.worker_pool.upgrade() { + worker_pool.schedule() + } true } diff --git a/kernel/aster-nix/src/thread/work_queue/worker.rs b/kernel/aster-nix/src/thread/work_queue/worker.rs index 52089cff..8e23a5ec 100644 --- a/kernel/aster-nix/src/thread/work_queue/worker.rs +++ b/kernel/aster-nix/src/thread/work_queue/worker.rs @@ -97,6 +97,10 @@ impl Worker { self.exit(); } + pub(super) fn bound_thread(&self) -> &Arc { + &self.bound_thread + } + pub(super) fn is_idle(&self) -> bool { self.inner.lock_irq_disabled().worker_status == WorkerStatus::Idle } diff --git a/kernel/aster-nix/src/thread/work_queue/worker_pool.rs b/kernel/aster-nix/src/thread/work_queue/worker_pool.rs index 0382d017..0b5b5287 100644 --- a/kernel/aster-nix/src/thread/work_queue/worker_pool.rs +++ b/kernel/aster-nix/src/thread/work_queue/worker_pool.rs @@ -2,9 +2,16 @@ #![allow(dead_code)] -use core::sync::atomic::{AtomicBool, Ordering}; +use core::{ + sync::atomic::{AtomicBool, Ordering}, + time::Duration, +}; -use aster_frame::{cpu::CpuSet, sync::WaitQueue, task::Priority}; +use aster_frame::{ + cpu::CpuSet, + sync::WaitQueue, + task::{add_task, Priority}, +}; use super::{simple_scheduler::SimpleScheduler, worker::Worker, WorkItem, WorkPriority, WorkQueue}; use crate::{ @@ -74,7 +81,7 @@ impl LocalWorkerPool { fn add_worker(&self) { let worker = Worker::new(self.parent.clone(), self.cpu_id); self.workers.lock_irq_disabled().push_back(worker.clone()); - worker.run(); + add_task(worker.bound_thread().task().clone()); } fn remove_worker(&self) {