kthread.rs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. use alloc::borrow::ToOwned;
  2. use alloc::sync::Arc;
  3. use unified_init::macros::unified_init;
  4. use crate::arch::CurrentIrqArch;
  5. use crate::exception::InterruptArch;
  6. use crate::init::initcall::INITCALL_SUBSYS;
  7. use crate::net::NET_DEVICES;
  8. use crate::process::kthread::{KernelThreadClosure, KernelThreadMechanism};
  9. use crate::process::{ProcessControlBlock, ProcessManager};
  10. use crate::sched::{schedule, SchedMode};
  11. static mut NET_POLL_THREAD: Option<Arc<ProcessControlBlock>> = None;
  12. #[unified_init(INITCALL_SUBSYS)]
  13. pub fn net_poll_init() -> Result<(), system_error::SystemError> {
  14. let closure = KernelThreadClosure::StaticEmptyClosure((&(net_poll_thread as fn() -> i32), ()));
  15. let pcb = KernelThreadMechanism::create_and_run(closure, "net_poll".to_owned())
  16. .ok_or("")
  17. .expect("create net_poll thread failed");
  18. log::info!("net_poll thread created");
  19. unsafe {
  20. NET_POLL_THREAD = Some(pcb);
  21. }
  22. return Ok(());
  23. }
  24. fn net_poll_thread() -> i32 {
  25. log::info!("net_poll thread started");
  26. loop {
  27. for (_, iface) in NET_DEVICES.read_irqsave().iter() {
  28. iface.poll();
  29. }
  30. let irq_guard = unsafe { CurrentIrqArch::save_and_disable_irq() };
  31. ProcessManager::mark_sleep(true).expect("clocksource_watchdog_kthread:mark sleep failed");
  32. drop(irq_guard);
  33. schedule(SchedMode::SM_NONE);
  34. }
  35. }
  36. /// 拉起线程
  37. pub(super) fn wakeup_poll_thread() {
  38. if unsafe { NET_POLL_THREAD.is_none() } {
  39. return;
  40. }
  41. let _ = ProcessManager::wakeup(unsafe { NET_POLL_THREAD.as_ref().unwrap() });
  42. }