epoll_items.rs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. use alloc::{
  2. collections::LinkedList,
  3. sync::{Arc, Weak},
  4. vec::Vec,
  5. };
  6. use system_error::SystemError;
  7. use crate::{
  8. libs::{spinlock::SpinLock, wait_queue::EventWaitQueue},
  9. net::event_poll::{EPollEventType, EPollItem, EventPoll},
  10. process::ProcessManager,
  11. sched::{schedule, SchedMode},
  12. };
  13. #[derive(Debug, Clone)]
  14. pub struct EPollItems {
  15. items: Arc<SpinLock<LinkedList<Arc<EPollItem>>>>,
  16. }
  17. impl Default for EPollItems {
  18. fn default() -> Self {
  19. Self {
  20. items: Arc::new(SpinLock::new(LinkedList::new())),
  21. }
  22. }
  23. }
  24. impl EPollItems {
  25. pub fn add(&self, item: Arc<EPollItem>) {
  26. self.items.lock_irqsave().push_back(item);
  27. }
  28. pub fn remove(&self, item: &Weak<SpinLock<EventPoll>>) -> Result<(), SystemError> {
  29. let to_remove = self
  30. .items
  31. .lock_irqsave()
  32. .extract_if(|x| x.epoll().ptr_eq(item))
  33. .collect::<Vec<_>>();
  34. let result = if !to_remove.is_empty() {
  35. Ok(())
  36. } else {
  37. Err(SystemError::ENOENT)
  38. };
  39. drop(to_remove);
  40. return result;
  41. }
  42. pub fn clear(&self) -> Result<(), SystemError> {
  43. let mut guard = self.items.lock_irqsave();
  44. let mut result = Ok(());
  45. guard.iter().for_each(|item| {
  46. if let Some(epoll) = item.epoll().upgrade() {
  47. let _ =
  48. EventPoll::ep_remove(&mut epoll.lock_irqsave(), item.fd(), None).map_err(|e| {
  49. result = Err(e);
  50. });
  51. }
  52. });
  53. guard.clear();
  54. return result;
  55. }
  56. }