Skip to content
Snippets Groups Projects
Commit 41b722de authored by Carl Lerche's avatar Carl Lerche
Browse files

Allow checking out AppendBufs from Pool

parent d650404b
No related branches found
No related tags found
No related merge requests found
use super::{Mem, MemRef}; use super::{Mem, MemRef};
use buf::{ByteBuf, MutByteBuf}; use buf::{AppendBuf, ByteBuf, MutByteBuf};
use stable_heap as heap; use stable_heap as heap;
use std::{mem, ptr, isize, usize}; use std::{mem, ptr, isize, usize};
use std::cell::{Cell, UnsafeCell}; use std::cell::{Cell, UnsafeCell};
...@@ -92,6 +92,11 @@ impl Pool { ...@@ -92,6 +92,11 @@ impl Pool {
}) })
} }
pub fn new_append_buf(&self) -> Option<AppendBuf> {
let len = self.inner.buf_len as u32;
self.checkout().map(|mem| unsafe { AppendBuf::from_mem_ref(mem, len, 0) })
}
fn checkout(&self) -> Option<MemRef> { fn checkout(&self) -> Option<MemRef> {
unsafe { unsafe {
let mut ptr = self.inner.next.load(Ordering::Acquire); let mut ptr = self.inner.next.load(Ordering::Acquire);
......
use bytes::{ByteStr, Buf, MutBuf}; use bytes::{ByteStr, Buf, MutBuf};
use bytes::alloc::Pool;
use bytes::buf::AppendBuf; use bytes::buf::AppendBuf;
#[test] #[test]
...@@ -28,3 +29,33 @@ pub fn test_initial_buf_empty() { ...@@ -28,3 +29,33 @@ pub fn test_initial_buf_empty() {
assert_eq!(dst, b"hello world"); assert_eq!(dst, b"hello world");
} }
} }
#[test]
pub fn test_append_buf_from_pool() {
let pool = Pool::with_capacity(2, 256);
// Run in a loop a bunch in hope that if there is a memory issue, it will
// be exposed
for _ in 0..1000 {
let mut buf = pool.new_append_buf().unwrap();
let mut dst: Vec<u8> = vec![];
assert_eq!(buf.remaining(), 256);
buf.write_slice(b"hello world");
assert_eq!(buf.remaining(), 245);
assert_eq!(buf.bytes(), b"hello world");
let view1 = buf.slice(0, 11);
view1.buf().copy_to(&mut dst).unwrap();
assert_eq!(dst, b"hello world");
assert_eq!(view1, buf.slice(0, 11));
drop(buf);
let mut buf = pool.new_append_buf().unwrap();
buf.write_slice(b"zomg no no no no");
assert_eq!(dst, b"hello world");
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment