Unverified Commit 2788c4df authored by Xinye Tao's avatar Xinye Tao Committed by GitHub

refactor usage of `Arc` (#595)

Accept generic construct instead of Arc to avoid nested arc required to bridge different crates. Also fix a missing export.
Signed-off-by: 's avatartabokie <xy.tao@outlook.com>
parent dd50d920
......@@ -69,19 +69,19 @@ fn copy_error<T: Into<Vec<u8>>>(err: T) -> *const c_char {
unsafe { libc::strdup(cstr.as_ptr()) }
}
extern "C" fn encryption_key_manager_destructor(ctx: *mut c_void) {
extern "C" fn encryption_key_manager_destructor<T: EncryptionKeyManager>(ctx: *mut c_void) {
unsafe {
// Recover from raw pointer and implicitly drop.
Box::from_raw(ctx as *mut Arc<dyn EncryptionKeyManager>);
Box::from_raw(ctx as *mut T);
}
}
extern "C" fn encryption_key_manager_get_file(
extern "C" fn encryption_key_manager_get_file<T: EncryptionKeyManager>(
ctx: *mut c_void,
fname: *const c_char,
file_info: *mut DBFileEncryptionInfo,
) -> *const c_char {
let key_manager = unsafe { &*(ctx as *mut Arc<dyn EncryptionKeyManager>) };
let key_manager = unsafe { &*(ctx as *mut T) };
let fname = match unsafe { CStr::from_ptr(fname).to_str() } {
Ok(ret) => ret,
Err(err) => {
......@@ -102,12 +102,12 @@ extern "C" fn encryption_key_manager_get_file(
}
}
extern "C" fn encryption_key_manager_new_file(
extern "C" fn encryption_key_manager_new_file<T: EncryptionKeyManager>(
ctx: *mut c_void,
fname: *const c_char,
file_info: *mut DBFileEncryptionInfo,
) -> *const c_char {
let key_manager = unsafe { &*(ctx as *mut Arc<dyn EncryptionKeyManager>) };
let key_manager = unsafe { &*(ctx as *mut T) };
let fname = match unsafe { CStr::from_ptr(fname).to_str() } {
Ok(ret) => ret,
Err(err) => {
......@@ -128,11 +128,11 @@ extern "C" fn encryption_key_manager_new_file(
}
}
extern "C" fn encryption_key_manager_delete_file(
extern "C" fn encryption_key_manager_delete_file<T: EncryptionKeyManager>(
ctx: *mut c_void,
fname: *const c_char,
) -> *const c_char {
let key_manager = unsafe { &*(ctx as *mut Arc<dyn EncryptionKeyManager>) };
let key_manager = unsafe { &*(ctx as *mut T) };
let fname = match unsafe { CStr::from_ptr(fname).to_str() } {
Ok(ret) => ret,
Err(err) => {
......@@ -151,12 +151,12 @@ extern "C" fn encryption_key_manager_delete_file(
}
}
extern "C" fn encryption_key_manager_link_file(
extern "C" fn encryption_key_manager_link_file<T: EncryptionKeyManager>(
ctx: *mut c_void,
src_fname: *const c_char,
dst_fname: *const c_char,
) -> *const c_char {
let key_manager = unsafe { &*(ctx as *mut Arc<dyn EncryptionKeyManager>) };
let key_manager = unsafe { &*(ctx as *mut T) };
let src_fname = match unsafe { CStr::from_ptr(src_fname).to_str() } {
Ok(ret) => ret,
Err(err) => {
......@@ -192,18 +192,16 @@ unsafe impl Send for DBEncryptionKeyManager {}
unsafe impl Sync for DBEncryptionKeyManager {}
impl DBEncryptionKeyManager {
pub fn new(key_manager: Arc<dyn EncryptionKeyManager>) -> DBEncryptionKeyManager {
// Size of Arc<dyn T>::into_raw is of 128-bits, which couldn't be used as C-style pointer.
// Boxing it to make a 64-bits pointer.
pub fn new<T: EncryptionKeyManager>(key_manager: T) -> DBEncryptionKeyManager {
let ctx = Box::into_raw(Box::new(key_manager)) as *mut c_void;
let instance = unsafe {
crocksdb_ffi::crocksdb_encryption_key_manager_create(
ctx,
encryption_key_manager_destructor,
encryption_key_manager_get_file,
encryption_key_manager_new_file,
encryption_key_manager_delete_file,
encryption_key_manager_link_file,
encryption_key_manager_destructor::<T>,
encryption_key_manager_get_file::<T>,
encryption_key_manager_new_file::<T>,
encryption_key_manager_delete_file::<T>,
encryption_key_manager_link_file::<T>,
)
};
DBEncryptionKeyManager { inner: instance }
......@@ -387,7 +385,7 @@ mod test {
}
}
impl EncryptionKeyManager for Mutex<TestEncryptionKeyManager> {
impl EncryptionKeyManager for Arc<Mutex<TestEncryptionKeyManager>> {
fn get_file(&self, fname: &str) -> Result<FileEncryptionInfo> {
let key_manager = self.lock().unwrap();
key_manager.get_file_called.fetch_add(1, Ordering::SeqCst);
......
......@@ -3,7 +3,6 @@
pub use crocksdb_ffi::{self, DBFileSystemInspectorInstance};
use libc::{c_char, c_void, size_t, strdup};
use std::sync::Arc;
// Inspect global IO flow. No per-file inspection for now.
pub trait FileSystemInspector: Sync + Send {
......@@ -11,19 +10,19 @@ pub trait FileSystemInspector: Sync + Send {
fn write(&self, len: usize) -> Result<usize, String>;
}
extern "C" fn file_system_inspector_destructor(ctx: *mut c_void) {
extern "C" fn file_system_inspector_destructor<T: FileSystemInspector>(ctx: *mut c_void) {
unsafe {
// Recover from raw pointer and implicitly drop.
Box::from_raw(ctx as *mut Arc<dyn FileSystemInspector>);
Box::from_raw(ctx as *mut T);
}
}
extern "C" fn file_system_inspector_read(
extern "C" fn file_system_inspector_read<T: FileSystemInspector>(
ctx: *mut c_void,
len: size_t,
errptr: *mut *mut c_char,
) -> size_t {
let file_system_inspector = unsafe { &*(ctx as *mut Arc<dyn FileSystemInspector>) };
let file_system_inspector = unsafe { &*(ctx as *mut T) };
match file_system_inspector.read(len) {
Ok(ret) => ret,
Err(e) => {
......@@ -35,12 +34,12 @@ extern "C" fn file_system_inspector_read(
}
}
extern "C" fn file_system_inspector_write(
extern "C" fn file_system_inspector_write<T: FileSystemInspector>(
ctx: *mut c_void,
len: size_t,
errptr: *mut *mut c_char,
) -> size_t {
let file_system_inspector = unsafe { &*(ctx as *mut Arc<dyn FileSystemInspector>) };
let file_system_inspector = unsafe { &*(ctx as *mut T) };
match file_system_inspector.write(len) {
Ok(ret) => ret,
Err(e) => {
......@@ -60,16 +59,14 @@ unsafe impl Send for DBFileSystemInspector {}
unsafe impl Sync for DBFileSystemInspector {}
impl DBFileSystemInspector {
pub fn new(file_system_inspector: Arc<dyn FileSystemInspector>) -> DBFileSystemInspector {
// Size of Arc<dyn T>::into_raw is of 128-bits, which couldn't be used as C-style pointer.
// Boxing it to make a 64-bits pointer.
pub fn new<T: FileSystemInspector>(file_system_inspector: T) -> DBFileSystemInspector {
let ctx = Box::into_raw(Box::new(file_system_inspector)) as *mut c_void;
let instance = unsafe {
crocksdb_ffi::crocksdb_file_system_inspector_create(
ctx,
file_system_inspector_destructor,
file_system_inspector_read,
file_system_inspector_write,
file_system_inspector_destructor::<T>,
file_system_inspector_read::<T>,
file_system_inspector_write::<T>,
)
};
DBFileSystemInspector { inner: instance }
......@@ -131,7 +128,7 @@ mod test {
}
}
impl FileSystemInspector for Mutex<TestFileSystemInspector> {
impl FileSystemInspector for Arc<Mutex<TestFileSystemInspector>> {
fn read(&self, len: usize) -> Result<usize, String> {
let mut inner = self.lock().unwrap();
inner.read_called += 1;
......
......@@ -41,6 +41,7 @@ pub use event_listener::{
CompactionJobInfo, EventListener, FlushJobInfo, IngestionInfo, SubcompactionJobInfo,
WriteStallInfo,
};
pub use file_system::FileSystemInspector;
pub use librocksdb_sys::{
self as crocksdb_ffi, new_bloom_filter, CompactionPriority, CompactionReason,
DBBackgroundErrorReason, DBBottommostLevelCompaction, DBCompactionStyle, DBCompressionType,
......
......@@ -2654,9 +2654,9 @@ impl Env {
// Create an encrypted env that accepts an external key manager.
#[cfg(feature = "encryption")]
pub fn new_key_managed_encrypted_env(
pub fn new_key_managed_encrypted_env<T: EncryptionKeyManager>(
base_env: Arc<Env>,
key_manager: Arc<dyn EncryptionKeyManager>,
key_manager: T,
) -> Result<Env, String> {
let db_key_manager = DBEncryptionKeyManager::new(key_manager);
let env = unsafe {
......@@ -2671,9 +2671,9 @@ impl Env {
})
}
pub fn new_file_system_inspected_env(
pub fn new_file_system_inspected_env<T: FileSystemInspector>(
base_env: Arc<Env>,
file_system_inspector: Arc<dyn FileSystemInspector>,
file_system_inspector: T,
) -> Result<Env, String> {
let db_file_system_inspector = DBFileSystemInspector::new(file_system_inspector);
let env = unsafe {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment