Skip to content

Commit 9e1eb06

Browse files
committed
glib: Optimize GlibLogger to avoid some copies
1 parent 86a44d4 commit 9e1eb06

File tree

1 file changed

+67
-46
lines changed

1 file changed

+67
-46
lines changed

glib/src/bridged_logging.rs

Lines changed: 67 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ pub enum GlibLoggerFormat {
1919
LineAndFile,
2020
// rustdoc-stripper-ignore-next
2121
/// A logger using glib structured logging. Structured logging is available
22-
/// only on features `v2_56` and later.
23-
#[cfg(any(feature = "v2_56", feature = "dox"))]
22+
/// only on features `v2_50` and later.
23+
#[cfg(any(feature = "v2_50", feature = "dox"))]
24+
#[cfg_attr(feature = "dox", doc(cfg(feature = "v2_50")))]
2425
Structured,
2526
}
2627

@@ -104,15 +105,15 @@ impl GlibLogger {
104105
Self { format, domain }
105106
}
106107

107-
fn level_to_glib(level: rs_log::Level) -> crate::ffi::GLogLevelFlags {
108+
fn level_to_glib(level: rs_log::Level) -> crate::LogLevel {
108109
match level {
109110
// Errors are mapped to critical to avoid automatic termination
110-
rs_log::Level::Error => crate::ffi::G_LOG_LEVEL_CRITICAL,
111-
rs_log::Level::Warn => crate::ffi::G_LOG_LEVEL_WARNING,
112-
rs_log::Level::Info => crate::ffi::G_LOG_LEVEL_INFO,
113-
rs_log::Level::Debug => crate::ffi::G_LOG_LEVEL_DEBUG,
111+
rs_log::Level::Error => crate::LogLevel::Critical,
112+
rs_log::Level::Warn => crate::LogLevel::Warning,
113+
rs_log::Level::Info => crate::LogLevel::Info,
114+
rs_log::Level::Debug => crate::LogLevel::Debug,
114115
// There is no equivalent to trace level in glib
115-
rs_log::Level::Trace => crate::ffi::G_LOG_LEVEL_DEBUG,
116+
rs_log::Level::Trace => crate::LogLevel::Debug,
116117
}
117118
}
118119

@@ -121,16 +122,14 @@ impl GlibLogger {
121122
unsafe {
122123
crate::ffi::g_log(
123124
domain.to_glib_none().0,
124-
GlibLogger::level_to_glib(level),
125+
GlibLogger::level_to_glib(level).into_glib(),
125126
b"%s\0".as_ptr() as *const _,
126127
ToGlibPtr::<*const std::os::raw::c_char>::to_glib_none(message).0,
127128
);
128129
}
129130
}
130131

131-
#[cfg(any(feature = "v2_56", feature = "dox"))]
132-
#[cfg_attr(feature = "dox", doc(cfg(feature = "v2_56")))]
133-
#[doc(alias = "g_log_structured_standard")]
132+
#[cfg(any(feature = "v2_50", feature = "dox"))]
134133
fn write_log_structured(
135134
domain: Option<&str>,
136135
level: rs_log::Level,
@@ -139,24 +138,19 @@ impl GlibLogger {
139138
func: Option<&str>,
140139
message: &str,
141140
) {
142-
let line_str = line.map(|l| l.to_string());
141+
let line = line.map(|l| l.to_string());
142+
let line = line.as_ref().map(|s| s.as_str());
143143

144-
let domain = domain.unwrap_or("default");
145-
let file = file.unwrap_or("<unknown file>");
146-
let line_str = line_str.unwrap_or_else(|| String::from("<unknown line>"));
147-
let func = func.unwrap_or("<unknown module path>");
148-
149-
unsafe {
150-
crate::ffi::g_log_structured_standard(
151-
domain.to_glib_none().0,
152-
GlibLogger::level_to_glib(level),
153-
file.to_glib_none().0,
154-
line_str.to_glib_none().0,
155-
func.to_glib_none().0,
156-
b"%s\0".as_ptr() as *const _,
157-
ToGlibPtr::<*const std::os::raw::c_char>::to_glib_none(message).0,
158-
);
159-
}
144+
crate::log_structured!(
145+
domain.unwrap_or("default"),
146+
GlibLogger::level_to_glib(level),
147+
{
148+
"CODE_FILE" => file.unwrap_or("<unknown file>");
149+
"CODE_LINE" => line.unwrap_or("<unknown line>");
150+
"CODE_FUNC" => func.unwrap_or("<unknown module path>");
151+
"MESSAGE" => message;
152+
}
153+
);
160154
}
161155
}
162156

@@ -178,28 +172,55 @@ impl rs_log::Log for GlibLogger {
178172

179173
match self.format {
180174
GlibLoggerFormat::Plain => {
181-
let s = format!("{}", record.args());
182-
GlibLogger::write_log(domain, record.level(), &s)
175+
let args = record.args();
176+
if let Some(s) = args.as_str() {
177+
GlibLogger::write_log(domain, record.level(), s);
178+
} else {
179+
GlibLogger::write_log(domain, record.level(), &args.to_string());
180+
}
183181
}
184182
GlibLoggerFormat::LineAndFile => {
185-
let s = match (record.file(), record.line()) {
186-
(Some(file), Some(line)) => format!("{}:{}: {}", file, line, record.args()),
187-
(Some(file), None) => format!("{}: {}", file, record.args()),
188-
_ => format!("{}", record.args()),
183+
match (record.file(), record.line()) {
184+
(Some(file), Some(line)) => {
185+
let s = format!("{}:{}: {}", file, line, record.args());
186+
GlibLogger::write_log(domain, record.level(), &s);
187+
}
188+
(Some(file), None) => {
189+
let s = format!("{}: {}", file, record.args());
190+
GlibLogger::write_log(domain, record.level(), &s);
191+
}
192+
_ => {
193+
let args = record.args();
194+
if let Some(s) = args.as_str() {
195+
GlibLogger::write_log(domain, record.level(), s);
196+
} else {
197+
GlibLogger::write_log(domain, record.level(), &args.to_string());
198+
}
199+
}
189200
};
190-
191-
GlibLogger::write_log(domain, record.level(), &s);
192201
}
193-
#[cfg(any(feature = "v2_56", feature = "dox"))]
202+
#[cfg(any(feature = "v2_50", feature = "dox"))]
194203
GlibLoggerFormat::Structured => {
195-
GlibLogger::write_log_structured(
196-
domain,
197-
record.level(),
198-
record.file(),
199-
record.line(),
200-
record.module_path(),
201-
&format!("{}", record.args()),
202-
);
204+
let args = record.args();
205+
if let Some(s) = args.as_str() {
206+
GlibLogger::write_log_structured(
207+
domain,
208+
record.level(),
209+
record.file(),
210+
record.line(),
211+
record.module_path(),
212+
s,
213+
);
214+
} else {
215+
GlibLogger::write_log_structured(
216+
domain,
217+
record.level(),
218+
record.file(),
219+
record.line(),
220+
record.module_path(),
221+
&args.to_string(),
222+
);
223+
}
203224
}
204225
};
205226
}

0 commit comments

Comments
 (0)