From b4c36c2d1b8079cdb14bd3bf85c1ffc43f1f1d15 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Sun, 18 Aug 2013 17:11:45 -0700 Subject: [PATCH] Upgrade libuv to the current master (again) This is a reopening of the libuv-upgrade part of #8645. Hopefully this won't cause random segfaults all over the place. The windows regression in testing should also be fixed (it shouldn't build the whole compiler twice). A notable difference from before is that gyp is now a git submodule instead of always git-cloned at make time. This allows bundling for releases more easily. Closes #8850 --- .gitmodules | 5 ++- mk/dist.mk | 2 +- mk/rt.mk | 35 ++++++++++++------ src/gyp | 1 + src/libstd/rt/io/net/tcp.rs | 2 +- src/libstd/rt/uv/addrinfo.rs | 5 ++- src/libstd/rt/uv/async.rs | 2 +- src/libstd/rt/uv/file.rs | 22 ++++++------ src/libstd/rt/uv/idle.rs | 4 +-- src/libstd/rt/uv/mod.rs | 52 +++++++-------------------- src/libstd/rt/uv/net.rs | 17 +++++---- src/libstd/rt/uv/timer.rs | 2 +- src/libstd/rt/uv/uvio.rs | 30 ++++++++-------- src/libstd/rt/uv/uvll.rs | 69 +++++++++++++++--------------------- src/libuv | 2 +- src/rt/rust_uv.cpp | 11 ++---- src/rt/rustrt.def.in | 1 - 17 files changed, 115 insertions(+), 147 deletions(-) create mode 160000 src/gyp diff --git a/.gitmodules b/.gitmodules index 88ead6e608d..97e327ebfa4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,5 +4,8 @@ branch = master [submodule "src/libuv"] path = src/libuv - url = https://github.com/brson/libuv.git + url = https://github.com/alexcrichton/libuv.git branch = master +[submodule "src/gyp"] + path = src/gyp + url = https://git.chromium.org/external/gyp.git diff --git a/mk/dist.mk b/mk/dist.mk index 8e568124d41..4a980edf767 100644 --- a/mk/dist.mk +++ b/mk/dist.mk @@ -12,7 +12,7 @@ PKG_ICO = $(S)src/etc/pkg/rust-logo.ico PKG_EXE = $(PKG_DIR)-install.exe endif -PKG_GITMODULES := $(S)src/libuv $(S)src/llvm +PKG_GITMODULES := $(S)src/libuv $(S)src/llvm $(S)src/gyp PKG_FILES := \ $(S)COPYRIGHT \ diff --git a/mk/rt.mk b/mk/rt.mk index 185053e5757..14aa2884b60 100644 --- a/mk/rt.mk +++ b/mk/rt.mk @@ -170,16 +170,28 @@ LIBUV_DEPS := $$(wildcard \ $$(S)src/libuv/*/*/*/*) endif +LIBUV_MAKEFILE_$(1)_$(2) := $$(CFG_BUILD_DIR)$$(RT_BUILD_DIR_$(1)_$(2))/libuv/Makefile +LIBUV_NO_LOAD = run-benchmarks.target.mk run-tests.target.mk \ + uv_dtrace_header.target.mk uv_dtrace_provider.target.mk + +export PYTHONPATH := $(PYTHONPATH):$$(S)src/gyp/pylib + +$$(LIBUV_MAKEFILE_$(1)_$(2)): + (cd $(S)src/libuv/ && \ + ./gyp_uv -f make -Dtarget_arch=$$(LIBUV_ARCH_$(1)) -D ninja \ + -Goutput_dir=$$(@D) --generator-output $$(@D)) + # XXX: Shouldn't need platform-specific conditions here ifdef CFG_WINDOWSY_$(1) $$(LIBUV_LIB_$(1)_$(2)): $$(LIBUV_DEPS) - $$(Q)$$(MAKE) -C $$(S)src/libuv/ \ - builddir_name="$$(CFG_BUILD_DIR)/$$(RT_BUILD_DIR_$(1)_$(2))/libuv" \ - OS=mingw \ + $$(Q)$$(MAKE) -C $$(S)src/libuv -f Makefile.mingw \ + CFLAGS="$$(CFG_GCCISH_CFLAGS) $$(LIBUV_FLAGS_$$(HOST_$(1))) $$(SNAP_DEFINES)" \ + AR="$$(AR_$(1))" \ V=$$(VERBOSE) + $$(Q)cp $$(S)src/libuv/libuv.a $$@ else ifeq ($(OSTYPE_$(1)), linux-androideabi) -$$(LIBUV_LIB_$(1)_$(2)): $$(LIBUV_DEPS) - $$(Q)$$(MAKE) -C $$(S)src/libuv/ \ +$$(LIBUV_LIB_$(1)_$(2)): $$(LIBUV_DEPS) $$(LIBUV_MAKEFILE_$(1)_$(2)) + $$(Q)$$(MAKE) -C $$(@D) \ CFLAGS="$$(CFG_GCCISH_CFLAGS) $$(LIBUV_FLAGS_$$(HOST_$(1))) $$(SNAP_DEFINES)" \ LDFLAGS="$$(CFG_GCCISH_LINK_FLAGS) $$(LIBUV_FLAGS_$$(HOST_$(1)))" \ CC="$$(CC_$(1))" \ @@ -187,19 +199,22 @@ $$(LIBUV_LIB_$(1)_$(2)): $$(LIBUV_DEPS) LINK="$$(CXX_$(1))" \ AR="$$(AR_$(1))" \ PLATFORM=android \ - BUILDTYPE=Release \ - builddir_name="$$(CFG_BUILD_DIR)/$$(RT_BUILD_DIR_$(1)_$(2))/libuv" \ host=android OS=linux \ + builddir="." \ + BUILDTYPE=Release \ + NO_LOAD="$$(LIBUV_NO_LOAD)" \ V=$$(VERBOSE) else -$$(LIBUV_LIB_$(1)_$(2)): $$(LIBUV_DEPS) - $$(Q)$$(MAKE) -C $$(S)src/libuv/ \ +$$(LIBUV_LIB_$(1)_$(2)): $$(LIBUV_DEPS) $$(LIBUV_MAKEFILE_$(1)_$(2)) + $$(Q)$$(MAKE) -C $$(@D) \ CFLAGS="$$(CFG_GCCISH_CFLAGS) $$(LIBUV_FLAGS_$$(HOST_$(1))) $$(SNAP_DEFINES)" \ LDFLAGS="$$(CFG_GCCISH_LINK_FLAGS) $$(LIBUV_FLAGS_$$(HOST_$(1)))" \ CC="$$(CC_$(1))" \ CXX="$$(CXX_$(1))" \ AR="$$(AR_$(1))" \ - builddir_name="$$(CFG_BUILD_DIR)/$$(RT_BUILD_DIR_$(1)_$(2))/libuv" \ + builddir="." \ + BUILDTYPE=Release \ + NO_LOAD="$$(LIBUV_NO_LOAD)" \ V=$$(VERBOSE) endif diff --git a/src/gyp b/src/gyp new file mode 160000 index 00000000000..f407f09c94e --- /dev/null +++ b/src/gyp @@ -0,0 +1 @@ +Subproject commit f407f09c94e00d2d570e8e42114e3f6848b2deb2 diff --git a/src/libstd/rt/io/net/tcp.rs b/src/libstd/rt/io/net/tcp.rs index b7cb703eb25..b533ebe923b 100644 --- a/src/libstd/rt/io/net/tcp.rs +++ b/src/libstd/rt/io/net/tcp.rs @@ -182,7 +182,7 @@ fn connect_error() { do run_in_newsched_task { let mut called = false; do io_error::cond.trap(|e| { - assert!(e.kind == ConnectionRefused); + assert_eq!(e.kind, ConnectionRefused); called = true; }).inside { let addr = SocketAddr { ip: Ipv4Addr(0, 0, 0, 0), port: 1 }; diff --git a/src/libstd/rt/uv/addrinfo.rs b/src/libstd/rt/uv/addrinfo.rs index 00d1ab5aa9c..83a7e64b139 100644 --- a/src/libstd/rt/uv/addrinfo.rs +++ b/src/libstd/rt/uv/addrinfo.rs @@ -17,7 +17,7 @@ use rt::uv::uvll; use rt::uv::uvll::UV_GETADDRINFO; use rt::uv::{Loop, UvError, NativeHandle}; -use rt::uv::status_to_maybe_uv_error_with_loop; +use rt::uv::status_to_maybe_uv_error; use rt::uv::net::UvAddrInfo; type GetAddrInfoCallback = ~fn(GetAddrInfoRequest, &UvAddrInfo, Option); @@ -90,8 +90,7 @@ extern "C" fn getaddrinfo_cb(req: *uvll::uv_getaddrinfo_t, status: c_int, res: *uvll::addrinfo) { let mut req: GetAddrInfoRequest = NativeHandle::from_native_handle(req); - let loop_ = req.get_loop(); - let err = status_to_maybe_uv_error_with_loop(loop_.native_handle(), status); + let err = status_to_maybe_uv_error(status); let addrinfo = UvAddrInfo(res); let data = req.get_req_data(); (*data.getaddrinfo_cb.get_ref())(req, &addrinfo, err); diff --git a/src/libstd/rt/uv/async.rs b/src/libstd/rt/uv/async.rs index d0ca38317cb..ff7bb9dd03a 100644 --- a/src/libstd/rt/uv/async.rs +++ b/src/libstd/rt/uv/async.rs @@ -34,7 +34,7 @@ pub fn new(loop_: &mut Loop, cb: AsyncCallback) -> AsyncWatcher { extern fn async_cb(handle: *uvll::uv_async_t, status: c_int) { let mut watcher: AsyncWatcher = NativeHandle::from_native_handle(handle); - let status = status_to_maybe_uv_error(watcher, status); + let status = status_to_maybe_uv_error(status); let data = watcher.get_watcher_data(); let cb = data.async_cb.get_ref(); (*cb)(watcher, status); diff --git a/src/libstd/rt/uv/file.rs b/src/libstd/rt/uv/file.rs index 0902d5e6d8c..45a5fce3f1e 100644 --- a/src/libstd/rt/uv/file.rs +++ b/src/libstd/rt/uv/file.rs @@ -12,7 +12,7 @@ use ptr::null; use libc::c_void; use rt::uv::{Request, NativeHandle, Loop, FsCallback, Buf, - status_to_maybe_uv_error_with_loop, UvError}; + status_to_maybe_uv_error, UvError}; use rt::uv::uvll; use rt::uv::uvll::*; use super::super::io::support::PathLike; @@ -62,7 +62,7 @@ pub fn open(loop_: &Loop, path: &P, flags: int, mode: int, pub fn open_sync(loop_: &Loop, path: &P, flags: int, mode: int) -> Result { let result = FsRequest::open_common(loop_, path, flags, mode, None); - sync_cleanup(loop_, result) + sync_cleanup(result) } fn unlink_common(loop_: &Loop, path: &P, cb: Option) -> int { @@ -83,11 +83,11 @@ fn unlink_common(loop_: &Loop, path: &P, cb: Option) -> } pub fn unlink(loop_: &Loop, path: &P, cb: FsCallback) { let result = FsRequest::unlink_common(loop_, path, Some(cb)); - sync_cleanup(loop_, result); + sync_cleanup(result); } pub fn unlink_sync(loop_: &Loop, path: &P) -> Result { let result = FsRequest::unlink_common(loop_, path, None); - sync_cleanup(loop_, result) + sync_cleanup(result) } pub fn install_req_data(&self, cb: Option) { @@ -140,9 +140,9 @@ fn native_handle(&self) -> *uvll::uv_fs_t { } } -fn sync_cleanup(loop_: &Loop, result: int) +fn sync_cleanup(result: int) -> Result { - match status_to_maybe_uv_error_with_loop(loop_.native_handle(), result as i32) { + match status_to_maybe_uv_error(result as i32) { Some(err) => Err(err), None => Ok(result) } @@ -186,7 +186,7 @@ pub fn write(&mut self, loop_: &Loop, buf: Buf, offset: i64, cb: FsCallback) { pub fn write_sync(&mut self, loop_: &Loop, buf: Buf, offset: i64) -> Result { let result = self.write_common(loop_, buf, offset, None); - sync_cleanup(loop_, result) + sync_cleanup(result) } fn read_common(&mut self, loop_: &Loop, buf: Buf, @@ -214,7 +214,7 @@ pub fn read(&mut self, loop_: &Loop, buf: Buf, offset: i64, cb: FsCallback) { pub fn read_sync(&mut self, loop_: &Loop, buf: Buf, offset: i64) -> Result { let result = self.read_common(loop_, buf, offset, None); - sync_cleanup(loop_, result) + sync_cleanup(result) } fn close_common(self, loop_: &Loop, cb: Option) -> int { @@ -236,12 +236,11 @@ pub fn close(self, loop_: &Loop, cb: FsCallback) { } pub fn close_sync(self, loop_: &Loop) -> Result { let result = self.close_common(loop_, None); - sync_cleanup(loop_, result) + sync_cleanup(result) } } extern fn compl_cb(req: *uv_fs_t) { let mut req: FsRequest = NativeHandle::from_native_handle(req); - let loop_ = req.get_loop(); // pull the user cb out of the req data let cb = { let data = req.get_req_data(); @@ -252,8 +251,7 @@ pub fn close_sync(self, loop_: &Loop) -> Result { // in uv_fs_open calls, the result will be the fd in the // case of success, otherwise it's -1 indicating an error let result = req.get_result(); - let status = status_to_maybe_uv_error_with_loop( - loop_.native_handle(), result); + let status = status_to_maybe_uv_error(result); // we have a req and status, call the user cb.. // only giving the user a ref to the FsRequest, as we // have to clean it up, afterwards (and they aren't really diff --git a/src/libstd/rt/uv/idle.rs b/src/libstd/rt/uv/idle.rs index a21146620ca..8cbcd7b77c0 100644 --- a/src/libstd/rt/uv/idle.rs +++ b/src/libstd/rt/uv/idle.rs @@ -43,7 +43,7 @@ pub fn start(&mut self, cb: IdleCallback) { let mut idle_watcher: IdleWatcher = NativeHandle::from_native_handle(handle); let data = idle_watcher.get_watcher_data(); let cb: &IdleCallback = data.idle_cb.get_ref(); - let status = status_to_maybe_uv_error(idle_watcher, status); + let status = status_to_maybe_uv_error(status); (*cb)(idle_watcher, status); } } @@ -57,7 +57,7 @@ pub fn restart(&mut self) { let mut idle_watcher: IdleWatcher = NativeHandle::from_native_handle(handle); let data = idle_watcher.get_watcher_data(); let cb: &IdleCallback = data.idle_cb.get_ref(); - let status = status_to_maybe_uv_error(idle_watcher, status); + let status = status_to_maybe_uv_error(status); (*cb)(idle_watcher, status); } } diff --git a/src/libstd/rt/uv/mod.rs b/src/libstd/rt/uv/mod.rs index b85b223468e..451d454d2d8 100644 --- a/src/libstd/rt/uv/mod.rs +++ b/src/libstd/rt/uv/mod.rs @@ -204,12 +204,12 @@ fn drop_watcher_data(&mut self) { // XXX: Need to define the error constants like EOF so they can be // compared to the UvError type -pub struct UvError(uvll::uv_err_t); +pub struct UvError(c_int); impl UvError { pub fn name(&self) -> ~str { unsafe { - let inner = match self { &UvError(ref a) => a }; + let inner = match self { &UvError(a) => a }; let name_str = uvll::err_name(inner); assert!(name_str.is_not_null()); from_c_str(name_str) @@ -218,7 +218,7 @@ pub fn name(&self) -> ~str { pub fn desc(&self) -> ~str { unsafe { - let inner = match self { &UvError(ref a) => a }; + let inner = match self { &UvError(a) => a }; let desc_str = uvll::strerror(inner); assert!(desc_str.is_not_null()); from_c_str(desc_str) @@ -226,7 +226,7 @@ pub fn desc(&self) -> ~str { } pub fn is_eof(&self) -> bool { - self.code == uvll::EOF + **self == uvll::EOF } } @@ -238,18 +238,10 @@ fn to_str(&self) -> ~str { #[test] fn error_smoke_test() { - let err = uvll::uv_err_t { code: 1, sys_errno_: 1 }; - let err: UvError = UvError(err); + let err: UvError = UvError(uvll::EOF); assert_eq!(err.to_str(), ~"EOF: end of file"); } -pub fn last_uv_error>(watcher: &W) -> UvError { - unsafe { - let loop_ = watcher.event_loop(); - UvError(uvll::last_error(loop_.native_handle())) - } -} - pub fn uv_error_to_io_error(uverr: UvError) -> IoError { unsafe { // Importing error constants @@ -257,10 +249,10 @@ pub fn uv_error_to_io_error(uverr: UvError) -> IoError { use rt::io::*; // uv error descriptions are static - let c_desc = uvll::strerror(&*uverr); + let c_desc = uvll::strerror(*uverr); let desc = str::raw::c_str_to_static_slice(c_desc); - let kind = match uverr.code { + let kind = match *uverr { UNKNOWN => OtherIoError, OK => OtherIoError, EOF => EndOfFile, @@ -268,8 +260,8 @@ pub fn uv_error_to_io_error(uverr: UvError) -> IoError { ECONNREFUSED => ConnectionRefused, ECONNRESET => ConnectionReset, EPIPE => BrokenPipe, - _ => { - rtdebug!("uverr.code %u", uverr.code as uint); + err => { + rtdebug!("uverr.code %d", err as int); // XXX: Need to map remaining uv error types OtherIoError } @@ -284,30 +276,12 @@ pub fn uv_error_to_io_error(uverr: UvError) -> IoError { } /// Given a uv handle, convert a callback status to a UvError -pub fn status_to_maybe_uv_error_with_loop( - loop_: *uvll::uv_loop_t, - status: c_int) -> Option { - if status != -1 { +pub fn status_to_maybe_uv_error(status: c_int) -> Option +{ + if status >= 0 { None } else { - unsafe { - rtdebug!("loop: %x", loop_ as uint); - let err = uvll::last_error(loop_); - Some(UvError(err)) - } - } -} -/// Given a uv handle, convert a callback status to a UvError -pub fn status_to_maybe_uv_error>(handle: U, - status: c_int) -> Option { - if status != -1 { - None - } else { - unsafe { - rtdebug!("handle: %x", handle.native_handle() as uint); - let loop_ = uvll::get_loop_for_uv_handle(handle.native_handle()); - status_to_maybe_uv_error_with_loop(loop_, status) - } + Some(UvError(status)) } } diff --git a/src/libstd/rt/uv/net.rs b/src/libstd/rt/uv/net.rs index 9d4eb8f6302..2535e40ba4f 100644 --- a/src/libstd/rt/uv/net.rs +++ b/src/libstd/rt/uv/net.rs @@ -16,7 +16,6 @@ use rt::uv::{Loop, Watcher, Request, UvError, Buf, NativeHandle, NullCallback, status_to_maybe_uv_error}; use rt::io::net::ip::{SocketAddr, Ipv4Addr, Ipv6Addr}; -use rt::uv::last_uv_error; use vec; use str; use from_str::{FromStr}; @@ -161,7 +160,7 @@ pub fn read_start(&mut self, alloc: AllocCallback, cb: ReadCallback) { rtdebug!("buf len: %d", buf.len as int); let mut stream_watcher: StreamWatcher = NativeHandle::from_native_handle(stream); let cb = stream_watcher.get_watcher_data().read_cb.get_ref(); - let status = status_to_maybe_uv_error(stream_watcher, nread as c_int); + let status = status_to_maybe_uv_error(nread as c_int); (*cb)(stream_watcher, nread as int, buf, status); } } @@ -191,7 +190,7 @@ pub fn write(&mut self, buf: Buf, cb: ConnectionCallback) { let mut stream_watcher = write_request.stream(); write_request.delete(); let cb = stream_watcher.get_watcher_data().write_cb.take_unwrap(); - let status = status_to_maybe_uv_error(stream_watcher, status); + let status = status_to_maybe_uv_error(status); cb(stream_watcher, status); } } @@ -256,7 +255,7 @@ pub fn bind(&mut self, address: SocketAddr) -> Result<(), UvError> { }; match result { 0 => Ok(()), - _ => Err(last_uv_error(self)), + _ => Err(UvError(result)), } } } @@ -284,7 +283,7 @@ pub fn connect(&mut self, address: SocketAddr, cb: ConnectionCallback) { let mut stream_watcher = connect_request.stream(); connect_request.delete(); let cb = stream_watcher.get_watcher_data().connect_cb.take_unwrap(); - let status = status_to_maybe_uv_error(stream_watcher, status); + let status = status_to_maybe_uv_error(status); cb(stream_watcher, status); } } @@ -307,7 +306,7 @@ pub fn listen(&mut self, cb: ConnectionCallback) { rtdebug!("connection_cb"); let mut stream_watcher: StreamWatcher = NativeHandle::from_native_handle(handle); let cb = stream_watcher.get_watcher_data().connect_cb.get_ref(); - let status = status_to_maybe_uv_error(stream_watcher, status); + let status = status_to_maybe_uv_error(status); (*cb)(stream_watcher, status); } } @@ -351,7 +350,7 @@ pub fn bind(&mut self, address: SocketAddr) -> Result<(), UvError> { }; match result { 0 => Ok(()), - _ => Err(last_uv_error(self)), + _ => Err(UvError(result)), } } } @@ -384,7 +383,7 @@ pub fn recv_start(&mut self, alloc: AllocCallback, cb: UdpReceiveCallback) { rtdebug!("buf len: %d", buf.len as int); let mut udp_watcher: UdpWatcher = NativeHandle::from_native_handle(handle); let cb = udp_watcher.get_watcher_data().udp_recv_cb.get_ref(); - let status = status_to_maybe_uv_error(udp_watcher, nread as c_int); + let status = status_to_maybe_uv_error(nread as c_int); let addr = uv_socket_addr_to_socket_addr(sockaddr_to_UvSocketAddr(addr)); (*cb)(udp_watcher, nread as int, buf, addr, flags as uint, status); } @@ -419,7 +418,7 @@ pub fn send(&mut self, buf: Buf, address: SocketAddr, cb: UdpSendCallback) { let mut udp_watcher = send_request.handle(); send_request.delete(); let cb = udp_watcher.get_watcher_data().udp_send_cb.take_unwrap(); - let status = status_to_maybe_uv_error(udp_watcher, status); + let status = status_to_maybe_uv_error(status); cb(udp_watcher, status); } } diff --git a/src/libstd/rt/uv/timer.rs b/src/libstd/rt/uv/timer.rs index eaa5e77a6da..7b09cf2eb0e 100644 --- a/src/libstd/rt/uv/timer.rs +++ b/src/libstd/rt/uv/timer.rs @@ -43,7 +43,7 @@ pub fn start(&mut self, timeout: u64, repeat: u64, cb: TimerCallback) { let mut watcher: TimerWatcher = NativeHandle::from_native_handle(handle); let data = watcher.get_watcher_data(); let cb = data.timer_cb.get_ref(); - let status = status_to_maybe_uv_error(watcher, status); + let status = status_to_maybe_uv_error(status); (*cb)(watcher, status); } } diff --git a/src/libstd/rt/uv/uvio.rs b/src/libstd/rt/uv/uvio.rs index c22674995de..c9b12e47f92 100644 --- a/src/libstd/rt/uv/uvio.rs +++ b/src/libstd/rt/uv/uvio.rs @@ -154,7 +154,7 @@ fn socket_name>(sk: SocketNameKind, }; if r != 0 { - let status = status_to_maybe_uv_error(handle, r); + let status = status_to_maybe_uv_error(r); return Err(uv_error_to_io_error(status.unwrap())); } @@ -728,7 +728,7 @@ fn accept_simultaneously(&mut self) -> Result<(), IoError> { uvll::tcp_simultaneous_accepts(self_.listener.watcher.native_handle(), 1 as c_int) }; - match status_to_maybe_uv_error(self_.listener.watcher, r) { + match status_to_maybe_uv_error(r) { Some(err) => Err(uv_error_to_io_error(err)), None => Ok(()) } @@ -741,7 +741,7 @@ fn dont_accept_simultaneously(&mut self) -> Result<(), IoError> { uvll::tcp_simultaneous_accepts(self_.listener.watcher.native_handle(), 0 as c_int) }; - match status_to_maybe_uv_error(self_.listener.watcher, r) { + match status_to_maybe_uv_error(r) { Some(err) => Err(uv_error_to_io_error(err)), None => Ok(()) } @@ -862,7 +862,7 @@ fn control_congestion(&mut self) -> Result<(), IoError> { do self.home_for_io |self_| { let r = unsafe { uvll::tcp_nodelay(self_.watcher.native_handle(), 0 as c_int) }; - match status_to_maybe_uv_error(self_.watcher, r) { + match status_to_maybe_uv_error(r) { Some(err) => Err(uv_error_to_io_error(err)), None => Ok(()) } @@ -873,7 +873,7 @@ fn nodelay(&mut self) -> Result<(), IoError> { do self.home_for_io |self_| { let r = unsafe { uvll::tcp_nodelay(self_.watcher.native_handle(), 1 as c_int) }; - match status_to_maybe_uv_error(self_.watcher, r) { + match status_to_maybe_uv_error(r) { Some(err) => Err(uv_error_to_io_error(err)), None => Ok(()) } @@ -887,7 +887,7 @@ fn keepalive(&mut self, delay_in_seconds: uint) -> Result<(), IoError> { delay_in_seconds as c_uint) }; - match status_to_maybe_uv_error(self_.watcher, r) { + match status_to_maybe_uv_error(r) { Some(err) => Err(uv_error_to_io_error(err)), None => Ok(()) } @@ -900,7 +900,7 @@ fn letdie(&mut self) -> Result<(), IoError> { uvll::tcp_keepalive(self_.watcher.native_handle(), 0 as c_int, 0 as c_uint) }; - match status_to_maybe_uv_error(self_.watcher, r) { + match status_to_maybe_uv_error(r) { Some(err) => Err(uv_error_to_io_error(err)), None => Ok(()) } @@ -1012,7 +1012,7 @@ fn join_multicast(&mut self, multi: IpAddr) -> Result<(), IoError> { } }; - match status_to_maybe_uv_error(self_.watcher, r) { + match status_to_maybe_uv_error(r) { Some(err) => Err(uv_error_to_io_error(err)), None => Ok(()) } @@ -1028,7 +1028,7 @@ fn leave_multicast(&mut self, multi: IpAddr) -> Result<(), IoError> { } }; - match status_to_maybe_uv_error(self_.watcher, r) { + match status_to_maybe_uv_error(r) { Some(err) => Err(uv_error_to_io_error(err)), None => Ok(()) } @@ -1042,7 +1042,7 @@ fn loop_multicast_locally(&mut self) -> Result<(), IoError> { uvll::udp_set_multicast_loop(self_.watcher.native_handle(), 1 as c_int) }; - match status_to_maybe_uv_error(self_.watcher, r) { + match status_to_maybe_uv_error(r) { Some(err) => Err(uv_error_to_io_error(err)), None => Ok(()) } @@ -1056,7 +1056,7 @@ fn dont_loop_multicast_locally(&mut self) -> Result<(), IoError> { uvll::udp_set_multicast_loop(self_.watcher.native_handle(), 0 as c_int) }; - match status_to_maybe_uv_error(self_.watcher, r) { + match status_to_maybe_uv_error(r) { Some(err) => Err(uv_error_to_io_error(err)), None => Ok(()) } @@ -1070,7 +1070,7 @@ fn multicast_time_to_live(&mut self, ttl: int) -> Result<(), IoError> { uvll::udp_set_multicast_ttl(self_.watcher.native_handle(), ttl as c_int) }; - match status_to_maybe_uv_error(self_.watcher, r) { + match status_to_maybe_uv_error(r) { Some(err) => Err(uv_error_to_io_error(err)), None => Ok(()) } @@ -1084,7 +1084,7 @@ fn time_to_live(&mut self, ttl: int) -> Result<(), IoError> { uvll::udp_set_ttl(self_.watcher.native_handle(), ttl as c_int) }; - match status_to_maybe_uv_error(self_.watcher, r) { + match status_to_maybe_uv_error(r) { Some(err) => Err(uv_error_to_io_error(err)), None => Ok(()) } @@ -1098,7 +1098,7 @@ fn hear_broadcasts(&mut self) -> Result<(), IoError> { uvll::udp_set_broadcast(self_.watcher.native_handle(), 1 as c_int) }; - match status_to_maybe_uv_error(self_.watcher, r) { + match status_to_maybe_uv_error(r) { Some(err) => Err(uv_error_to_io_error(err)), None => Ok(()) } @@ -1112,7 +1112,7 @@ fn ignore_broadcasts(&mut self) -> Result<(), IoError> { uvll::udp_set_broadcast(self_.watcher.native_handle(), 0 as c_int) }; - match status_to_maybe_uv_error(self_.watcher, r) { + match status_to_maybe_uv_error(r) { Some(err) => Err(uv_error_to_io_error(err)), None => Ok(()) } diff --git a/src/libstd/rt/uv/uvll.rs b/src/libstd/rt/uv/uvll.rs index 08e9bc062ce..4ef97677bd3 100644 --- a/src/libstd/rt/uv/uvll.rs +++ b/src/libstd/rt/uv/uvll.rs @@ -37,21 +37,34 @@ use libc; use prelude::*; use ptr; -use str; use vec; -pub static UNKNOWN: c_int = -1; +pub use self::errors::*; + pub static OK: c_int = 0; -pub static EOF: c_int = 1; -pub static EADDRINFO: c_int = 2; -pub static EACCES: c_int = 3; -pub static ECONNREFUSED: c_int = 12; -pub static ECONNRESET: c_int = 13; -pub static EPIPE: c_int = 36; +pub static EOF: c_int = -4095; +pub static UNKNOWN: c_int = -4094; + +// uv-errno.h redefines error codes for windows, but not for unix... + +#[cfg(windows)] +pub mod errors { + use libc::c_int; -pub struct uv_err_t { - code: c_int, - sys_errno_: c_int + pub static EACCES: c_int = -4093; + pub static ECONNREFUSED: c_int = -4079; + pub static ECONNRESET: c_int = -4078; + pub static EPIPE: c_int = -4048; +} +#[cfg(not(windows))] +pub mod errors { + use libc; + use libc::c_int; + + pub static EACCES: c_int = -libc::EACCES; + pub static ECONNREFUSED: c_int = -libc::ECONNREFUSED; + pub static ECONNRESET: c_int = -libc::ECONNRESET; + pub static EPIPE: c_int = -libc::EPIPE; } pub struct uv_buf_t { @@ -537,20 +550,12 @@ pub unsafe fn read_stop(stream: *uv_stream_t) -> c_int { return rust_uv_read_stop(stream as *c_void); } -pub unsafe fn last_error(loop_handle: *c_void) -> uv_err_t { - #[fixed_stack_segment]; #[inline(never)]; - - return rust_uv_last_error(loop_handle); -} - -pub unsafe fn strerror(err: *uv_err_t) -> *c_char { +pub unsafe fn strerror(err: c_int) -> *c_char { #[fixed_stack_segment]; #[inline(never)]; - return rust_uv_strerror(err); } -pub unsafe fn err_name(err: *uv_err_t) -> *c_char { +pub unsafe fn err_name(err: c_int) -> *c_char { #[fixed_stack_segment]; #[inline(never)]; - return rust_uv_err_name(err); } @@ -787,23 +792,6 @@ pub unsafe fn freeaddrinfo(ai: *addrinfo) { rust_uv_freeaddrinfo(ai); } -pub unsafe fn get_last_err_info(uv_loop: *c_void) -> ~str { - let err = last_error(uv_loop); - let err_ptr = ptr::to_unsafe_ptr(&err); - let err_name = str::raw::from_c_str(err_name(err_ptr)); - let err_msg = str::raw::from_c_str(strerror(err_ptr)); - return fmt!("LIBUV ERROR: name: %s msg: %s", - err_name, err_msg); -} - -pub unsafe fn get_last_err_data(uv_loop: *c_void) -> uv_err_data { - let err = last_error(uv_loop); - let err_ptr = ptr::to_unsafe_ptr(&err); - let err_name = str::raw::from_c_str(err_name(err_ptr)); - let err_msg = str::raw::from_c_str(strerror(err_ptr)); - uv_err_data { err_name: err_name, err_msg: err_msg } -} - pub struct uv_err_data { err_name: ~str, err_msg: ~str, @@ -835,9 +823,8 @@ fn rust_uv_async_init(loop_handle: *c_void, cb: uv_async_cb) -> c_int; fn rust_uv_tcp_init(loop_handle: *c_void, handle_ptr: *uv_tcp_t) -> c_int; fn rust_uv_buf_init(out_buf: *uv_buf_t, base: *u8, len: size_t); - fn rust_uv_last_error(loop_handle: *c_void) -> uv_err_t; - fn rust_uv_strerror(err: *uv_err_t) -> *c_char; - fn rust_uv_err_name(err: *uv_err_t) -> *c_char; + fn rust_uv_strerror(err: c_int) -> *c_char; + fn rust_uv_err_name(err: c_int) -> *c_char; fn rust_uv_ip4_addrp(ip: *u8, port: c_int) -> *sockaddr_in; fn rust_uv_ip6_addrp(ip: *u8, port: c_int) -> *sockaddr_in6; fn rust_uv_free_ip4_addr(addr: *sockaddr_in); diff --git a/src/libuv b/src/libuv index dfae9c3e958..d88cf5652a1 160000 --- a/src/libuv +++ b/src/libuv @@ -1 +1 @@ -Subproject commit dfae9c3e958dc086d9c0ab068cd76d196c95a433 +Subproject commit d88cf5652a1afb23939da0bae86c70ec521b9921 diff --git a/src/rt/rust_uv.cpp b/src/rt/rust_uv.cpp index ac5ea4bb3b3..bfdf0e67a9b 100644 --- a/src/rt/rust_uv.cpp +++ b/src/rt/rust_uv.cpp @@ -329,20 +329,13 @@ rust_uv_get_len_from_buf(uv_buf_t buf) { return buf.len; } -extern "C" uv_err_t -rust_uv_last_error(uv_loop_t* loop) { - return uv_last_error(loop); -} - extern "C" const char* -rust_uv_strerror(uv_err_t* err_ptr) { - uv_err_t err = *err_ptr; +rust_uv_strerror(int err) { return uv_strerror(err); } extern "C" const char* -rust_uv_err_name(uv_err_t* err_ptr) { - uv_err_t err = *err_ptr; +rust_uv_err_name(int err) { return uv_err_name(err); } diff --git a/src/rt/rustrt.def.in b/src/rt/rustrt.def.in index 45109443f06..bf3500e4c72 100644 --- a/src/rt/rustrt.def.in +++ b/src/rt/rustrt.def.in @@ -47,7 +47,6 @@ rust_uv_timer_start rust_uv_timer_stop rust_uv_tcp_init rust_uv_buf_init -rust_uv_last_error rust_uv_strerror rust_uv_err_name rust_uv_ip4_addr -- 2.44.0