mirror of
https://gitlab.com/marcandre.lureau/qemu-display.git
synced 2025-04-14 08:44:46 +00:00
qemu-display: add back manual win32 mmap
It's not yet possible to map from a mapping object in memmap2... Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
This commit is contained in:
parent
b0fd7742e8
commit
e33e057875
@ -269,11 +269,10 @@ impl Audio {
|
||||
&p0,
|
||||
)?;
|
||||
self.proxy.register_out_listener(p0).await?;
|
||||
let conn = zbus::connection::Builder::unix_stream(p1).p2p()
|
||||
.serve_at(
|
||||
"/org/qemu/Display1/AudioOutListener",
|
||||
AudioOutListener { handler },
|
||||
)?;
|
||||
let conn = zbus::connection::Builder::unix_stream(p1).p2p().serve_at(
|
||||
"/org/qemu/Display1/AudioOutListener",
|
||||
AudioOutListener { handler },
|
||||
)?;
|
||||
#[cfg(windows)]
|
||||
let conn = conn.auth_mechanism(zbus::AuthMechanism::Anonymous);
|
||||
let conn = conn.build().await?;
|
||||
@ -289,12 +288,10 @@ impl Audio {
|
||||
&p0,
|
||||
)?;
|
||||
self.proxy.register_in_listener(p0).await?;
|
||||
let conn = zbus::connection::Builder::unix_stream(p1)
|
||||
.p2p()
|
||||
.serve_at(
|
||||
"/org/qemu/Display1/AudioInListener",
|
||||
AudioInListener { handler },
|
||||
)?;
|
||||
let conn = zbus::connection::Builder::unix_stream(p1).p2p().serve_at(
|
||||
"/org/qemu/Display1/AudioInListener",
|
||||
AudioInListener { handler },
|
||||
)?;
|
||||
#[cfg(windows)]
|
||||
let conn = conn.auth_mechanism(zbus::AuthMechanism::Anonymous);
|
||||
let conn = conn.build().await?;
|
||||
|
@ -118,9 +118,7 @@ impl Console {
|
||||
.serve_at("/org/qemu/Display1/Listener", ConsoleListener::new(handler))?;
|
||||
#[cfg(windows)]
|
||||
let conn = conn.auth_mechanism(zbus::AuthMechanism::Anonymous);
|
||||
let conn = conn
|
||||
.build()
|
||||
.await?;
|
||||
let conn = conn.build().await?;
|
||||
*self.listener.write().unwrap() = Some(conn);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
#[cfg(windows)]
|
||||
use crate::win32::Fd;
|
||||
use crate::win32::{Fd, Mmap};
|
||||
use derivative::Derivative;
|
||||
#[cfg(unix)]
|
||||
use memmap2::Mmap;
|
||||
use std::ops::Drop;
|
||||
#[cfg(windows)]
|
||||
@ -66,6 +67,7 @@ impl ScanoutMap {
|
||||
#[cfg(windows)]
|
||||
let desc = self.handle.as_raw_handle();
|
||||
|
||||
#[cfg(unix)]
|
||||
let mmap = unsafe {
|
||||
memmap2::MmapOptions::new()
|
||||
.len(len)
|
||||
@ -73,6 +75,13 @@ impl ScanoutMap {
|
||||
.map(desc)?
|
||||
};
|
||||
|
||||
#[cfg(windows)]
|
||||
let mmap = {
|
||||
use windows::Win32::Foundation::HANDLE;
|
||||
let handle = HANDLE(desc as _);
|
||||
Mmap::new(handle, offset.try_into().unwrap(), len)?
|
||||
};
|
||||
|
||||
Ok(ScanoutMmap {
|
||||
scanout: self,
|
||||
mmap,
|
||||
|
@ -1,9 +1,13 @@
|
||||
use std::io;
|
||||
use tracing::warn;
|
||||
|
||||
use windows::Win32::{
|
||||
Foundation::{CloseHandle, HANDLE},
|
||||
Networking::WinSock::{WSADuplicateSocketW, SOCKET, WSAPROTOCOL_INFOW},
|
||||
System::Threading::PROCESS_ACCESS_RIGHTS,
|
||||
System::{
|
||||
Memory::{MapViewOfFile, UnmapViewOfFile, FILE_MAP_READ, MEMORY_MAPPED_VIEW_ADDRESS},
|
||||
Threading::PROCESS_ACCESS_RIGHTS,
|
||||
},
|
||||
};
|
||||
|
||||
#[cfg(feature = "qmp")]
|
||||
@ -118,3 +122,49 @@ pub(crate) fn unix_stream_get_peer_pid(stream: &UnixStream) -> Result<u32, std::
|
||||
|
||||
Ok(ret)
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub(crate) struct Mmap {
|
||||
handle: HANDLE,
|
||||
ptr: MEMORY_MAPPED_VIEW_ADDRESS,
|
||||
offset: isize,
|
||||
size: usize,
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
impl Drop for Mmap {
|
||||
fn drop(&mut self) {
|
||||
unsafe {
|
||||
if let Err(err) = UnmapViewOfFile(self.ptr) {
|
||||
warn!("error while unmap: {}", err);
|
||||
}
|
||||
if let Err(err) = CloseHandle(self.handle) {
|
||||
warn!("error while closing mmap: {}", err);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
impl Mmap {
|
||||
// FIXME: remove and replace with memmap2, use offset properly
|
||||
// https://github.com/RazrFalcon/memmap2-rs/issues/138
|
||||
pub(crate) fn new(handle: HANDLE, offset: usize, size: usize) -> std::io::Result<Self> {
|
||||
let ptr = unsafe { MapViewOfFile(handle, FILE_MAP_READ, 0, 0, offset + size) };
|
||||
if ptr.Value.is_null() {
|
||||
return Err(io::Error::last_os_error());
|
||||
}
|
||||
Ok(Self {
|
||||
handle,
|
||||
ptr,
|
||||
offset: offset.try_into().unwrap(),
|
||||
size,
|
||||
})
|
||||
}
|
||||
|
||||
pub(crate) fn as_ref(&self) -> &[u8] {
|
||||
unsafe {
|
||||
std::slice::from_raw_parts(self.ptr.Value.cast::<u8>().offset(self.offset), self.size)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -504,12 +504,10 @@ impl ConsoleListenerMapHandler for ConsoleHandler {
|
||||
#[cfg(windows)]
|
||||
#[async_trait::async_trait]
|
||||
impl ConsoleListenerD3d11Handler for ConsoleHandler {
|
||||
#[cfg(windows)]
|
||||
async fn scanout_texture2d(&mut self, scanout: qemu_display::ScanoutD3dTexture2d) {
|
||||
self.send(ConsoleEvent::ScanoutD3dTexture2d(scanout));
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
async fn update_texture2d(&mut self, update: qemu_display::UpdateD3dTexture2d) {
|
||||
let (wait_tx, wait_rx) = futures::channel::oneshot::channel();
|
||||
self.send(ConsoleEvent::UpdateD3dTexture2d { update, wait_tx });
|
||||
|
Loading…
x
Reference in New Issue
Block a user