autocommit 2022-03-11 20:04:41 CET
This commit is contained in:
parent
0ae73ab9c4
commit
eb1d500561
10 changed files with 93 additions and 75 deletions
|
|
@ -164,7 +164,7 @@ async fn run_(state: Rc<State>) -> Result<(), MetalError> {
|
|||
struct MetalInputDevice {
|
||||
slot: usize,
|
||||
id: InputDeviceId,
|
||||
devnum: c::dev_t,
|
||||
_devnum: c::dev_t,
|
||||
fd: CloneCell<Option<Rc<OwnedFd>>>,
|
||||
inputdev: Cell<Option<RegisteredDevice>>,
|
||||
devnode: CString,
|
||||
|
|
|
|||
|
|
@ -6,12 +6,12 @@ use crate::metal::video::PendingDrmDevice;
|
|||
use crate::metal::{MetalBackend, MetalDevice, MetalDrmDevice, MetalError, MetalInputDevice};
|
||||
use crate::org::freedesktop::login1::session::{PauseDevice, ResumeDevice};
|
||||
use crate::udev::UdevDevice;
|
||||
use crate::utils::nonblock::set_nonblock;
|
||||
use crate::ErrorFmt;
|
||||
use bstr::ByteSlice;
|
||||
use std::cell::Cell;
|
||||
use std::rc::Rc;
|
||||
use uapi::{c, OwnedFd};
|
||||
use crate::utils::nonblock::set_nonblock;
|
||||
|
||||
const DRM: &[u8] = b"drm";
|
||||
const INPUT: &[u8] = b"input";
|
||||
|
|
@ -82,7 +82,7 @@ impl MetalBackend {
|
|||
}
|
||||
}
|
||||
|
||||
fn handle_drm_device_resume(self: &Rc<Self>, dev: &Rc<MetalDrmDevice>, fd: Rc<OwnedFd>) {
|
||||
fn handle_drm_device_resume(self: &Rc<Self>, dev: &Rc<MetalDrmDevice>, _fd: Rc<OwnedFd>) {
|
||||
log::info!("Device resumed: {}", dev.dev.devnode.to_bytes().as_bstr());
|
||||
}
|
||||
|
||||
|
|
@ -224,7 +224,7 @@ impl MetalBackend {
|
|||
}
|
||||
}
|
||||
|
||||
fn handle_drm_change(self: &Rc<Self>, dev: UdevDevice) -> Option<()> {
|
||||
fn handle_drm_change(self: &Rc<Self>, _dev: UdevDevice) -> Option<()> {
|
||||
None
|
||||
}
|
||||
|
||||
|
|
@ -266,7 +266,7 @@ impl MetalBackend {
|
|||
let dev = Rc::new(MetalInputDevice {
|
||||
slot,
|
||||
id: device_id,
|
||||
devnum,
|
||||
_devnum: devnum,
|
||||
fd: Default::default(),
|
||||
inputdev: Default::default(),
|
||||
devnode: devnode.to_owned(),
|
||||
|
|
|
|||
|
|
@ -1,5 +1,11 @@
|
|||
use crate::async_engine::{AsyncFd, SpawnedFuture};
|
||||
use crate::backend::{BackendEvent, Output, OutputId};
|
||||
use crate::drm::drm::{ConnectorStatus, ConnectorType, DrmBlob, DrmConnector, DrmCrtc, DrmEncoder, DrmError, DrmFb, DrmFramebuffer, DrmMaster, DrmModeInfo, DrmObject, DrmPlane, DrmProperty, DrmPropertyDefinition, DrmPropertyType, PropBlob, DRM_CLIENT_CAP_ATOMIC, DRM_MODE_ATOMIC_ALLOW_MODESET, DRM_MODE_ATOMIC_NONBLOCK, DRM_MODE_PAGE_FLIP_EVENT, DrmEvent};
|
||||
use crate::drm::drm::{
|
||||
ConnectorStatus, ConnectorType, DrmBlob, DrmConnector, DrmCrtc, DrmEncoder, DrmError, DrmEvent,
|
||||
DrmFb, DrmFramebuffer, DrmMaster, DrmModeInfo, DrmObject, DrmPlane, DrmProperty,
|
||||
DrmPropertyDefinition, DrmPropertyType, PropBlob, DRM_CLIENT_CAP_ATOMIC,
|
||||
DRM_MODE_ATOMIC_ALLOW_MODESET, DRM_MODE_ATOMIC_NONBLOCK, DRM_MODE_PAGE_FLIP_EVENT,
|
||||
};
|
||||
use crate::drm::gbm::{GbmDevice, GBM_BO_USE_RENDERING, GBM_BO_USE_SCANOUT};
|
||||
use crate::drm::{ModifiedFormat, INVALID_MODIFIER};
|
||||
use crate::format::{Format, XRGB8888};
|
||||
|
|
@ -14,7 +20,6 @@ use std::ffi::CString;
|
|||
use std::fmt::{Debug, Formatter};
|
||||
use std::rc::Rc;
|
||||
use uapi::c;
|
||||
use crate::async_engine::{AsyncFd, SpawnedFuture};
|
||||
|
||||
pub struct PendingDrmDevice {
|
||||
pub id: DrmId,
|
||||
|
|
@ -462,14 +467,14 @@ impl MetalBackend {
|
|||
|
||||
let connectors = get_connectors(&self.state, &dev, &resources.connectors)?;
|
||||
|
||||
let slf = Rc::new(MetalDrmDevice {
|
||||
dev,
|
||||
connectors,
|
||||
});
|
||||
let slf = Rc::new(MetalDrmDevice { dev, connectors });
|
||||
|
||||
self.reset_drm_device(&slf)?;
|
||||
|
||||
let handler = self.state.eng.spawn(self.clone().handle_drm_events(slf.clone()));
|
||||
let handler = self
|
||||
.state
|
||||
.eng
|
||||
.spawn(self.clone().handle_drm_events(slf.clone()));
|
||||
slf.dev.handle_events.handle_events.set(Some(handler));
|
||||
|
||||
self.state.render_ctx.set(Some(egl));
|
||||
|
|
@ -498,13 +503,23 @@ impl MetalBackend {
|
|||
|
||||
fn handle_drm_event(self: &Rc<Self>, event: DrmEvent, dev: &Rc<MetalDrmDevice>) {
|
||||
match event {
|
||||
DrmEvent::FlipComplete { tv_sec, tv_usec, sequence, crtc_id } => self.handle_drm_flip_event(
|
||||
dev, crtc_id, tv_sec, tv_usec, sequence
|
||||
),
|
||||
DrmEvent::FlipComplete {
|
||||
tv_sec,
|
||||
tv_usec,
|
||||
sequence,
|
||||
crtc_id,
|
||||
} => self.handle_drm_flip_event(dev, crtc_id, tv_sec, tv_usec, sequence),
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_drm_flip_event(self: &Rc<Self>, dev: &Rc<MetalDrmDevice>, crtc_id: DrmCrtc, _tv_sec: u32, _tv_usec: u32, _sequence: u32) {
|
||||
fn handle_drm_flip_event(
|
||||
self: &Rc<Self>,
|
||||
dev: &Rc<MetalDrmDevice>,
|
||||
crtc_id: DrmCrtc,
|
||||
_tv_sec: u32,
|
||||
_tv_usec: u32,
|
||||
_sequence: u32,
|
||||
) {
|
||||
let crtc = match dev.dev.crtcs.get(&crtc_id) {
|
||||
Some(c) => c,
|
||||
_ => return,
|
||||
|
|
@ -559,15 +574,26 @@ impl MetalBackend {
|
|||
}
|
||||
}
|
||||
|
||||
fn create_scanout_buffers(&self, dev: &Rc<MetalDrmDevice>, connector: &Rc<MetalConnector>, format: &ModifiedFormat, width: i32, height: i32) -> Result<[RenderBuffer; 2], MetalError> {
|
||||
fn create_scanout_buffers(
|
||||
&self,
|
||||
dev: &Rc<MetalDrmDevice>,
|
||||
connector: &Rc<MetalConnector>,
|
||||
format: &ModifiedFormat,
|
||||
width: i32,
|
||||
height: i32,
|
||||
) -> Result<[RenderBuffer; 2], MetalError> {
|
||||
let create = || self.create_scanout_buffer(dev, connector, format, width, height);
|
||||
Ok([
|
||||
create()?,
|
||||
create()?,
|
||||
])
|
||||
Ok([create()?, create()?])
|
||||
}
|
||||
|
||||
fn create_scanout_buffer(&self, dev: &Rc<MetalDrmDevice>, connector: &Rc<MetalConnector>, format: &ModifiedFormat, width: i32, height: i32) -> Result<RenderBuffer, MetalError> {
|
||||
fn create_scanout_buffer(
|
||||
&self,
|
||||
dev: &Rc<MetalDrmDevice>,
|
||||
connector: &Rc<MetalConnector>,
|
||||
format: &ModifiedFormat,
|
||||
width: i32,
|
||||
height: i32,
|
||||
) -> Result<RenderBuffer, MetalError> {
|
||||
let bo = dev.dev.gbm.create_bo(
|
||||
width,
|
||||
height,
|
||||
|
|
@ -628,7 +654,13 @@ impl MetalBackend {
|
|||
format: XRGB8888,
|
||||
modifier: INVALID_MODIFIER,
|
||||
};
|
||||
let buffers = self.create_scanout_buffers(dev, connector, &format, mode.hdisplay as _, mode.vdisplay as _)?;
|
||||
let buffers = self.create_scanout_buffers(
|
||||
dev,
|
||||
connector,
|
||||
&format,
|
||||
mode.hdisplay as _,
|
||||
mode.vdisplay as _,
|
||||
)?;
|
||||
let mut changes = connector.master.change(DRM_MODE_ATOMIC_ALLOW_MODESET);
|
||||
changes.change_object(connector.id, |c| {
|
||||
c.change(connector.crtc_id.id, crtc.id.0 as _);
|
||||
|
|
@ -694,9 +726,13 @@ impl MetalBackend {
|
|||
};
|
||||
let buffer = &buffers[connector.next_buffer.fetch_add(1) % buffers.len()];
|
||||
if let Some(node) = self.state.root.outputs.get(&connector.output_id) {
|
||||
buffer.egl.render(&*node, &self.state, Some(node.position.get()));
|
||||
buffer
|
||||
.egl
|
||||
.render(&*node, &self.state, Some(node.position.get()));
|
||||
}
|
||||
let mut changes = connector.master.change(DRM_MODE_ATOMIC_NONBLOCK | DRM_MODE_PAGE_FLIP_EVENT);
|
||||
let mut changes = connector
|
||||
.master
|
||||
.change(DRM_MODE_ATOMIC_NONBLOCK | DRM_MODE_PAGE_FLIP_EVENT);
|
||||
changes.change_object(plane.id, |c| {
|
||||
c.change(plane.fb_id.id, buffer.drm.id().0 as _);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,10 +1,19 @@
|
|||
mod sys;
|
||||
|
||||
use std::cell::RefCell;
|
||||
use crate::drm::drm::sys::{create_lease, drm_mode_modeinfo, get_cap, get_device_name_from_fd2, get_minor_name_from_fd, get_node_type_from_fd, get_nodes, is_master, mode_addfb2, mode_atomic, mode_create_blob, mode_destroy_blob, mode_get_resources, mode_getconnector, mode_getencoder, mode_getplane, mode_getplaneresources, mode_getproperty, mode_obj_getproperties, mode_rmfb, set_client_cap, DRM_DISPLAY_MODE_LEN, DRM_MODE_ATOMIC_TEST_ONLY, DRM_MODE_FB_MODIFIERS, DRM_MODE_OBJECT_BLOB, DRM_MODE_OBJECT_CONNECTOR, DRM_MODE_OBJECT_CRTC, DRM_MODE_OBJECT_ENCODER, DRM_MODE_OBJECT_FB, DRM_MODE_OBJECT_MODE, DRM_MODE_OBJECT_PLANE, DRM_MODE_OBJECT_PROPERTY, gem_close, prime_fd_to_handle, drm_event, drm_event_vblank};
|
||||
use crate::drm::drm::sys::{
|
||||
create_lease, drm_event, drm_event_vblank, drm_mode_modeinfo, gem_close, get_cap,
|
||||
get_device_name_from_fd2, get_minor_name_from_fd, get_node_type_from_fd, get_nodes, is_master,
|
||||
mode_addfb2, mode_atomic, mode_create_blob, mode_destroy_blob, mode_get_resources,
|
||||
mode_getconnector, mode_getencoder, mode_getplane, mode_getplaneresources, mode_getproperty,
|
||||
mode_obj_getproperties, mode_rmfb, prime_fd_to_handle, set_client_cap, DRM_DISPLAY_MODE_LEN,
|
||||
DRM_MODE_ATOMIC_TEST_ONLY, DRM_MODE_FB_MODIFIERS, DRM_MODE_OBJECT_BLOB,
|
||||
DRM_MODE_OBJECT_CONNECTOR, DRM_MODE_OBJECT_CRTC, DRM_MODE_OBJECT_ENCODER, DRM_MODE_OBJECT_FB,
|
||||
DRM_MODE_OBJECT_MODE, DRM_MODE_OBJECT_PLANE, DRM_MODE_OBJECT_PROPERTY,
|
||||
};
|
||||
use crate::utils::oserror::OsError;
|
||||
use ahash::AHashMap;
|
||||
use bstr::{BString, ByteSlice};
|
||||
use std::cell::RefCell;
|
||||
use std::ffi::CString;
|
||||
use std::fmt::{Debug, Display, Formatter};
|
||||
use std::mem;
|
||||
|
|
@ -17,12 +26,12 @@ use uapi::{c, Errno, OwnedFd, Ustring};
|
|||
use crate::drm::gbm::GbmBo;
|
||||
use crate::drm::INVALID_MODIFIER;
|
||||
use crate::utils::stack::Stack;
|
||||
use crate::utils::syncqueue::SyncQueue;
|
||||
use crate::ErrorFmt;
|
||||
pub use sys::{
|
||||
DRM_CLIENT_CAP_ATOMIC, DRM_MODE_ATOMIC_ALLOW_MODESET, DRM_MODE_ATOMIC_NONBLOCK,
|
||||
DRM_MODE_PAGE_FLIP_EVENT,
|
||||
};
|
||||
use crate::utils::syncqueue::SyncQueue;
|
||||
|
||||
#[derive(Debug, Error)]
|
||||
pub enum DrmError {
|
||||
|
|
@ -188,6 +197,7 @@ impl DrmMaster {
|
|||
mode_get_resources(self.raw())
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn get_cap(&self, cap: u64) -> Result<u64, OsError> {
|
||||
get_cap(self.raw(), cap)
|
||||
}
|
||||
|
|
@ -329,7 +339,7 @@ impl DrmMaster {
|
|||
crtc_id: DrmCrtc(event.crtc_id),
|
||||
});
|
||||
}
|
||||
_ => { },
|
||||
_ => {}
|
||||
}
|
||||
buf = &mut buf[len as usize..];
|
||||
}
|
||||
|
|
@ -586,6 +596,7 @@ pub struct ObjectChange<'a> {
|
|||
}
|
||||
|
||||
impl Change {
|
||||
#[allow(dead_code)]
|
||||
pub fn test(&self) -> Result<(), DrmError> {
|
||||
mode_atomic(
|
||||
self.master.raw(),
|
||||
|
|
|
|||
|
|
@ -212,6 +212,7 @@ struct drm_mode_get_property {
|
|||
|
||||
const DRM_IOCTL_MODE_GETPROPERTY: u64 = drm_iowr::<drm_mode_get_property>(0xaa);
|
||||
|
||||
#[allow(dead_code)]
|
||||
const DRM_MODE_PROP_PENDING: u32 = 1 << 0;
|
||||
const DRM_MODE_PROP_RANGE: u32 = 1 << 1;
|
||||
const DRM_MODE_PROP_IMMUTABLE: u32 = 1 << 2;
|
||||
|
|
@ -397,8 +398,10 @@ pub const DRM_MODE_OBJECT_PROPERTY: u32 = 0xb0b0b0b0;
|
|||
pub const DRM_MODE_OBJECT_FB: u32 = 0xfbfbfbfb;
|
||||
pub const DRM_MODE_OBJECT_BLOB: u32 = 0xbbbbbbbb;
|
||||
pub const DRM_MODE_OBJECT_PLANE: u32 = 0xeeeeeeee;
|
||||
#[allow(dead_code)]
|
||||
pub const DRM_MODE_OBJECT_ANY: u32 = 0;
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub const DRM_MODE_CONNECTOR_Unknown: u32 = 0;
|
||||
pub const DRM_MODE_CONNECTOR_VGA: u32 = 1;
|
||||
pub const DRM_MODE_CONNECTOR_DVII: u32 = 2;
|
||||
|
|
@ -948,6 +951,7 @@ struct drm_mode_fb_cmd2 {
|
|||
modifier: [u64; 4],
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub const DRM_MODE_FB_INTERLACED: u32 = 1 << 0;
|
||||
pub const DRM_MODE_FB_MODIFIERS: u32 = 1 << 1;
|
||||
|
||||
|
|
@ -1023,19 +1027,18 @@ struct drm_gem_close {
|
|||
const DRM_IOCTL_GEM_CLOSE: u64 = drm_iow::<drm_gem_close>(0x09);
|
||||
|
||||
pub fn gem_close(fd: c::c_int, handle: u32) -> Result<(), OsError> {
|
||||
let mut res = drm_gem_close {
|
||||
handle,
|
||||
pad: 0,
|
||||
};
|
||||
let mut res = drm_gem_close { handle, pad: 0 };
|
||||
unsafe {
|
||||
ioctl(fd, DRM_IOCTL_GEM_CLOSE, &mut res)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub const DRM_EVENT_VBLANK : u32 = 0x01;
|
||||
pub const DRM_EVENT_FLIP_COMPLETE : u32 = 0x02;
|
||||
pub const DRM_EVENT_CRTC_SEQUENCE : u32 = 0x03;
|
||||
#[allow(dead_code)]
|
||||
pub const DRM_EVENT_VBLANK: u32 = 0x01;
|
||||
pub const DRM_EVENT_FLIP_COMPLETE: u32 = 0x02;
|
||||
#[allow(dead_code)]
|
||||
pub const DRM_EVENT_CRTC_SEQUENCE: u32 = 0x03;
|
||||
|
||||
#[repr(C)]
|
||||
pub struct drm_event {
|
||||
|
|
@ -1043,7 +1046,7 @@ pub struct drm_event {
|
|||
pub length: u32,
|
||||
}
|
||||
|
||||
unsafe impl Pod for drm_event { }
|
||||
unsafe impl Pod for drm_event {}
|
||||
|
||||
#[repr(C)]
|
||||
pub struct drm_event_vblank {
|
||||
|
|
@ -1055,4 +1058,4 @@ pub struct drm_event_vblank {
|
|||
pub crtc_id: u32,
|
||||
}
|
||||
|
||||
unsafe impl Pod for drm_event_vblank { }
|
||||
unsafe impl Pod for drm_event_vblank {}
|
||||
|
|
|
|||
|
|
@ -2,12 +2,11 @@ use crate::drm::dma::{DmaBuf, DmaBufPlane};
|
|||
use crate::drm::drm::{Drm, DrmError};
|
||||
use crate::drm::{ModifiedFormat, INVALID_MODIFIER};
|
||||
use crate::format::formats;
|
||||
use crate::utils::oserror::OsError;
|
||||
use std::fmt::{Debug, Formatter};
|
||||
use std::ptr;
|
||||
use std::rc::Rc;
|
||||
use thiserror::Error;
|
||||
use uapi::{c, Errno, OwnedFd};
|
||||
use uapi::{c, OwnedFd};
|
||||
|
||||
#[derive(Debug, Error)]
|
||||
pub enum GbmError {
|
||||
|
|
@ -21,8 +20,6 @@ pub enum GbmError {
|
|||
UnknownFormat,
|
||||
#[error("Could not retrieve a drm-buf fd")]
|
||||
DrmFd,
|
||||
#[error("Could not retrieve a GEM handle")]
|
||||
GemHandle(#[source] OsError),
|
||||
}
|
||||
|
||||
type Device = u8;
|
||||
|
|
@ -39,16 +36,6 @@ pub const GBM_BO_USE_LINEAR: u32 = 1 << 4;
|
|||
#[allow(dead_code)]
|
||||
pub const GBM_BO_USE_PROTECTED: u32 = 1 << 5;
|
||||
|
||||
#[allow(non_camel_case_types)]
|
||||
#[repr(C)]
|
||||
union gbm_bo_handle {
|
||||
ptr: *mut u8,
|
||||
s32: i32,
|
||||
u32: u32,
|
||||
s64: i64,
|
||||
u64: u64,
|
||||
}
|
||||
|
||||
#[link(name = "gbm")]
|
||||
extern "C" {
|
||||
fn gbm_create_device(fd: c::c_int) -> *mut Device;
|
||||
|
|
@ -72,7 +59,6 @@ extern "C" {
|
|||
fn gbm_bo_get_modifier(bo: *mut Bo) -> u64;
|
||||
fn gbm_bo_get_stride_for_plane(bo: *mut Bo, plane: c::c_int) -> u32;
|
||||
fn gbm_bo_get_fd_for_plane(bo: *mut Bo, plane: c::c_int) -> c::c_int;
|
||||
fn gbm_bo_get_handle_for_plane(bo: *mut Bo, plane: c::c_int) -> gbm_bo_handle;
|
||||
fn gbm_bo_get_offset(bo: *mut Bo, plane: c::c_int) -> u32;
|
||||
fn gbm_bo_get_format(bo: *mut Bo) -> u32;
|
||||
#[allow(dead_code)]
|
||||
|
|
@ -97,7 +83,6 @@ struct BoHolder {
|
|||
pub struct GbmBo {
|
||||
_bo: BoHolder,
|
||||
dma: DmaBuf,
|
||||
handles: Vec<u32>,
|
||||
}
|
||||
|
||||
unsafe fn export_bo(bo: *mut Bo) -> Result<DmaBuf, GbmError> {
|
||||
|
|
@ -132,18 +117,6 @@ unsafe fn export_bo(bo: *mut Bo) -> Result<DmaBuf, GbmError> {
|
|||
})
|
||||
}
|
||||
|
||||
unsafe fn export_handles(bo: *mut Bo) -> Result<Vec<u32>, GbmError> {
|
||||
let mut planes = vec![];
|
||||
for plane in 0..gbm_bo_get_plane_count(bo) {
|
||||
let handle = gbm_bo_get_handle_for_plane(bo, plane);
|
||||
if handle.s32 < 0 {
|
||||
return Err(GbmError::GemHandle(Errno::default().into()));
|
||||
}
|
||||
planes.push(handle.u32);
|
||||
}
|
||||
Ok(planes)
|
||||
}
|
||||
|
||||
impl GbmDevice {
|
||||
pub fn new(drm: &Drm) -> Result<Self, GbmError> {
|
||||
let drm = drm.dup_unprivileged()?;
|
||||
|
|
@ -182,11 +155,9 @@ impl GbmDevice {
|
|||
}
|
||||
let bo = BoHolder { bo };
|
||||
let dma = export_bo(bo.bo)?;
|
||||
let handles = export_handles(bo.bo)?;
|
||||
Ok(GbmBo {
|
||||
_bo: bo,
|
||||
dma,
|
||||
handles,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
@ -204,10 +175,6 @@ impl GbmBo {
|
|||
pub fn dma(&self) -> &DmaBuf {
|
||||
&self.dma
|
||||
}
|
||||
|
||||
pub fn gem(&self) -> &[u32] {
|
||||
&self.handles
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for BoHolder {
|
||||
|
|
|
|||
|
|
@ -29,11 +29,11 @@ pub fn formats() -> &'static AHashMap<u32, &'static Format> {
|
|||
&*FORMATS_MAP
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
const fn fourcc_code(a: char, b: char, c: char, d: char) -> u32 {
|
||||
(a as u32) | ((b as u32) << 8) | ((c as u32) << 16) | ((d as u32) << 24)
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn debug(fourcc: u32) -> impl Debug {
|
||||
debug_fn(move |fmt| {
|
||||
fmt.write_char(fourcc as u8 as char)?;
|
||||
|
|
|
|||
|
|
@ -284,6 +284,7 @@ impl<'a> UdevListEntry<'a> {
|
|||
|
||||
macro_rules! strfn {
|
||||
($f:ident, $raw:ident) => {
|
||||
#[allow(dead_code)]
|
||||
pub fn $f(&self) -> Option<&CStr> {
|
||||
let res = unsafe { $raw(self.device) };
|
||||
if res.is_null() {
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ pub mod debug_fn;
|
|||
pub mod errorfmt;
|
||||
pub mod hex;
|
||||
pub mod linkedlist;
|
||||
pub mod nonblock;
|
||||
pub mod numcell;
|
||||
pub mod oserror;
|
||||
pub mod ptr_ext;
|
||||
|
|
@ -21,4 +22,3 @@ pub mod tri;
|
|||
pub mod vasprintf;
|
||||
pub mod vec_ext;
|
||||
pub mod vecstorage;
|
||||
pub mod nonblock;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
use uapi::{c};
|
||||
use crate::utils::oserror::OsError;
|
||||
use uapi::c;
|
||||
|
||||
pub fn set_nonblock(fd: c::c_int) -> Result<(), OsError> {
|
||||
let fl = uapi::fcntl_getfl(fd)?;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue