1. 17 5月, 2014 1 次提交
  2. 11 5月, 2014 1 次提交
    • A
      core: Remove the cast module · f94d671b
      Alex Crichton 提交于
      This commit revisits the `cast` module in libcore and libstd, and scrutinizes
      all functions inside of it. The result was to remove the `cast` module entirely,
      folding all functionality into the `mem` module. Specifically, this is the fate
      of each function in the `cast` module.
      
      * transmute - This function was moved to `mem`, but it is now marked as
                    #[unstable]. This is due to planned changes to the `transmute`
                    function and how it can be invoked (see the #[unstable] comment).
                    For more information, see RFC 5 and #12898
      
      * transmute_copy - This function was moved to `mem`, with clarification that is
                         is not an error to invoke it with T/U that are different
                         sizes, but rather that it is strongly discouraged. This
                         function is now #[stable]
      
      * forget - This function was moved to `mem` and marked #[stable]
      
      * bump_box_refcount - This function was removed due to the deprecation of
                            managed boxes as well as its questionable utility.
      
      * transmute_mut - This function was previously deprecated, and removed as part
                        of this commit.
      
      * transmute_mut_unsafe - This function doesn't serve much of a purpose when it
                               can be achieved with an `as` in safe code, so it was
                               removed.
      
      * transmute_lifetime - This function was removed because it is likely a strong
                             indication that code is incorrect in the first place.
      
      * transmute_mut_lifetime - This function was removed for the same reasons as
                                 `transmute_lifetime`
      
      * copy_lifetime - This function was moved to `mem`, but it is marked
                        `#[unstable]` now due to the likelihood of being removed in
                        the future if it is found to not be very useful.
      
      * copy_mut_lifetime - This function was also moved to `mem`, but had the same
                            treatment as `copy_lifetime`.
      
      * copy_lifetime_vec - This function was removed because it is not used today,
                            and its existence is not necessary with DST
                            (copy_lifetime will suffice).
      
      In summary, the cast module was stripped down to these functions, and then the
      functions were moved to the `mem` module.
      
          transmute - #[unstable]
          transmute_copy - #[stable]
          forget - #[stable]
          copy_lifetime - #[unstable]
          copy_mut_lifetime - #[unstable]
      
      [breaking-change]
      f94d671b
  3. 08 5月, 2014 3 次提交
    • A
      Test fixes and rebase conflicts · 418f1973
      Alex Crichton 提交于
      418f1973
    • A
      rustuv: Implement timeouts for unix networking · b2c6d6fd
      Alex Crichton 提交于
      This commit implements the set{,_read,_write}_timeout() methods for the
      libuv-based networking I/O objects. The implementation details are commented
      thoroughly throughout the implementation.
      b2c6d6fd
    • A
      std: Add close_{read,write}() methods to I/O · ec9ade93
      Alex Crichton 提交于
      Two new methods were added to TcpStream and UnixStream:
      
          fn close_read(&mut self) -> IoResult<()>;
          fn close_write(&mut self) -> IoResult<()>;
      
      These two methods map to shutdown()'s behavior (the system call on unix),
      closing the reading or writing half of a duplex stream. These methods are
      primarily added to allow waking up a pending read in another task. By closing
      the reading half of a connection, all pending readers will be woken up and will
      return with EndOfFile. The close_write() method was added for symmetry with
      close_read(), and I imagine that it will be quite useful at some point.
      
      Implementation-wise, librustuv got the short end of the stick this time. The
      native versions just delegate to the shutdown() syscall (easy). The uv versions
      can leverage uv_shutdown() for tcp/unix streams, but only for closing the
      writing half. Closing the reading half is done through some careful dancing to
      wake up a pending reader.
      
      As usual, windows likes to be different from unix. The windows implementation
      uses shutdown() for sockets, but shutdown() is not available for named pipes.
      Instead, CancelIoEx was used with same fancy synchronization to make sure
      everyone knows what's up.
      
      cc #11165
      ec9ade93
  4. 07 5月, 2014 1 次提交
    • P
      librustc: Remove `~EXPR`, `~TYPE`, and `~PAT` from the language, except · 090040bf
      Patrick Walton 提交于
      for `~str`/`~[]`.
      
      Note that `~self` still remains, since I forgot to add support for
      `Box<self>` before the snapshot.
      
      How to update your code:
      
      * Instead of `~EXPR`, you should write `box EXPR`.
      
      * Instead of `~TYPE`, you should write `Box<Type>`.
      
      * Instead of `~PATTERN`, you should write `box PATTERN`.
      
      [breaking-change]
      090040bf
  5. 03 5月, 2014 1 次提交
  6. 25 4月, 2014 2 次提交
    • A
      std: Add timeouts to unix connect/accept · 6328f7c1
      Alex Crichton 提交于
      This adds support for connecting to a unix socket with a timeout (a named pipe
      on windows), and accepting a connection with a timeout. The goal is to bring
      unix pipes/named sockets back in line with TCP support for timeouts.
      
      Similarly to the TCP sockets, all methods are marked #[experimental] due to
      uncertainty about the type of the timeout argument.
      
      This internally involved a good bit of refactoring to share as much code as
      possible between TCP servers and pipe servers, but the core implementation did
      not change drastically as part of this commit.
      
      cc #13523
      6328f7c1
    • A
      Update libuv · 58a51120
      Alex Crichton 提交于
      This update brings a few months of changes, but primarily a fix for the
      following situation.
      
      When creating a handle to stdin, libuv used to set the stdin handle to
      nonblocking mode. This would end up affect this stdin handle across all
      processes that shared it, which mean that stdin become nonblocking for everyone
      using the same stdin. On linux, this also affected *stdout* because stdin/stdout
      roughly point at the same thing.
      
      This problem became apparent when running the test suite manually on a local
      computer. The stdtest suite (running with libgreen) would set stdout to
      nonblocking mode (as described above), and then the next test suite would always
      fail for a printing failure (because stdout was returning EAGAIN).
      
      This has been fixed upstream, joyent/libuv@342e8c, and this update pulls in this
      fix. This also brings us in line with a recently upstreamed libuv patch.
      
      Closes #13336
      Closes #13355
      58a51120
  7. 24 4月, 2014 1 次提交
    • A
      std: Add support for an accept() timeout · e5d3e518
      Alex Crichton 提交于
      This adds experimental support for timeouts when accepting sockets through
      `TcpAcceptor::accept`. This does not add a separate `accept_timeout` function,
      but rather it adds a `set_timeout` function instead. This second function is
      intended to be used as a hard deadline after which all accepts will never block
      and fail immediately.
      
      This idea was derived from Go's SetDeadline() methods. We do not currently have
      a robust time abstraction in the standard library, so I opted to have the
      argument be a relative time in millseconds into the future. I believe a more
      appropriate argument type is an absolute time, but this concept does not exist
      yet (this is also why the function is marked #[experimental]).
      
      The native support is built on select(), similarly to connect_timeout(), and the
      green support is based on channel select and a timer.
      
      cc #13523
      e5d3e518
  8. 20 4月, 2014 1 次提交
    • A
      rustuv: Fix a tcp connect timeout bug on windows · 5bfb260c
      Alex Crichton 提交于
      When a uv_tcp_t is closed in libuv, it will still invoke the pending connect_cb,
      and I thought that it would always call it with ECANCELED, but it turns out that
      sometimes we'll get a different error code instead. Handle this case by checking
      to see if the request's data is NULL and bail out if so (the timeout expired).
      5bfb260c
  9. 19 4月, 2014 2 次提交
    • A
      std: Add an experimental connect_timeout function · 3915e17c
      Alex Crichton 提交于
      This adds a `TcpStream::connect_timeout` function in order to assist opening
      connections with a timeout (cc #13523). There isn't really much design space for
      this specific operation (unlike timing out normal blocking reads/writes), so I
      am fairly confident that this is the correct interface for this function.
      
      The function is marked #[experimental] because it takes a u64 timeout argument,
      and the u64 type is likely to change in the future.
      3915e17c
    • R
      Replace all ~"" with "".to_owned() · 919889a1
      Richo Healey 提交于
      919889a1
  10. 16 4月, 2014 1 次提交
    • H
      Use the unsigned integer types for bitwise intrinsics. · 54ec04f1
      Huon Wilson 提交于
      Exposing ctpop, ctlz, cttz and bswap as taking signed i8/i16/... is just
      exposing the internal LLVM names pointlessly (LLVM doesn't have "signed
      integers" or "unsigned integers", it just has sized integer types
      with (un)signed *operations*).
      
      These operations are semantically working with raw bytes, which the
      unsigned types model better.
      54ec04f1
  11. 11 4月, 2014 1 次提交
    • A
      std: Make std::comm return types consistent · 545d4718
      Alex Crichton 提交于
      There are currently a number of return values from the std::comm methods, not
      all of which are necessarily completely expressive:
      
        Sender::try_send(t: T) -> bool
          This method currently doesn't transmit back the data `t` if the send fails
          due to the other end having disconnected. Additionally, this shares the name
          of the synchronous try_send method, but it differs in semantics in that it
          only has one failure case, not two (the buffer can never be full).
      
        SyncSender::try_send(t: T) -> TrySendResult<T>
          This method accurately conveys all possible information, but it uses a
          custom type to the std::comm module with no convenience methods on it.
          Additionally, if you want to inspect the result you're forced to import
          something from `std::comm`.
      
        SyncSender::send_opt(t: T) -> Option<T>
          This method uses Some(T) as an "error value" and None as a "success value",
          but almost all other uses of Option<T> have Some/None the other way
      
        Receiver::try_recv(t: T) -> TryRecvResult<T>
          Similarly to the synchronous try_send, this custom return type is lacking in
          terms of usability (no convenience methods).
      
      With this number of drawbacks in mind, I believed it was time to re-work the
      return types of these methods. The new API for the comm module is:
      
        Sender::send(t: T) -> ()
        Sender::send_opt(t: T) -> Result<(), T>
        SyncSender::send(t: T) -> ()
        SyncSender::send_opt(t: T) -> Result<(), T>
        SyncSender::try_send(t: T) -> Result<(), TrySendError<T>>
        Receiver::recv() -> T
        Receiver::recv_opt() -> Result<T, ()>
        Receiver::try_recv() -> Result<T, TryRecvError>
      
      The notable changes made are:
      
      * Sender::try_send => Sender::send_opt. This renaming brings the semantics in
        line with the SyncSender::send_opt method. An asychronous send only has one
        failure case, unlike the synchronous try_send method which has two failure
        cases (full/disconnected).
      
      * Sender::send_opt returns the data back to the caller if the send is guaranteed
        to fail. This method previously returned `bool`, but then it was unable to
        retrieve the data if the data was guaranteed to fail to send. There is still a
        race such that when `Ok(())` is returned the data could still fail to be
        received, but that's inherent to an asynchronous channel.
      
      * Result is now the basis of all return values. This not only adds lots of
        convenience methods to all return values for free, but it also means that you
        can inspect the return values with no extra imports (Ok/Err are in the
        prelude). Additionally, it's now self documenting when something failed or not
        because the return value has "Err" in the name.
      
      Things I'm a little uneasy about:
      
      * The methods send_opt and recv_opt are not returning options, but rather
        results. I felt more strongly that Option was the wrong return type than the
        _opt prefix was wrong, and I coudn't think of a much better name for these
        methods. One possible way to think about them is to read the _opt suffix as
        "optionally".
      
      * Result<T, ()> is often better expressed as Option<T>. This is only applicable
        to the recv_opt() method, but I thought it would be more consistent for
        everything to return Result rather than one method returning an Option.
      
      Despite my two reasons to feel uneasy, I feel much better about the consistency
      in return values at this point, and I think the only real open question is if
      there's a better suffix for {send,recv}_opt.
      
      Closes #11527
      545d4718
  12. 05 4月, 2014 1 次提交
  13. 03 4月, 2014 1 次提交
  14. 01 4月, 2014 1 次提交
  15. 28 3月, 2014 1 次提交
  16. 14 3月, 2014 2 次提交
    • A
      io: Bind to shutdown() for TCP streams · a63deeb3
      Alex Crichton 提交于
      This is something that is plausibly useful, and is provided by libuv. This is
      not currently surfaced as part of the `TcpStream` type, but it may possibly
      appear in the future. For now only the raw functionality is provided through the
      Rtio objects.
      a63deeb3
    • A
      std: Rename Chan/Port types and constructor · 78580651
      Alex Crichton 提交于
      * Chan<T> => Sender<T>
      * Port<T> => Receiver<T>
      * Chan::new() => channel()
      * constructor returns (Sender, Receiver) instead of (Receiver, Sender)
      * local variables named `port` renamed to `rx`
      * local variables named `chan` renamed to `tx`
      
      Closes #11765
      78580651
  17. 13 2月, 2014 1 次提交
    • A
      Expose whether event loops have active I/O · cc34dbb8
      Alex Crichton 提交于
      The green scheduler can optimize its runtime based on this by deciding to not go
      to sleep in epoll() if there is no active I/O and there is a task to be stolen.
      
      This is implemented for librustuv by keeping a count of the number of tasks
      which are currently homed. If a task is homed, and then performs a blocking I/O
      operation, the count will be nonzero while the task is blocked. The homing count
      is intentionally 0 when there are I/O handles, but no handles currently blocked.
      The reason for this is that epoll() would only be used to wake up the scheduler
      anyway.
      
      The crux of this change was to have a `HomingMissile` contain a mutable borrowed
      reference back to the `HomeHandle`. The rest of the change was just dealing with
      this fallout. This reference is used to decrement the homed handle count in a
      HomingMissile's destructor.
      
      Also note that the count maintained is not atomic because all of its
      increments/decrements/reads are all on the same I/O thread.
      cc34dbb8
  18. 12 2月, 2014 1 次提交
  19. 09 2月, 2014 2 次提交
  20. 06 2月, 2014 1 次提交
    • A
      Implement clone() for TCP/UDP/Unix sockets · 56080c47
      Alex Crichton 提交于
      This is part of the overall strategy I would like to take when approaching
      issue #11165. The only two I/O objects that reasonably want to be "split" are
      the network stream objects. Everything else can be "split" by just creating
      another version.
      
      The initial idea I had was the literally split the object into a reader and a
      writer half, but that would just introduce lots of clutter with extra interfaces
      that were a little unnnecssary, or it would return a ~Reader and a ~Writer which
      means you couldn't access things like the remote peer name or local socket name.
      
      The solution I found to be nicer was to just clone the stream itself. The clone
      is just a clone of the handle, nothing fancy going on at the kernel level.
      Conceptually I found this very easy to wrap my head around (everything else
      supports clone()), and it solved the "split" problem at the same time.
      
      The cloning support is pretty specific per platform/lib combination:
      
      * native/win32 - uses some specific WSA apis to clone the SOCKET handle
      * native/unix - uses dup() to get another file descriptor
      * green/all - This is where things get interesting. When we support full clones
                    of a handle, this implies that we're allowing simultaneous writes
                    and reads to happen. It turns out that libuv doesn't support two
                    simultaneous reads or writes of the same object. It does support
                    *one* read and *one* write at the same time, however. Some extra
                    infrastructure was added to just block concurrent writers/readers
                    until the previous read/write operation was completed.
      
      I've added tests to the tcp/unix modules to make sure that this functionality is
      supported everywhere.
      56080c47
  21. 04 2月, 2014 1 次提交
  22. 29 1月, 2014 1 次提交
  23. 27 1月, 2014 2 次提交
  24. 21 1月, 2014 1 次提交
  25. 18 1月, 2014 1 次提交
    • D
      handle zero-size allocations correctly · ae2a5ecb
      Daniel Micay 提交于
      The `malloc` family of functions may return a null pointer for a
      zero-size allocation, which should not be interpreted as an
      out-of-memory error.
      
      If the implementation does not return a null pointer, then handling
      this will result in memory savings for zero-size types.
      
      This also switches some code to `malloc_raw` in order to maintain a
      centralized point for handling out-of-memory in `rt::global_heap`.
      
      Closes #11634
      ae2a5ecb
  26. 08 1月, 2014 1 次提交
  27. 25 12月, 2013 2 次提交
    • A
      rustuv: Get all tests passing again after refactor · afd4e2ad
      Alex Crichton 提交于
      All tests except for the homing tests are now working again with the
      librustuv/libgreen refactoring. The homing-related tests are currently commented
      out and now placed in the rustuv::homing module.
      
      I plan on refactoring scheduler pool spawning in order to enable more homing
      tests in a future commit.
      afd4e2ad
    • A
      rustuv: Reimplement without using std::rt::sched · 429313de
      Alex Crichton 提交于
      This reimplements librustuv without using the interfaces provided by the
      scheduler in libstd. This solely uses the new Runtime trait in order to
      interface with the local task and perform the necessary scheduling operations.
      
      The largest snag in this refactoring is reimplementing homing. The new runtime
      trait exposes no concept of "homing" a task or forcibly sending a task to a
      remote scheduler (there is no concept of a scheduler). In order to reimplement
      homing, the transferrence of tasks is now done at the librustuv level instead of
      the scheduler level. This means that all I/O loops now have a concurrent queue
      which receives homing messages and requests.
      
      This allows the entire implementation of librustuv to be only dependent on the
      runtime trait, severing all dependence of librustuv on the scheduler and related
      green-thread functions.
      
      This is all in preparation of the introduction of libgreen and libnative.
      
      At the same time, I also took the liberty of removing all glob imports from
      librustuv.
      429313de
  28. 17 12月, 2013 1 次提交
  29. 15 12月, 2013 1 次提交
  30. 11 12月, 2013 3 次提交