@@ -4,6 +4,7 @@ use defines::{AfError, DType};
4
4
use error:: HANDLE_ERROR ;
5
5
use self :: libc:: { c_int, size_t, c_char, c_void} ;
6
6
use std:: ffi:: CString ;
7
+ use util:: free_host;
7
8
8
9
extern {
9
10
fn af_get_version ( major : * mut c_int , minor : * mut c_int , patch : * mut c_int ) -> c_int ;
@@ -21,9 +22,6 @@ extern {
21
22
fn af_get_mem_step_size ( step_bytes : * mut size_t ) -> c_int ;
22
23
fn af_device_gc ( ) -> c_int ;
23
24
fn af_sync ( device : c_int ) -> c_int ;
24
-
25
- fn af_alloc_host ( elements : size_t , _type : DType ) -> * mut c_void ;
26
- fn af_free_host ( ptr : * mut c_void ) -> c_int ;
27
25
}
28
26
29
27
/// Get ArrayFire Version Number
@@ -72,17 +70,21 @@ pub fn info() {
72
70
/// [0] GeForce GT 750M, 2048 MB, CUDA Compute 3.0
73
71
/// ```
74
72
pub fn info_string ( verbose : bool ) -> String {
75
- let mut tmp : * mut c_char = 0 as * mut c_char ;
73
+ let result : String ;
76
74
unsafe {
75
+ let mut tmp: * mut c_char = 0 as * mut c_char ;
77
76
let err_val = af_info_string ( & mut tmp, verbose) ;
78
77
HANDLE_ERROR ( AfError :: from ( err_val) ) ;
79
-
80
- let result = ( * CString :: from_raw ( tmp) ) . to_str ( ) . unwrap ( ) . to_owned ( ) ;
81
-
82
- let err_val = af_free_host ( tmp as * mut c_void ) ;
83
- HANDLE_ERROR ( AfError :: from ( err_val) ) ;
84
- result
78
+ // Take ownership to Rust
79
+ let foreign = CString :: from_raw ( tmp) ;
80
+ // Make string in Rust allocated space
81
+ result = foreign. to_str ( ) . unwrap ( ) . to_owned ( ) ;
82
+ // Transfer ownership out of Rust
83
+ tmp = foreign. into_raw ( ) ;
84
+ // Free the foreign buffer
85
+ free_host ( tmp) ;
85
86
}
87
+ result
86
88
}
87
89
88
90
/// Initialize ArrayFire library
0 commit comments