mod.rs 3.2 KB

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