zakhar_azg

Untitled

Nov 26th, 2024
6
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.91 KB | None | 0 0
  1. impl<'a> LockSet<'a> {
  2. // ANCHOR: lock_set
  3. /// Проверяет, что процесс `src` имеет право модифицировать целевой процесс,
  4. /// заданный своим идентификатором `dst_pid`.
  5. /// Целевой процесс может совпадать с `src`.
  6. ///
  7. /// Модифицировать можно:
  8. /// - Либо самого себя, задавая [`Pid::Current`] или явно собственный идентификатор [`Pid::Id`].
  9. /// - Либо свой непосредственно дочерний процесс, задавая его идентификатор.
  10. ///
  11. /// Возвращает:
  12. /// - Исходную блокировку на `src`, если `dst_pid` задаёт тот же процесс.
  13. /// - Блокировку на процесс `dst`, если `process_set == ProcessSet::Dst`.
  14. /// - Блокировки на процессы `src` и `dst`, если это разные процессы.
  15. ///
  16. /// Захватывает блокировки в правильном порядке для избежания
  17. /// [взаимоблокировки](https://en.wikipedia.org/wiki/Deadlock).
  18. fn new(
  19. src: SpinlockGuard<Process>,
  20. dst_pid: usize,
  21. process_set: ProcessSet,
  22. ) -> Result<LockSet<'_>> {
  23. let dst = Pid::from_usize(dst_pid)?;
  24.  
  25. match process_set {
  26. ProcessSet::Dst => {
  27. if src.pid().into_usize() == dst_pid {
  28. return Ok(LockSet::Dst { dst: src });
  29. }
  30.  
  31. if dst == Pid::Current {
  32. return Ok(LockSet::Dst { dst: src });
  33. }
  34.  
  35. let dst_process = Table::get(dst)?;
  36. if dst_process.parent() != Some(src.pid()) && dst != src.pid() && dst != Pid::Current {
  37. return Err(PermissionDenied);
  38. }
  39.  
  40. return Ok(LockSet::Dst { dst: dst_process });
  41. },
  42. ProcessSet::SrcDst => {
  43. if src.pid().into_usize() == dst_pid {
  44. return Ok(LockSet::Same { src_dst: src });
  45. }
  46.  
  47. if dst == Pid::Current {
  48. return Ok(LockSet::Same { src_dst: src });
  49. }
  50.  
  51. let dst_process = Table::get(dst)?;
  52. if dst_process.parent() != Some(src.pid()) && dst != src.pid() && dst != Pid::Current {
  53. return Err(PermissionDenied);
  54. }
  55. return Ok(LockSet::Different { dst: dst_process, src: src });
  56.  
  57. },
  58. }
  59. }
Advertisement
Add Comment
Please, Sign In to add comment