Skip to content

Commit 8e8feb8

Browse files
committed
glib: Optimize GlibLogger to avoid some copies
1 parent 1275cb3 commit 8e8feb8

File tree

1 file changed

+66
-46
lines changed

1 file changed

+66
-46
lines changed

glib/src/bridged_logging.rs

Lines changed: 66 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ 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"))]
2424
Structured,
2525
}
2626

@@ -104,15 +104,15 @@ impl GlibLogger {
104104
Self { format, domain }
105105
}
106106

107-
fn level_to_glib(level: rs_log::Level) -> crate::ffi::GLogLevelFlags {
107+
fn level_to_glib(level: rs_log::Level) -> crate::LogLevel {
108108
match level {
109109
// 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,
110+
rs_log::Level::Error => crate::LogLevel::Critical,
111+
rs_log::Level::Warn => crate::LogLevel::Warning,
112+
rs_log::Level::Info => crate::LogLevel::Info,
113+
rs_log::Level::Debug => crate::LogLevel::Debug,
114114
// There is no equivalent to trace level in glib
115-
rs_log::Level::Trace => crate::ffi::G_LOG_LEVEL_DEBUG,
115+
rs_log::Level::Trace => crate::LogLevel::Debug,
116116
}
117117
}
118118

@@ -121,16 +121,14 @@ impl GlibLogger {
121121
unsafe {
122122
crate::ffi::g_log(
123123
domain.to_glib_none().0,
124-
GlibLogger::level_to_glib(level),
124+
GlibLogger::level_to_glib(level).into_glib(),
125125
b"%s\0".as_ptr() as *const _,
126126
ToGlibPtr::<*const std::os::raw::c_char>::to_glib_none(message).0,
127127
);
128128
}
129129
}
130130

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")]
131+
#[cfg(feature = "v2_50")]
134132
fn write_log_structured(
135133
domain: Option<&str>,
136134
level: rs_log::Level,
@@ -139,24 +137,19 @@ impl GlibLogger {
139137
func: Option<&str>,
140138
message: &str,
141139
) {
142-
let line_str = line.map(|l| l.to_string());
140+
let line = line.map(|l| l.to_string());
141+
let line = line.as_ref().map(|s| s.as_str());
143142

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-
}
143+
crate::log_structured!(
144+
domain.unwrap_or("default"),
145+
GlibLogger::level_to_glib(level),
146+
{
147+
"CODE_FILE" => file.unwrap_or("<unknown file>");
148+
"CODE_LINE" => line.unwrap_or("<unknown line>");
149+
"CODE_FUNC" => func.unwrap_or("<unknown module path>");
150+
"MESSAGE" => message;
151+
}
152+
);
160153
}
161154
}
162155

@@ -178,28 +171,55 @@ impl rs_log::Log for GlibLogger {
178171

179172
match self.format {
180173
GlibLoggerFormat::Plain => {
181-
let s = format!("{}", record.args());
182-
GlibLogger::write_log(domain, record.level(), &s)
174+
let args = record.args();
175+
if let Some(s) = args.as_str() {
176+
GlibLogger::write_log(domain, record.level(), s);
177+
} else {
178+
GlibLogger::write_log(domain, record.level(), &args.to_string());
179+
}
183180
}
184181
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()),
182+
match (record.file(), record.line()) {
183+
(Some(file), Some(line)) => {
184+
let s = format!("{}:{}: {}", file, line, record.args());
185+
GlibLogger::write_log(domain, record.level(), &s);
186+
}
187+
(Some(file), None) => {
188+
let s = format!("{}: {}", file, record.args());
189+
GlibLogger::write_log(domain, record.level(), &s);
190+
}
191+
_ => {
192+
let args = record.args();
193+
if let Some(s) = args.as_str() {
194+
GlibLogger::write_log(domain, record.level(), s);
195+
} else {
196+
GlibLogger::write_log(domain, record.level(), &args.to_string());
197+
}
198+
}
189199
};
190-
191-
GlibLogger::write_log(domain, record.level(), &s);
192200
}
193-
#[cfg(any(feature = "v2_56", feature = "dox"))]
201+
#[cfg(feature = "v2_50")]
194202
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-
);
203+
let args = record.args();
204+
if let Some(s) = args.as_str() {
205+
GlibLogger::write_log_structured(
206+
domain,
207+
record.level(),
208+
record.file(),
209+
record.line(),
210+
record.module_path(),
211+
s,
212+
);
213+
} else {
214+
GlibLogger::write_log_structured(
215+
domain,
216+
record.level(),
217+
record.file(),
218+
record.line(),
219+
record.module_path(),
220+
&args.to_string(),
221+
);
222+
}
203223
}
204224
};
205225
}

0 commit comments

Comments
 (0)