diff --git a/measureme/src/file_serialization_sink.rs b/measureme/src/file_serialization_sink.rs index 28a9453..0e63ad4 100644 --- a/measureme/src/file_serialization_sink.rs +++ b/measureme/src/file_serialization_sink.rs @@ -1,4 +1,5 @@ use crate::serialization::{Addr, SerializationSink}; +use std::error::Error; use std::fs; use std::io::{BufWriter, Write}; use std::path::Path; @@ -9,16 +10,14 @@ pub struct FileSerializationSink { } impl SerializationSink for FileSerializationSink { - fn from_path(path: &Path) -> Self { - // TODO: This is very crude error handling. - // https://github.com/rust-lang/measureme/issues/9 - fs::create_dir_all(path.parent().unwrap()).unwrap(); + fn from_path(path: &Path) -> Result> { + fs::create_dir_all(path.parent().unwrap())?; - let file = fs::File::create(path).expect("couldn't open file: {}"); + let file = fs::File::create(path)?; - FileSerializationSink { + Ok(FileSerializationSink { data: Mutex::new((BufWriter::new(file), 0)), - } + }) } #[inline] diff --git a/measureme/src/mmap_serialization_sink.rs b/measureme/src/mmap_serialization_sink.rs index eb005db..35ad901 100644 --- a/measureme/src/mmap_serialization_sink.rs +++ b/measureme/src/mmap_serialization_sink.rs @@ -1,5 +1,6 @@ use crate::serialization::{Addr, SerializationSink}; use memmap::{MmapMut}; +use std::error::Error; use std::io::{Write, BufWriter}; use std::fs::{File}; use std::path::{Path, PathBuf}; @@ -12,17 +13,17 @@ pub struct MmapSerializationSink { } impl SerializationSink for MmapSerializationSink { - fn from_path(path: &Path) -> Self { + fn from_path(path: &Path) -> Result> { // Lazily allocate 1 GB :O let file_size = 1 << 30; - let mapped_file = MmapMut::map_anon(file_size).unwrap(); + let mapped_file = MmapMut::map_anon(file_size)?; - MmapSerializationSink { + Ok(MmapSerializationSink { mapped_file, current_pos: AtomicUsize::new(0), path: path.to_path_buf(), - } + }) } #[inline] diff --git a/measureme/src/profiler.rs b/measureme/src/profiler.rs index 4a7a2c3..0692f7b 100644 --- a/measureme/src/profiler.rs +++ b/measureme/src/profiler.rs @@ -1,6 +1,7 @@ use crate::raw_event::{RawEvent, Timestamp, TimestampKind}; use crate::serialization::SerializationSink; use crate::stringtable::{SerializableString, StringId, StringTableBuilder}; +use std::error::Error; use std::path::{Path, PathBuf}; use std::sync::Arc; use std::time::Instant; @@ -28,19 +29,19 @@ pub struct Profiler { } impl Profiler { - pub fn new(path_stem: &Path) -> Profiler { + pub fn new(path_stem: &Path) -> Result, Box> { let paths = ProfilerFiles::new(path_stem); - let event_sink = Arc::new(S::from_path(&paths.events_file)); + let event_sink = Arc::new(S::from_path(&paths.events_file)?); let string_table = StringTableBuilder::new( - Arc::new(S::from_path(&paths.string_data_file)), - Arc::new(S::from_path(&paths.string_index_file)), + Arc::new(S::from_path(&paths.string_data_file)?), + Arc::new(S::from_path(&paths.string_index_file)?), ); - Profiler { + Ok(Profiler { event_sink, string_table, start_time: Instant::now(), - } + }) } #[inline(always)] diff --git a/measureme/src/serialization.rs b/measureme/src/serialization.rs index 415a1b4..f7bb6dd 100644 --- a/measureme/src/serialization.rs +++ b/measureme/src/serialization.rs @@ -1,3 +1,4 @@ +use std::error::Error; use std::path::Path; #[derive(Clone, Copy, Eq, PartialEq, Debug)] @@ -9,8 +10,8 @@ impl Addr { } } -pub trait SerializationSink { - fn from_path(path: &Path) -> Self; +pub trait SerializationSink: Sized { + fn from_path(path: &Path) -> Result>; fn write_atomic(&self, num_bytes: usize, write: W) -> Addr where @@ -39,7 +40,7 @@ pub mod test { } impl SerializationSink for TestSink { - fn from_path(_path: &Path) -> Self { + fn from_path(_path: &Path) -> Result> { unimplemented!() } diff --git a/measureme/src/testing_common.rs b/measureme/src/testing_common.rs index a7dacc8..14bee8a 100644 --- a/measureme/src/testing_common.rs +++ b/measureme/src/testing_common.rs @@ -22,7 +22,7 @@ fn mk_filestem(file_name_stem: &str) -> PathBuf { // Generate some profiling data. This is the part that would run in rustc. fn generate_profiling_data(filestem: &Path) -> Vec { - let profiler = Arc::new(Profiler::::new(Path::new(filestem))); + let profiler = Arc::new(Profiler::::new(Path::new(filestem)).unwrap()); let event_id_reserved = StringId::reserved(42);