Move trace file opening into TraceDump::new

Moves the responsibility of opening the trace file into TraceDump::new, so that
it doesn't need to be repeated at every call site.
This commit is contained in:
Nick Fitzgerald 2017-03-31 14:37:38 -07:00
parent f003fdf106
commit 9ef436cf8e
2 changed files with 19 additions and 21 deletions

View file

@ -15,10 +15,8 @@ use std::borrow::ToOwned;
use std::cmp::Ordering; use std::cmp::Ordering;
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::error::Error; use std::error::Error;
use std::fs;
use std::fs::File; use std::fs::File;
use std::io::{self, Write}; use std::io::{self, Write};
use std::path;
use std::path::Path; use std::path::Path;
use std::time::Duration; use std::time::Duration;
use std_time::precise_time_ns; use std_time::precise_time_ns;
@ -178,9 +176,7 @@ impl Profiler {
let outputoption = option.clone(); let outputoption = option.clone();
thread::Builder::new().name("Time profiler".to_owned()).spawn(move || { thread::Builder::new().name("Time profiler".to_owned()).spawn(move || {
let trace = file_path.as_ref() let trace = file_path.as_ref()
.map(path::Path::new) .and_then(|p| TraceDump::new(p).ok());
.map(fs::File::create)
.map(|res| TraceDump::new(res.unwrap()));
let mut profiler = Profiler::new(port, trace, Some(outputoption)); let mut profiler = Profiler::new(port, trace, Some(outputoption));
profiler.start(); profiler.start();
}).expect("Thread spawning failed"); }).expect("Thread spawning failed");
@ -207,9 +203,7 @@ impl Profiler {
// Spawn the time profiler // Spawn the time profiler
thread::Builder::new().name("Time profiler".to_owned()).spawn(move || { thread::Builder::new().name("Time profiler".to_owned()).spawn(move || {
let trace = file_path.as_ref() let trace = file_path.as_ref()
.map(path::Path::new) .and_then(|p| TraceDump::new(p).ok());
.map(fs::File::create)
.map(|res| TraceDump::new(res.unwrap()));
let mut profiler = Profiler::new(port, trace, None); let mut profiler = Profiler::new(port, trace, None);
profiler.start(); profiler.start();
}).expect("Thread spawning failed"); }).expect("Thread spawning failed");

View file

@ -7,7 +7,8 @@
use profile_traits::time::{ProfilerCategory, TimerMetadata}; use profile_traits::time::{ProfilerCategory, TimerMetadata};
use serde_json; use serde_json;
use std::fs; use std::fs;
use std::io::Write; use std::io::{self, Write};
use std::path;
/// An RAII class for writing the HTML trace dump. /// An RAII class for writing the HTML trace dump.
#[derive(Debug)] #[derive(Debug)]
@ -36,9 +37,12 @@ struct TraceEntry {
impl TraceDump { impl TraceDump {
/// Create a new TraceDump and write the prologue of the HTML file out to /// Create a new TraceDump and write the prologue of the HTML file out to
/// disk. /// disk.
pub fn new(mut file: fs::File) -> TraceDump { pub fn new<P>(trace_file_path: P) -> io::Result<TraceDump>
write_prologue(&mut file); where P: AsRef<path::Path>
TraceDump { file: file } {
let mut file = fs::File::create(trace_file_path)?;
write_prologue(&mut file)?;
Ok(TraceDump { file: file })
} }
/// Write one trace to the trace dump file. /// Write one trace to the trace dump file.
@ -63,18 +67,18 @@ impl Drop for TraceDump {
/// Write the epilogue of the trace dump HTML file out to disk on /// Write the epilogue of the trace dump HTML file out to disk on
/// destruction. /// destruction.
fn drop(&mut self) { fn drop(&mut self) {
write_epilogue(&mut self.file); write_epilogue(&mut self.file).unwrap();
} }
} }
fn write_prologue(file: &mut fs::File) { fn write_prologue(file: &mut fs::File) -> io::Result<()> {
writeln!(file, "{}", include_str!("./trace-dump-prologue-1.html")).unwrap(); writeln!(file, "{}", include_str!("./trace-dump-prologue-1.html"))?;
writeln!(file, "{}", include_str!("./trace-dump.css")).unwrap(); writeln!(file, "{}", include_str!("./trace-dump.css"))?;
writeln!(file, "{}", include_str!("./trace-dump-prologue-2.html")).unwrap(); writeln!(file, "{}", include_str!("./trace-dump-prologue-2.html"))
} }
fn write_epilogue(file: &mut fs::File) { fn write_epilogue(file: &mut fs::File) -> io::Result<()> {
writeln!(file, "{}", include_str!("./trace-dump-epilogue-1.html")).unwrap(); writeln!(file, "{}", include_str!("./trace-dump-epilogue-1.html"))?;
writeln!(file, "{}", include_str!("./trace-dump.js")).unwrap(); writeln!(file, "{}", include_str!("./trace-dump.js"))?;
writeln!(file, "{}", include_str!("./trace-dump-epilogue-2.html")).unwrap(); writeln!(file, "{}", include_str!("./trace-dump-epilogue-2.html"))
} }