async_tensorrt/ffi/
memory.rs1use cpp::cpp;
2
3pub struct HostBuffer(*mut std::ffi::c_void);
4
5unsafe impl Send for HostBuffer {}
11
12unsafe impl Sync for HostBuffer {}
18
19impl HostBuffer {
23 #[inline]
29 pub(crate) fn wrap(internal: *mut std::ffi::c_void) -> Self {
30 HostBuffer(internal)
31 }
32
33 #[inline]
35 pub fn as_bytes(&self) -> &[u8] {
36 let data = self.data() as *const u8;
37 let size = self.size();
38 unsafe { std::slice::from_raw_parts(data, size) }
42 }
43
44 #[inline]
48 pub fn data(&self) -> *const std::ffi::c_void {
49 let internal = self.as_ptr();
50 cpp!(unsafe [
51 internal as "const void*"
52 ] -> *mut std::ffi::c_void as "void*" {
53 return ((const IHostMemory*) internal)->data();
54 })
55 }
56
57 #[inline]
61 pub fn size(&self) -> usize {
62 let internal = self.as_ptr();
63 cpp!(unsafe [
64 internal as "const void*"
65 ] -> usize as "std::size_t" {
66 return ((const IHostMemory*) internal)->size();
67 })
68 }
69
70 #[inline(always)]
72 pub fn as_ptr(&self) -> *const std::ffi::c_void {
73 let HostBuffer(internal) = *self;
74 internal
75 }
76
77 #[inline(always)]
79 pub fn as_mut_ptr(&mut self) -> *mut std::ffi::c_void {
80 let HostBuffer(internal) = *self;
81 internal
82 }
83}
84
85impl Drop for HostBuffer {
86 fn drop(&mut self) {
87 let internal = self.as_mut_ptr();
88 cpp!(unsafe [
89 internal as "void*"
90 ] {
91 destroy((IHostMemory*) internal);
92 });
93 }
94}
95
96#[cfg(test)]
97mod tests {
98 use crate::tests::utils::*;
99
100 #[tokio::test]
101 async fn test_host_buffer_data_and_size() {
102 let network_plan = simple_network_plan!();
103 assert!(!network_plan.data().is_null());
104 assert!(network_plan.size() > 0);
105 let bytes = network_plan.as_bytes();
106 assert_eq!(unsafe { *(network_plan.data() as *const u8) }, bytes[0]);
107 assert_eq!(network_plan.size(), bytes.len());
108 }
109}