Function kdb_c_api::register_callback [−][src]
pub fn register_callback(socket: I, function: extern "C" fn(_: I) -> K) -> K
Expand description
Register callback to the associated kdb+ socket.
use kdb_c_api::*; static mut PIPE:[I; 2]=[-1, -1]; // Callback for some message queue. extern "C" fn callback(socket: I)->K{ let mut buffer: [K; 1]=[0 as K]; unsafe{libc::read(socket, buffer.as_mut_ptr() as *mut V, 8)}; // Call `shout` function on q side with the received data. let result=error_to_string(unsafe{native::k(0, str_to_S!("shout"), buffer[0], KNULL)}); if result.get_type() == qtype::ERROR{ eprintln!("Execution error: {}", result.get_symbol().unwrap()); decrement_reference_count(result); }; KNULL } #[no_mangle] pub extern "C" fn plumber(_: K) -> K{ if 0 != unsafe{libc::pipe(PIPE.as_mut_ptr())}{ return new_error("Failed to create pipe\0"); } if KNULL == register_callback(unsafe{PIPE[0]}, callback){ return new_error("Failed to register callback\0"); } // Lock symbol in a worker thread. pin_symbol(); let handle=std::thread::spawn(move ||{ let mut precious=new_simple_list(qtype::SYMBOL, 3); let precious_array=precious.as_mut_slice::<S>(); precious_array[0]=internalize(null_terminated_str_to_S("belief\0")); precious_array[1]=internalize(null_terminated_str_to_S("love\0")); precious_array[2]=internalize(null_terminated_str_to_S("hope\0")); unsafe{libc::write(PIPE[1], std::mem::transmute::<*mut K, *mut V>(&mut precious), 8)}; }); handle.join().unwrap(); unpin_symbol(); KNULL }
q)shout:{[precious] -1 "What are the three largest elements?: ", .Q.s1 precious;};
q)fall_into_pipe: `libc_api_example 2: (`plumber; 1);
q)fall_into_pipe[]
What are the three largest elements?: `belief`love`hope