## 1.3.0 (2020-1-3)
* Expand bytes dev dependency to include 0.5.z.
* Minimum supported rust version is now 1.34.0. CI testing is limited to the
older bytes 0.4.12 release on MSRV. For the latest bytes 0.5.z, tests
require rust ≥1.39.0.
* As `AtomicU64` was stabilized in rust 1.34.0, `olio::mem::MemAdvice` and
`MemHandle` now always uses u64 representation.
## 1.2.0 (2019-9-30)
* Make `olio::mem::MemHandle` a `Sync` type, by replacing the per-handle `Cell`
(for cache of last advice) with another atomic.
* Fix build.rs for `rustc --version` not including git metadata.
* Update dev dependencies rand (0.7.0) and tempfile (3.1.0).
* Minimum supported rust version is now 1.32.0 (to match above dep updates).
## 1.1.0 (2019-5-13)
* On rust 1.34+, where `AtomicU64` is stable, use u64 representation of
`olio::mem::MemAdvice` and `MemHandle` internal state, instead of usize, as
it affords room for 6 advise levels above baseline (currently `Normal`) on
all supported platforms.
* Narrow various dependencies to avoid future MINOR versions, for reliability.
We may subsequently make PATCH releases which _broaden_ private or public
dependencies to include new MINOR releases found _compatible_. Rationale:
Cargo fails to consider MSRV for dependency resolution (rust-lang/rfcs#2495),
and MSRV bumps are common in MINOR releases, including as planned here.
* Add build.rs script to fail fast on an attempt to compile with a rustc below
MSRV, which remains 1.31.0.
## 1.0.1 (2019-3-6)
* Use `AtomicUsize::new`, a `const fn` since rustc 1.24.0. `ATOMIC_USIZE_INIT`
was deprecated as of rust 1.34.0 (nightly).
## 1.0.0 (2018-12-4)
* Update to the rust 2018 edition, including the changes to pass all 2018 idiom
lints (anchored paths, anonymous/elided lifetimes, dyn Trait). _This start
of the 1.x release series has a minimum supported rust version of 1.31.0, and
is thus potentially less stable than prior 0.x releases, which will continue
to be maintained as needed._
* Update (dev dep) to rand 0.6.1, fix deprecation in test.
## 0.5.0 (2018-9-20)
* Use u64 offset with latest *memmap* crate release 0.7.0 in
`ReadSlice::mem_map`. The *memmap* crate minimum version is now 0.7.0.
* Minimum supported rust version is now 1.27.2.
## 0.4.0 (2018-8-13)
* New `mem::MemHandle` wrapper for `Mmap` or other `Deref` byte buffer types,
offering concurrent-aware access advice. This is currently limited to \*nix
`libc::posix_madvise` with a subset of advice flags, and is no-op on other
platforms.
## 0.3.0 (2018-5-22)
* Make `ReadPos` and `ReadSlice` generic over `PosRead` trait, and owned or
reference `File` types (#1):
* Implement `PosRead` trait generically over all `Borrow<File>`.
* Move `ReadPos` and `ReadSlice` types to `olio::fs` module and make them
generic over any `PosRead`. In combination with the above change, for
example, this supports an owned `ReadPos<File>` or shared reference
`ReadPos<&File>` or `ReadPos<Arc<File>>`.
* The existing `olio::fs::rc::ReadPos` and `ReadSlice` become type aliases
of the `Arc<File>` forms of the above, so no breaking change.
* New benchmarks (cargo bench read_all) for sanity checking
`ReadPos`/`ReadSlice` reads vs direct/raw `File` reads. As expected, the
differences here are small (within error margins) in comparison to file I/O
system call cost even with fast SSD/OS-cache. Also, the generic changes did
not have a measurable effect.
dev i7-5600U, rustc 1.27.0-nightly (acd3871ba 2018-05-10):
``` text
test read_all_pos ... bench: 1,716,227 ns/iter (+/- 127,651)
test read_all_raw ... bench: 1,721,675 ns/iter (+/- 85,265)
test read_all_slice ... bench: 1,712,060 ns/iter (+/- 140,824)
```
* `GatheringReader` benchmark improvements with latest rust nightly:
dev i7-5600U, rustc 1.27.0-nightly (acd3871ba 2018-05-10):
``` text
test gather_chained_cursors ... bench: 540,762 ns/iter (+/- 11,658)
test gather_reader ... bench: 34,323 ns/iter (+/- 7,333)
test gather_upfront ... bench: 45,337 ns/iter (+/- 1,058)
test gather_upfront_read_only ... bench: 24,184 ns/iter (+/- 901)
```
## 0.2.0 (2018-5-8)
* Add _mmap_ as "meta" feature over _memmap_.
## 0.1.0 (2018-5-7)
* Initial release, extracted from body-image crate by the same author,
with additional changes listed below.
* New `PosRead` trait, `ReadPos` and `ReadSlice` types.
* `GatheringReader` is now generic over `AsRef<[u8]>` (including
`Bytes`).
* New benchmarks (cargo bench) of reads from `GatheringReader`,
chained `std::io::Cursor` and "upfront" gather with a single `Cursor`.
On my dev host; i7-5600U, rustc 1.27.0-nightly (bd40cbbe1 2018-04-14):
``` text
test gather_chained_cursors ... bench: 558,877 ns/iter (+/- 90,532)
test gather_reader ... bench: 63,256 ns/iter (+/- 2,294)
test gather_upfront ... bench: 64,078 ns/iter (+/- 14,701)
test gather_upfront_read_only ... bench: 40,490 ns/iter (+/- 3,578)
```
Where `gather_chained_cursors` uses standard `Cursor` `Read::chain`
over each buffer and demonstrates the need for the custom
`GatheringReader` in `gather_reader`. Benchmark `gather_upfront`
includes timing the gather operation before a single Cursor
based read, and `gather_upfront_read_only` only times the same
Cursor based read. Particular CPU/RAM bandwidth, CPU cache size,
body size and concurrency may all effect the relative performance of
the `GatheringReader` vs. upfront gather.