micromegas_tracing/logs/
block.rs1use super::{
2 LogMetadata, LogMetadataRecord, LogStaticStrEvent, LogStaticStrInteropEvent, LogStringEvent,
3 LogStringInteropEvent, TaggedLogString,
4};
5use crate::{
6 event::{EventBlock, EventStream, ExtractDeps},
7 property_set::{PropertySet, PropertySetDependency},
8};
9use micromegas_transit::{StaticStringDependency, Utf8StaticStringDependency, prelude::*};
10use std::collections::HashSet;
11
12declare_queue_struct!(
13 struct LogMsgQueue<
14 LogStaticStrEvent,
15 LogStringEvent,
16 LogStaticStrInteropEvent,
17 LogStringInteropEvent,
18 TaggedLogString,
19 > {}
20);
21
22declare_queue_struct!(
23 struct LogDepsQueue<
24 Utf8StaticStringDependency,
25 StaticStringDependency,
26 LogMetadataRecord,
27 PropertySetDependency,
28 > {}
29);
30
31fn record_log_event_dependencies(
32 log_desc: &LogMetadata,
33 recorded_deps: &mut HashSet<u64>,
34 deps: &mut LogDepsQueue,
35) {
36 let log_ptr = log_desc as *const _ as u64;
37 if recorded_deps.insert(log_ptr) {
38 let name = Utf8StaticStringDependency::from(log_desc.fmt_str);
39 if recorded_deps.insert(name.ptr as u64) {
40 deps.push(name);
41 }
42 let target = Utf8StaticStringDependency::from(log_desc.target);
43 if recorded_deps.insert(target.ptr as u64) {
44 deps.push(target);
45 }
46 let module_path = Utf8StaticStringDependency::from(log_desc.module_path);
47 if recorded_deps.insert(module_path.ptr as u64) {
48 deps.push(module_path);
49 }
50 let file = Utf8StaticStringDependency::from(log_desc.file);
51 if recorded_deps.insert(file.ptr as u64) {
52 deps.push(file);
53 }
54 deps.push(LogMetadataRecord {
55 id: log_ptr,
56 level: log_desc.level as u32,
57 fmt_str: log_desc.fmt_str.as_ptr(),
58 target: log_desc.target.as_ptr(),
59 module_path: log_desc.module_path.as_ptr(),
60 file: log_desc.file.as_ptr(),
61 line: log_desc.line,
62 });
63 }
64}
65
66fn record_properties(
67 set: &'static PropertySet,
68 recorded_deps: &mut HashSet<u64>,
69 deps: &mut LogDepsQueue,
70) {
71 let id = set as *const _ as u64;
72 if recorded_deps.insert(id) {
73 for prop in set.get_properties() {
74 if recorded_deps.insert(prop.name.id()) {
75 deps.push(prop.name.into_dependency());
76 }
77 if recorded_deps.insert(prop.value.id()) {
78 deps.push(prop.value.into_dependency());
79 }
80 }
81 deps.push(PropertySetDependency::new(set));
82 }
83}
84
85impl ExtractDeps for LogMsgQueue {
86 type DepsQueue = LogDepsQueue;
87
88 fn extract(&self) -> Self::DepsQueue {
89 let mut deps = LogDepsQueue::new(1024 * 1024);
90 let mut recorded_deps = HashSet::new();
91 for x in self.iter() {
92 match x {
93 LogMsgQueueAny::LogStaticStrEvent(evt) => {
94 record_log_event_dependencies(evt.desc, &mut recorded_deps, &mut deps);
95 }
96 LogMsgQueueAny::LogStringEvent(evt) => {
97 record_log_event_dependencies(evt.desc, &mut recorded_deps, &mut deps);
98 }
99 LogMsgQueueAny::LogStaticStrInteropEvent(evt) => {
100 if recorded_deps.insert(evt.target.id()) {
101 deps.push(Utf8StaticStringDependency::from(&evt.target));
102 }
103 if recorded_deps.insert(evt.msg.id()) {
104 deps.push(Utf8StaticStringDependency::from(&evt.msg));
105 }
106 }
107 LogMsgQueueAny::LogStringInteropEvent(evt) => {
108 if recorded_deps.insert(evt.target.id()) {
109 deps.push(evt.target.into_dependency());
110 }
111 }
112 LogMsgQueueAny::TaggedLogString(evt) => {
113 record_log_event_dependencies(evt.desc, &mut recorded_deps, &mut deps);
114 record_properties(evt.properties, &mut recorded_deps, &mut deps);
115 }
116 }
117 }
118 deps
119 }
120}
121
122pub type LogBlock = EventBlock<LogMsgQueue>;
123pub type LogStream = EventStream<LogBlock>;