Commit graph

220 commits

Author SHA1 Message Date
Patrick Walton
a6f776d2dc libstd: Remove mocks. 2013-10-31 10:30:57 -07:00
Alex Crichton
452e5cdf11 Make Writer::flush a no-op default method
Closes #9126
2013-10-30 15:17:11 -07:00
bors
5e1a691125 auto merge of #9613 : jld/rust/enum-discrim-size.r0, r=alexcrichton
Allows an enum with a discriminant to use any of the primitive integer types to store it.  By default the smallest usable type is chosen, but this can be overridden with an attribute: `#[repr(int)]` etc., or `#[repr(C)]` to match the target's C ABI for the equivalent C enum.

Also adds a lint pass for using non-FFI safe enums in extern declarations, checks that specified discriminants can be stored in the specified type if any, and fixes assorted code that was assuming int.
2013-10-30 00:31:23 -07:00
bors
fed48cc861 auto merge of #10132 : pcwalton/rust/proc, r=pcwalton
the feature gate for `once fn` if used with the `~` sigil.

r? @brson
2013-10-29 10:52:25 -07:00
Patrick Walton
7e77bf1769 librustc: Implement the proc type as sugar for ~once fn and proc
notation for closures, and disable the feature gate for `once fn` if
used with the `~` sigil.
2013-10-29 10:34:17 -07:00
bors
52f42f1638 auto merge of #10058 : alexcrichton/rust/uv-crate, r=brson
This is one of the final steps needed to complete #9128. It still needs a little bit of polish before closing that issue, but it's in a pretty much "done" state now.

The idea here is that the entire event loop implementation using libuv is now housed in `librustuv` as a completely separate library. This library is then injected (via `extern mod rustv`) into executable builds (similarly to how libstd is injected, tunable via `#[no_uv]`) to bring in the "rust blessed event loop implementation."

Codegen-wise, there is a new `event_loop_factory` language item which is tagged on a function with 0 arguments returning `~EventLoop`. This function's symbol is then inserted into the crate map for an executable crate, and if there is no definition of the `event_loop_factory` language item then the value is null.

What this means is that embedding rust as a library in another language just got a little harder. Libraries don't have crate maps, which means that there's no way to find the event loop implementation to spin up the runtime. That being said, it's always possible to build the runtime manually. This request also makes more runtime components public which should probably be public anyway. This new public-ness should allow custom scheduler setups everywhere regardless of whether you follow the `rt::start `path.
2013-10-29 09:36:47 -07:00
Jed Davis
c8c08763ec Add repr attributes in various places that need them. 2013-10-29 09:09:20 -07:00
Alex Crichton
201cab84e8 Move rust's uv implementation to its own crate
There are a few reasons that this is a desirable move to take:

1. Proof of concept that a third party event loop is possible
2. Clear separation of responsibility between rt::io and the uv-backend
3. Enforce in the future that the event loop is "pluggable" and replacable

Here's a quick summary of the points of this pull request which make this
possible:

* Two new lang items were introduced: event_loop, and event_loop_factory.
  The idea of a "factory" is to define a function which can be called with no
  arguments and will return the new event loop as a trait object. This factory
  is emitted to the crate map when building an executable. The factory doesn't
  have to exist, and when it doesn't then an empty slot is in the crate map and
  a basic event loop with no I/O support is provided to the runtime.

* When building an executable, then the rustuv crate will be linked by default
  (providing a default implementation of the event loop) via a similar method to
  injecting a dependency on libstd. This is currently the only location where
  the rustuv crate is ever linked.

* There is a new #[no_uv] attribute (implied by #[no_std]) which denies
  implicitly linking to rustuv by default

