use std::io::Result;
use ffi;
use FromRaw;
pub struct Udev {
udev: *mut ffi::udev,
}
impl Clone for Udev {
fn clone(&self) -> Self {
unsafe { Self::from_raw(ffi::udev_ref(self.udev)) }
}
}
impl Drop for Udev {
fn drop(&mut self) {
unsafe { ffi::udev_unref(self.udev) };
}
}
#[cfg(feature = "send")]
unsafe impl Send for Udev {}
#[cfg(feature = "sync")]
unsafe impl Sync for Udev {}
as_ffi!(Udev, udev, ffi::udev, ffi::udev_ref);
impl Udev {
pub fn new() -> Result<Self> {
let ptr = try_alloc!(unsafe { ffi::udev_new() });
Ok(unsafe { Self::from_raw(ptr) })
}
}
#[cfg(test)]
mod tests {
use super::*;
use AsRaw;
#[test]
fn clone_drop() {
let mut udev = Udev::new().unwrap();
for _ in 0..1000 {
let clone = udev.clone();
assert_eq!(udev.as_raw(), clone.as_raw());
udev = clone;
}
}
#[test]
fn round_trip_to_raw_pointers() {
let udev = Udev::new().unwrap();
let ptr = udev.into_raw();
let udev = unsafe { Udev::from_raw(ptr) };
assert_eq!(ptr, udev.as_raw());
}
}