Rework of FFI, adding a value identifier, so we can keep knowledge of data even when data moves.
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -4,7 +4,7 @@ mod nature_library;
|
||||
mod static_data;
|
||||
mod type_library;
|
||||
|
||||
use crate::ffi::{BorrowedPtr, OwnedPtr};
|
||||
use crate::ffi::{BorrowedPtr, IdentifiablePointer, OwnedPtr};
|
||||
use crate::static_data::*;
|
||||
use std::ffi::{c_char, CStr};
|
||||
use std::ptr::drop_in_place;
|
||||
@@ -14,8 +14,8 @@ macro_rules! library_interface {
|
||||
($library_type:ty, $return_type:ty) => {
|
||||
paste::paste! {
|
||||
#[no_mangle]
|
||||
extern "C" fn [< $library_type:snake _new >](capacity: usize) -> OwnedPtr<$library_type> {
|
||||
Box::into_raw(Box::new($library_type::new(capacity)))
|
||||
extern "C" fn [< $library_type:snake _new >](capacity: usize) -> IdentifiablePointer<$library_type> {
|
||||
Box::new($library_type::new(capacity)).into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
@@ -24,7 +24,7 @@ macro_rules! library_interface {
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn [< $library_type:snake _add >](ptr: OwnedPtr<$library_type>, key: BorrowedPtr<c_char>, value: OwnedPtr<$return_type>) {
|
||||
unsafe extern "C" fn [< $library_type:snake _add >](ptr: OwnedPtr<$library_type>, key: BorrowedPtr<c_char>, value: OwnedPtr<Arc<$return_type>>) {
|
||||
let lib = ptr.as_mut().unwrap();
|
||||
lib.add(&CStr::from_ptr(key).into(), *Box::from_raw(value));
|
||||
}
|
||||
@@ -36,13 +36,13 @@ macro_rules! library_interface {
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn [< $library_type:snake _get >](ptr: OwnedPtr<$library_type>, key: BorrowedPtr<c_char>) -> BorrowedPtr<$return_type> {
|
||||
unsafe extern "C" fn [< $library_type:snake _get >](ptr: OwnedPtr<$library_type>, key: BorrowedPtr<c_char>) -> IdentifiablePointer<Arc<$return_type>> {
|
||||
let lib = ptr.as_mut().unwrap();
|
||||
let v = lib.get(&CStr::from_ptr(key).into());
|
||||
if let Some(value) = v {
|
||||
Arc::as_ptr(value)
|
||||
value.clone().into()
|
||||
} else {
|
||||
std::ptr::null()
|
||||
IdentifiablePointer::none()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user