Closes #5019
2013-10-29 08:39:22 -07:00
bors
c0222cda27 auto merge of #10133 : alexcrichton/rust/another-error, r=thestinger
This cropped up on the bsd bot, and if it's an error that gets thrown then it's
fine to just whitelist another type of error in the test.
2013-10-28 19:26:23 -07:00
Alex Crichton
6c75b73a6a Handle another possible error in a unix pipe test
This cropped up on the bsd bot, and if it's an error that gets thrown then it's
fine to just whitelist another type of error in the test.
2013-10-28 11:47:20 -07:00
Alex Crichton
72557d8312 Remove the extension traits for Readers/Writers
These methods are all excellent candidates for default methods, so there's no
need to require extra imports of various traits.
2013-10-28 10:16:45 -07:00
bors
672edb21d9 auto merge of #10093 : alexcrichton/rust/issue-8811, r=pcwalton
Closes #8811
2013-10-28 05:36:31 -07:00
bors
de3d36a763 auto merge of #10083 : alexcrichton/rust/timer-port, r=pcwalton
In addition to being able to sleep the current task, timers should be able to
create ports which get notified after a period of time.

Closes #10014
2013-10-28 02:41:18 -07:00
Marvin Löbel
fa8e71a825 Allow fail messages to be caught, and introduce the Any trait
Some code cleanup, sorting of import blocks

Removed std::unstable::UnsafeArc's use of Either

Added run-fail tests for the new FailWithCause impls

Changed future_result and try to return Result<(), ~Any>.

- Internally, there is an enum of possible fail messages passend around.
- In case of linked failure or a string message, the ~Any gets
  lazyly allocated in future_results recv method.
- For that, future result now returns a wrapper around a Port.
- Moved and renamed task::TaskResult into rt::task::UnwindResult
  and made it an internal enum.
- Introduced a replacement typedef `type TaskResult = Result<(), ~Any>`.
2013-10-28 08:50:32 +01:00
Alex Crichton
28f4f65d0c Fix a typo in a rt::io::signal test
It was pretty much a miracle that these tests were ever passing. They would
never have passed in the single threaded case because only one sigint in the
tests is ever generated, but when run in parallel two sigints will be generated.
2013-10-26 23:34:43 -07:00
Alex Crichton
651f5db462 Implement another error code found on windows.
Closes #8811
2013-10-26 16:04:05 -07:00
Alex Crichton
7a1d97e62c Enhance timers to create ports
In addition to being able to sleep the current task, timers should be able to
create ports which get notified after a period of time.

Closes #10014
2013-10-25 22:12:55 -07:00
bors
baeed886aa auto merge of #10060 : alexcrichton/rust/cached-stdout, r=brson
Almost all languages provide some form of buffering of the stdout stream, and
this commit adds this feature for rust. A handle to stdout is lazily initialized
in the Task structure as a buffered owned Writer trait object. The buffer
behavior depends on where stdout is directed to. Like C, this line-buffers the
stream when the output goes to a terminal (flushes on newlines), and also like C
this uses a fixed-size buffer when output is not directed at a terminal.

We may decide the fixed-size buffering is overkill, but it certainly does reduce
write syscall counts when piping output elsewhere. This is a *huge* benefit to
any code using logging macros or the printing macros. Formatting emits calls to
`write` very frequently, and to have each of them backed by a write syscall was
very expensive.

In a local benchmark of printing 10000 lines of "what" to stdout, I got the
following timings:

  when |  terminal   |  redirected
----------|---------------|--------
before |  0.575s     |   0.525s
after  |  0.197s     |   0.013s
  C    |  0.019s     |   0.004s

I can also confirm that we're buffering the output appropriately in both
situtations. We're still far slower than C, but I believe much of that has to do
with the "homing" that all tasks due, we're still performing an order of
magnitude more write syscalls than C does.
2013-10-25 10:36:09 -07:00
Alex Crichton
e8f72c38f4 Cache and buffer stdout per-task for printing
Almost all languages provide some form of buffering of the stdout stream, and
this commit adds this feature for rust. A handle to stdout is lazily initialized
in the Task structure as a buffered owned Writer trait object. The buffer
behavior depends on where stdout is directed to. Like C, this line-buffers the
stream when the output goes to a terminal (flushes on newlines), and also like C
this uses a fixed-size buffer when output is not directed at a terminal.

