micromegas_tracing/logs/
block.rs

1use 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>;