2013-10-22 15:13:18 -07:00
|
|
|
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
|
|
|
|
// file at the top-level directory of this distribution and at
|
|
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
|
|
// option. This file may not be copied, modified, or distributed
|
|
|
|
// except according to those terms.
|
|
|
|
|
|
|
|
use std::cast;
|
|
|
|
use std::libc::c_int;
|
|
|
|
use std::rt::io::signal::Signum;
|
|
|
|
|
|
|
|
use super::{Loop, NativeHandle, SignalCallback, UvError, Watcher};
|
|
|
|
use uvll;
|
|
|
|
|
|
|
|
pub struct SignalWatcher(*uvll::uv_signal_t);
|
|
|
|
|
|
|
|
impl Watcher for SignalWatcher { }
|
|
|
|
|
|
|
|
impl SignalWatcher {
|
|
|
|
pub fn new(loop_: &mut Loop) -> SignalWatcher {
|
|
|
|
unsafe {
|
|
|
|
let handle = uvll::malloc_handle(uvll::UV_SIGNAL);
|
|
|
|
assert!(handle.is_not_null());
|
2013-11-03 10:39:39 -08:00
|
|
|
assert!(0 == uvll::uv_signal_init(loop_.native_handle(), handle));
|
2013-10-22 15:13:18 -07:00
|
|
|
let mut watcher: SignalWatcher = NativeHandle::from_native_handle(handle);
|
|
|
|
watcher.install_watcher_data();
|
|
|
|
return watcher;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn start(&mut self, signum: Signum, callback: SignalCallback)
|
|
|
|
-> Result<(), UvError>
|
|
|
|
{
|
|
|
|
return unsafe {
|
2013-11-03 10:39:39 -08:00
|
|
|
match uvll::uv_signal_start(self.native_handle(), signal_cb,
|
|
|
|
signum as c_int) {
|
2013-10-22 15:13:18 -07:00
|
|
|
0 => {
|
|
|
|
let data = self.get_watcher_data();
|
|
|
|
data.signal_cb = Some(callback);
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
n => Err(UvError(n)),
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
extern fn signal_cb(handle: *uvll::uv_signal_t, signum: c_int) {
|
|
|
|
let mut watcher: SignalWatcher = NativeHandle::from_native_handle(handle);
|
|
|
|
let data = watcher.get_watcher_data();
|
|
|
|
let cb = data.signal_cb.get_ref();
|
|
|
|
(*cb)(watcher, unsafe { cast::transmute(signum as int) });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn stop(&mut self) {
|
|
|
|
unsafe {
|
2013-11-03 10:39:39 -08:00
|
|
|
uvll::uv_signal_stop(self.native_handle());
|
2013-10-22 15:13:18 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl NativeHandle<*uvll::uv_signal_t> for SignalWatcher {
|
|
|
|
fn from_native_handle(handle: *uvll::uv_signal_t) -> SignalWatcher {
|
|
|
|
SignalWatcher(handle)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn native_handle(&self) -> *uvll::uv_signal_t {
|
|
|
|
match self { &SignalWatcher(ptr) => ptr }
|
|
|
|
}
|
|
|
|
}
|