We may decide the fixed-size buffering is overkill, but it certainly does reduce
write syscall counts when piping output elsewhere. This is a *huge* benefit to
any code using logging macros or the printing macros. Formatting emits calls to
`write` very frequently, and to have each of them backed by a write syscall was
very expensive.

In a local benchmark of printing 10000 lines of "what" to stdout, I got the
following timings:

  when |  terminal   |  redirected
----------------------------------
before |  0.575s     |   0.525s
after  |  0.197s     |   0.013s
  C    |  0.019s     |   0.004s

I can also confirm that we're buffering the output appropriately in both
situtations. We're still far slower than C, but I believe much of that has to do
with the "homing" that all tasks due, we're still performing an order of
magnitude more write syscalls than C does.
2013-10-25 10:31:57 -07:00
Alex Crichton
64a5c3bc1e Implement a basic event loop built on LittleLock
It's not guaranteed that there will always be an event loop to run, and this
implementation will serve as an incredibly basic one which does not provide any
I/O, but allows the scheduler to still run.

cc #9128
2013-10-24 23:49:11 -07:00
Alex Crichton
188e471339 Another round of test fixes and merge conflicts 2013-10-24 14:22:35 -07:00
Alex Crichton
d425218395 Bring io::signal up to date with changes to rt::rtio 2013-10-24 14:22:35 -07:00
Do Nhat Minh
b5a02e0784 wrapping libuv signal for use in Rust
descriptive names
easier-to-use api
reorganize and document
2013-10-24 14:22:35 -07:00
Alex Crichton
816e46dd63 Fixing some tests, adding some pipes
This adds constructors to pipe streams in the new runtime to take ownership of
file descriptors, and also fixes a few tests relating to the std::run changes
(new errors are raised on io_error and one test is xfail'd).
2013-10-24 14:22:35 -07:00
Alex Crichton
262b958a4b Migrate std::run to libuv processes 2013-10-24 14:22:35 -07:00
Alex Crichton
6bb1df9251 Remove std::io once and for all! 2013-10-24 14:22:34 -07:00
Alex Crichton
c4907cfd14 Remove std::io from ebml 2013-10-24 14:21:58 -07:00
Alex Crichton
620ab3853a Test fixes and merge conflicts 2013-10-24 14:21:58 -07:00
Alex Crichton
279c351820 Move stdin to using libuv's pipes instead of a tty
I was seeing a lot of weird behavior with stdin behaving as a tty, and it
doesn't really quite make sense, so instead this moves to using libuv's pipes
instead (which make more sense for stdin specifically).

This prevents piping input to rustc hanging forever.
2013-10-24 14:21:58 -07:00
Alex Crichton
6b70ddfba1 Remove io::read_error
The general idea is to remove conditions completely from I/O, so in the meantime
remove the read_error condition to mean the same thing as the io_error condition.
2013-10-24 14:21:57 -07:00
Alex Crichton
4eb5336054 Move as much I/O as possible off of native::io
When uv's TTY I/O is used for the stdio streams, the file descriptors are put
into a non-blocking mode. This means that other concurrent writes to the same
stream can fail with EAGAIN or EWOULDBLOCK. By all I/O to event-loop I/O, we
avoid this error.

There is one location which cannot move, which is the runtime's dumb_println
function. This was implemented to handle the EAGAIN and EWOULDBLOCK errors and
simply retry again and again.
2013-10-24 14:21:57 -07:00
Alex Crichton
4ce71eaca3 Migrate the last typedefs to ~Trait in rtio
There are no longer any remnants of typedefs, and everything is now built on
true trait objects.
2013-10-24 14:21:57 -07:00
Alex Crichton
59d45b8fe7 Don't attempt to export uv functions directly 2013-10-24 14:21:57 -07:00
Alex Crichton
b46f60a729 Remove IoFactoryObject for ~IoFactory
This involved changing a fair amount of code, rooted in how we access the local
IoFactory instance. I added a helper method to the rtio module to access the
optional local IoFactory. This is different than before in which it was assumed
that a local IoFactory was *always* present. Now, a separate io_error is raised
when an IoFactory is not present, yet I/O is requested.
2013-10-24 14:21:57 -07:00
Alex Crichton
9110a38cbf Remove rt::io::support
This removes the PathLike trait associated with this "support module". This is
yet another "container of bytes" trait, so I didn't want to duplicate what
already exists throughout libstd. In actuality, we're going to pass of C strings
to the libuv APIs, so instead the arguments are now bound with the 'ToCStr'
trait instead.

Additionally, a layer of complexity was removed by immediately converting these
type-generic parameters into CStrings to get handed off to libuv apis.
2013-10-24 14:21:57 -07:00
Alex Crichton
0cad984765 Migrate Rtio objects to true trait objects
This moves as many as I could over to ~Trait instead of ~Typedef. The only
remaining one is the IoFactoryObject which should be coming soon...
2013-10-24 14:21:57 -07:00
Alex Crichton
35756fbcf6 Move rt::io::stdio from FileStream to a TTY
We get a little more functionality from libuv for these kinds of streams (things
like terminal dimentions), and it also appears to more gracefully handle the
stream being a window. Beforehand, if you used stdio and hit CTRL+d on a
process, libuv would continually return 0-length successful reads instead of
interpreting that the stream was closed.

I was hoping to be able to write tests for this, but currently the testing
infrastructure doesn't allow tests with a stdin and a stdout, but this has been
manually tested! (not that it means much)
2013-10-24 14:21:57 -07:00
Alex Crichton
32b07c6a40 Remove unbound pipes from io::pipe
This isn't necessary for creating processes (or at least not right now), and
it inherently attempts to expose implementation details.
2013-10-24 14:21:56 -07:00
Alex Crichton
c6fa4e277f Address a few XXX comments throughout the runtime
* Implement Seek for Option<Seek>
* Remove outdated comment for io::process
* De-pub a component which didn't need to be pub
2013-10-24 14:21:56 -07:00
Alex Crichton
1db783bdcf Finish implementing io::net::addrinfo
This fills in the `hints` structure and exposes libuv's full functionality for
doing dns lookups.
2013-10-24 14:21:56 -07:00
Alex Crichton
bac9681858 Implement io::net::unix 2013-10-24 14:21:56 -07:00
Ziad Hatahet
7d69837bd2 Merge remote-tracking branch 'upstream/master' 2013-10-23 10:09:06 -07:00
Ziad Hatahet
60245b9290 Remove thread-blocking call to libc::stat in Path::stat
Fixes #9958
2013-10-22 18:25:07 -07:00
bors
22a5ebdc6b auto merge of #10020 : mletterle/rust/documentation-fixes, r=thestinger
I'm planning on doing more updates, but the section in the tutorial stood out at me since the 'rust' tool no longer exists, this should probably be removed to lessen confusion.
2013-10-22 17:06:09 -07:00
reedlepee
ad465441ba Removed Unnecessary comments and white spaces #4386 2013-10-23 01:10:50 +05:30
reedlepee
0ada7c7ffe Making fields in std and extra : private #4386 2013-10-23 01:10:50 +05:30
Michael Letterle
d83c5f7b1b Minor grammatical fixes and removed section on 'rust' tool 2013-10-22 14:30:27 -04:00
Alex Crichton
daf5f5a4d1 Drop the '2' suffix from logging macros
Who doesn't like a massive renaming?
2013-10-22 08:09:56 -07:00
Alex Crichton
df6225b8c3 Don't allocate a string when calling println
Instead use format_args! to pass around a struct to pass along into std::fmt
2013-10-20 15:42:24 -07:00
Brian Anderson
34d376f3cf std: Move size/align functions to std::mem. #2240 2013-10-17 17:31:35 -07:00