From cfd183db15af50f06b5e2803b03f87061adad9f5 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Sat, 27 Apr 2013 17:26:35 -0700 Subject: [PATCH] core::rt: Fix some copies in uv --- src/libcore/rt/uv/mod.rs | 2 -- src/libcore/rt/uv/net.rs | 17 ++++++++--------- src/libcore/rt/uv/uvio.rs | 4 +--- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/libcore/rt/uv/mod.rs b/src/libcore/rt/uv/mod.rs index 5d31f39411d..22ed82fbed3 100644 --- a/src/libcore/rt/uv/mod.rs +++ b/src/libcore/rt/uv/mod.rs @@ -362,7 +362,6 @@ struct WatcherData { connect_cb: Option, close_cb: Option, alloc_cb: Option, - buf: Option } pub fn install_watcher_data>(watcher: &mut W) { @@ -373,7 +372,6 @@ pub fn install_watcher_data>(watcher: &mut W) { connect_cb: None, close_cb: None, alloc_cb: None, - buf: None }; let data = transmute::<~WatcherData, *c_void>(data); uvll::set_data_for_uv_handle(watcher.native_handle(), data); diff --git a/src/libcore/rt/uv/net.rs b/src/libcore/rt/uv/net.rs index ff47e2caec8..49c42fa3587 100644 --- a/src/libcore/rt/uv/net.rs +++ b/src/libcore/rt/uv/net.rs @@ -11,12 +11,13 @@ use prelude::*; use libc::{size_t, ssize_t, c_int, c_void}; use cast::transmute_mut_region; +use util::ignore; use rt::uv::uvll; use rt::uv::uvll::*; use super::{Loop, Watcher, Request, UvError, Buf, Callback, NativeHandle, NullCallback, loop_from_watcher, status_to_maybe_uv_error, install_watcher_data, get_watcher_data, drop_watcher_data, - vec_to_uv_buf, vec_from_uv_buf}; + vec_to_uv_buf, vec_from_uv_buf, slice_to_uv_buf}; use super::super::io::net::ip::{IpAddr, Ipv4, Ipv6}; use rt::uv::last_uv_error; @@ -99,17 +100,13 @@ pub impl StreamWatcher { unsafe { uvll::read_stop(handle); } } - // XXX: Needs to take &[u8], not ~[u8] - fn write(&mut self, msg: ~[u8], cb: ConnectionCallback) { + fn write(&mut self, buf: Buf, cb: ConnectionCallback) { // XXX: Borrowck let data = get_watcher_data(unsafe { transmute_mut_region(self) }); assert!(data.write_cb.is_none()); data.write_cb = Some(cb); let req = WriteRequest::new(); - let buf = vec_to_uv_buf(msg); - assert!(data.buf.is_none()); - data.buf = Some(buf); let bufs = [buf]; unsafe { assert!(0 == uvll::write(req.native_handle(), @@ -123,7 +120,6 @@ pub impl StreamWatcher { write_request.delete(); let cb = { let data = get_watcher_data(&mut stream_watcher); - let _vec = vec_from_uv_buf(data.buf.swap_unwrap()); let cb = data.write_cb.swap_unwrap(); cb }; @@ -434,10 +430,13 @@ fn listen() { assert!(status.is_none()); let mut stream_watcher = stream_watcher; let msg = ~[0, 1, 2, 3, 4, 5, 6 ,7 ,8, 9]; - do stream_watcher.write(msg) |stream_watcher, status| { + let buf = slice_to_uv_buf(msg); + let msg_cell = Cell(msg); + do stream_watcher.write(buf) |stream_watcher, status| { rtdebug!("writing"); assert!(status.is_none()); - stream_watcher.close(||()); + let msg_cell = Cell(msg_cell.take()); + stream_watcher.close(||ignore(msg_cell.take())); } } loop_.run(); diff --git a/src/libcore/rt/uv/uvio.rs b/src/libcore/rt/uv/uvio.rs index 49fbf142963..d8858717f6f 100644 --- a/src/libcore/rt/uv/uvio.rs +++ b/src/libcore/rt/uv/uvio.rs @@ -289,9 +289,7 @@ impl RtioTcpStream for UvTcpStream { do scheduler.deschedule_running_task_and_then |task| { let mut watcher = watcher; let task_cell = Cell(task); - let buf = unsafe { &*buf_ptr }; - // XXX: OMGCOPIES - let buf = buf.to_vec(); + let buf = unsafe { slice_to_uv_buf(*buf_ptr) }; do watcher.write(buf) |_watcher, status| { let result = if status.is_none() { Ok(())