Skip to content

Commit d404767

Browse files
committed
🎨 Separate log writer from logger
Problem: - Some clients are very sensitive to exactly how log functions are (or are not) inlined; they need to be able to replace the minimum. At the moment, changing inline characteristics for log writing involves copying the entire default logger. Solution: - Separate the log writer so that it can be separately controlled.
1 parent d40c4de commit d404767

File tree

1 file changed

+30
-29
lines changed

1 file changed

+30
-29
lines changed

include/log/catalog/mipi_encoder.hpp

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,33 @@ template <stdx::ct_string S> constexpr auto to_module() {
3939
}
4040
} // namespace detail
4141

42-
template <typename TDestinations> struct log_handler {
43-
constexpr explicit log_handler(TDestinations &&ds) : dests{std::move(ds)} {}
42+
template <typename Destinations> struct log_writer {
43+
template <std::size_t N>
44+
auto write(stdx::span<std::uint8_t const, N> msg) -> void {
45+
stdx::for_each(
46+
[&]<typename Dest>(Dest &dest) {
47+
conc::call_in_critical_section<Dest>(
48+
[&] { dest.log_by_buf(msg); });
49+
},
50+
dests);
51+
}
52+
53+
template <std::size_t N>
54+
auto write(stdx::span<std::uint32_t const, N> msg) -> void {
55+
[&]<std::size_t... Is>(std::index_sequence<Is...>) {
56+
stdx::for_each(
57+
[&]<typename Dest>(Dest &dest) {
58+
conc::call_in_critical_section<Dest>(
59+
[&] { dest.log_by_args(msg[Is]...); });
60+
},
61+
dests);
62+
}(std::make_index_sequence<N>{});
63+
}
64+
65+
Destinations dests;
66+
};
4467

68+
template <typename Writer> struct log_handler {
4569
template <typename Env, typename FilenameStringType,
4670
typename LineNumberType, typename MsgType>
4771
auto log(FilenameStringType, LineNumberType, MsgType const &msg) -> void {
@@ -88,40 +112,17 @@ template <typename TDestinations> struct log_handler {
88112
}
89113
}
90114

91-
private:
92-
template <std::size_t N>
93-
auto write(stdx::span<std::uint8_t const, N> msg) -> void {
94-
stdx::for_each(
95-
[&]<typename Dest>(Dest &dest) {
96-
conc::call_in_critical_section<Dest>(
97-
[&] { dest.log_by_buf(msg); });
98-
},
99-
dests);
100-
}
101-
102-
template <std::size_t N>
103-
auto write(stdx::span<std::uint32_t const, N> msg) -> void {
104-
[&]<std::size_t... Is>(std::index_sequence<Is...>) {
105-
stdx::for_each(
106-
[&]<typename Dest>(Dest &dest) {
107-
conc::call_in_critical_section<Dest>(
108-
[&] { dest.log_by_args(msg[Is]...); });
109-
},
110-
dests);
111-
}(std::make_index_sequence<N>{});
112-
}
113-
114-
auto write(auto const &msg) -> void { write(msg.as_const_view().data()); }
115+
auto write(auto const &msg) -> void { w.write(msg.as_const_view().data()); }
115116

116-
TDestinations dests;
117+
Writer w;
117118
};
118119

119120
template <typename... TDestinations> struct config {
120121
using destinations_tuple_t = stdx::tuple<TDestinations...>;
121122
constexpr explicit config(TDestinations... dests)
122-
: logger{stdx::tuple{std::move(dests)...}} {}
123+
: logger{log_writer{stdx::tuple{std::move(dests)...}}} {}
123124

124-
log_handler<destinations_tuple_t> logger;
125+
log_handler<log_writer<destinations_tuple_t>> logger;
125126
};
126127
template <typename... Ts> config(Ts...) -> config<Ts...>;
127128
} // namespace logging::mipi

0 commit comments

Comments
 (0)