GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — arrayfire-rust/src/core/error.rs at master · arrayfire/arrayfire-rust Expand file tree/ Copy patherror.rsMore file actions 111 lines (98 loc) · 2.96 KB / Copy patherror.rsFile metadata and controls111 lines (98 loc) · 2.96 KB 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 use super::defines::AfError; use super::util::{dim_t, free_host}; use libc::c_char; use std::ffi::CStr; use std::ops::{Deref, DerefMut}; use std::sync::RwLock; extern "C" { fn af_get_last_error(str: *mut *mut c_char, len: *mut dim_t); } /// Signature of error handling callback function pub type ErrorCallback = fn(AfError); /// Structure holding handle to callback function pub struct Callback { cb: ErrorCallback, } impl Callback { /// Associated function to create a new Callback object pub fn new(callback: ErrorCallback) -> Self { Self { cb: callback } } /// call invokes the error callback with `error_code`. pub fn call(&self, error_code: AfError) { (self.cb)(error_code) } } /// Default error handling callback provided by ArrayFire crate pub fn handle_error_general(error_code: AfError) { match error_code { AfError::SUCCESS => {} /* No-op */ _ => panic!( "Error message: {}\nLast error: {}", error_code, get_last_error() ), } } lazy_static! { static ref ERROR_HANDLER_LOCK: RwLock<Callback> = RwLock::new(Callback::new(handle_error_general)); } /// Register user provided error handler /// /// # Examples /// ``` /// #[macro_use] /// extern crate arrayfire; /// /// use arrayfire::{AfError, Callback, info, register_error_handler}; /// use std::error::Error; /// /// fn handle_error(error_code: AfError) { /// match error_code { /// AfError::SUCCESS => {}, /* No-op */ /// _ => panic!("Error message: {}", error_code), /// } /// } /// /// fn main() { /// //Registering the error handler should be the first call /// //before any other functions are called if your version /// //of error is to be used for subsequent function calls /// register_error_handler(Callback::new(handle_error)); /// /// info(); /// } /// ``` #[allow(clippy::match_wild_err_arm)] pub fn register_error_handler(cb_value: Callback) { let mut gaurd = match ERROR_HANDLER_LOCK.write() { Ok(g) => g, Err(_) => panic!("Failed to acquire lock to register error handler"), }; *gaurd.deref_mut() = cb_value; } /// Default error handler for error code returned by ArrayFire FFI calls #[allow(non_snake_case)] #[allow(clippy::match_wild_err_arm)] pub fn HANDLE_ERROR(error_code: AfError) { let gaurd = match ERROR_HANDLER_LOCK.read() { Ok(g) => g, Err(_) => panic!("Failed to acquire lock while handling FFI return value"), }; (*gaurd.deref()).call(error_code); } /// Fetch last error description as String pub fn get_last_error() -> String { let mut result: String = String::from("No Last Error"); let mut tmp: *mut c_char = ::std::ptr::null_mut(); let mut len: dim_t = 0; unsafe { af_get_last_error(&mut tmp, &mut len as *mut dim_t); if len > 0 { result = CStr::from_ptr(tmp).to_string_lossy().into_owned(); free_host(tmp); } } result } |
| You are visitor 01402520 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |