mod.rs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #[cfg(target_os = "dragonos")]
  2. use drstd as std;
  3. use core::slice::SlicePattern;
  4. use std::sync::Arc;
  5. use std::vec::Vec;
  6. use std::{cmp::PartialEq, sync::Mutex};
  7. use crate::manager::{self, UnitManager};
  8. use crate::{
  9. error::runtime_error::{RuntimeError, RuntimeErrorType},
  10. unit::Unit,
  11. };
  12. pub struct DepGraphNode {
  13. value: usize,
  14. edges: Vec<usize>,
  15. incoming_edges: Vec<usize>,
  16. }
  17. pub struct DepGraph {
  18. nodes: Vec<DepGraphNode>,
  19. value: Vec<usize>,
  20. }
  21. // 提供拓扑排序方法,在启动服务时确定先后顺序
  22. impl DepGraph {
  23. fn new() -> Self {
  24. return DepGraph {
  25. nodes: Vec::new(),
  26. value: Vec::new(),
  27. };
  28. }
  29. pub fn add_node(&mut self, value: usize) -> usize {
  30. let index = self.nodes.len();
  31. //如果nodes中已经有了这个value则无需重复添加,直接返回nodes中的value对应的index
  32. if let Some(idx) = self.value.iter().position(|x| *x == value) {
  33. return idx;
  34. }
  35. //如果value在nodes中不存在,则添加value
  36. self.nodes.push(DepGraphNode {
  37. value: value,
  38. edges: Vec::new(),
  39. incoming_edges: Vec::new(),
  40. });
  41. self.value.push(value);
  42. return index;
  43. }
  44. pub fn add_edge(&mut self, from: usize, to: usize) {
  45. self.nodes[from].edges.push(to);
  46. self.nodes[to].incoming_edges.push(from);
  47. }
  48. pub fn topological_sort(&mut self) -> Result<Vec<usize>, RuntimeError> {
  49. let mut result = Vec::new();
  50. let mut visited = Vec::new();
  51. let mut stack = Vec::new();
  52. for (i, node) in self.nodes.iter().enumerate() {
  53. if node.incoming_edges.len() == 0 {
  54. stack.push(i);
  55. }
  56. }
  57. while stack.len() > 0 {
  58. let index = stack.pop().unwrap();
  59. if visited.contains(&index) {
  60. continue;
  61. }
  62. visited.push(index);
  63. result.push(self.nodes[index].value);
  64. let len = self.nodes[index].edges.len();
  65. for i in 0..len {
  66. let edge = self.nodes[index].edges[i];
  67. self.nodes[edge].incoming_edges.retain(|&x| x != index);
  68. if self.nodes[edge].incoming_edges.len() == 0 {
  69. stack.push(edge);
  70. }
  71. }
  72. }
  73. if result.len() != self.nodes.len() {
  74. return Err(RuntimeError::new(RuntimeErrorType::CircularDependency));
  75. }
  76. result.reverse();
  77. return Ok(result);
  78. }
  79. fn add_edges(&mut self, unit: usize, after: &[usize]) {
  80. //因为service的依赖关系规模不会很大,故先使用递归实现
  81. //TODO:改递归
  82. for target in after {
  83. let s = self.add_node(unit);
  84. let t = self.add_node(*target);
  85. self.add_edge(s, t);
  86. let arc_unit = UnitManager::get_unit_with_id(target).unwrap();
  87. let unit = arc_unit.lock().unwrap();
  88. let after = unit.unit_base().unit_part().after();
  89. self.add_edges(*target, after);
  90. }
  91. }
  92. pub fn construct_graph(unit: &Arc<Mutex<dyn Unit>>) -> DepGraph {
  93. let mut graph: DepGraph = DepGraph::new();
  94. let unit = unit.lock().unwrap();
  95. let uid = unit.unit_id();
  96. graph.add_node(uid);
  97. let after = (&unit).unit_base().unit_part().after();
  98. //递归添加边来构建图
  99. graph.add_edges(uid, after);
  100. return graph;
  101. }
  102. }