Commit Graph

3761 Commits

Author SHA1 Message Date
Brian Anderson
a849c476f5 Encapsulate the lock-free mpsc queue in the MessageQueue type 2013-10-25 19:56:49 -07:00
Brian Anderson
1ce5081f4d Add links to original mpmc and mpsc implementations 2013-10-25 19:46:35 -07:00
Brian Anderson
49d9135eea Tidy 2013-10-25 18:33:05 -07:00
Jason Toffaletti
5e91ac10b6 minor 2013-10-25 18:27:46 -07:00
Jason Toffaletti
8c95f558d0 minor 2013-10-25 18:27:46 -07:00
Jason Toffaletti
1916732cfd fix bug introduced by previous clean up. more clean up. 2013-10-25 18:27:45 -07:00
Jason Toffaletti
89c91208a7 clean up 2013-10-25 18:27:45 -07:00
Jason Toffaletti
c372fa5556 add padding to prevent false sharing 2013-10-25 18:27:45 -07:00
Jason Toffaletti
5876e21225 add multi-producer multi-consumer bounded queue to use for sleeper list 2013-10-25 18:27:45 -07:00
Jason Toffaletti
bf0e6eb346 add cache line padding 2013-10-25 18:27:45 -07:00
Jason Toffaletti
c62d604531 lock-free queue for scheduler message queue 2013-10-25 18:27:45 -07:00
bors
953e56052f auto merge of #10066 : sanxiyn/rust/mut-ptr-clone, r=thestinger 2013-10-25 11:46:11 -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
Seo Sanghyeon
568576bab0 Implement Clone trait for mutable unsafe pointers 2013-10-25 18:43:55 +09: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
3ee5ef12fb Remove the 'callback_ms' function from EventLoop
This is a peculiar function to require event loops to implement, and it's only
used in one spot during tests right now. Instead, a possibly more robust apis
for timers should be used rather than requiring all event loops to implement a
curious-looking function.
2013-10-24 15:17:27 -07:00
Alex Crichton
3b30377e14 Fix a bug with the scheduler and destructor order
The PausibleIdleCallback must have some handle into the event loop, and because
struct destructors are run in order of top-to-bottom in order of fields, this
meant that the event loop was getting destroyed before the idle callback was
getting destroyed.

I can't confirm that this fixes a problem in how we use libuv, but it does
semantically fix a problem for usage with other event loops.
2013-10-24 15:16:58 -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
e117aa0e2a Stop logging task failure to task loggers
The isn't an ideal patch, and the comment why is in the code. Basically uvio
uses task::unkillable which touches the kill flag for a task, and if the task is
failing due to mismangement of the kill flag, then there will be serious
problems when the task tries to print that it's failing.
2013-10-24 14:21:57 -07:00
Alex Crichton
61ed2cfb55 Remove even more of std::io
Big fish fried here:

    extra::json
    most of the compiler
    extra::io_util removed
    extra::fileinput removed

Fish left to fry

    extra::ebml
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
Marvin Löbel
e53aae4772 Cleaned, documented, wrote tests for up std::bool
Removed unused import warning in std::mem and cleaned it up too

Removed is_true and is_false from std::bool

Removed freestanding functions in std::bool
2013-10-24 17:21:39 +02:00
Daniel Micay
a3ae48cb36 mark some functions as returning !
Closes #10023
2013-10-23 22:23:28 -04:00
bors
e2428b791c auto merge of #10032 : thestinger/rust/snapshot, r=huonw 2013-10-23 15:11:07 -07:00
Daniel Micay
142672dca4 register snapshots 2013-10-23 18:06:12 -04:00
Ziad Hatahet
dabf377438 Made uv_stat_t.{st_dev, st_ino} public, #9958 2013-10-23 11:16:35 -07:00
Ziad Hatahet
7d69837bd2 Merge remote-tracking branch 'upstream/master' 2013-10-23 10:09:06 -07:00
bors
a4ec8af4c5 auto merge of #9810 : huonw/rust/rand3, r=alexcrichton
- Adds the `Sample` and `IndependentSample` traits for generating numbers where there are parameters (e.g. a list of elements to draw from, or the mean/variance of a normal distribution). The former takes `&mut self` and the latter takes `&self` (this is the only difference).
- Adds proper `Normal` and `Exp`-onential distributions
- Adds `Range` which generates `[lo, hi)` generically & properly (via a new trait) replacing the incorrect behaviour of `Rng.gen_integer_range` (this has become `Rng.gen_range` for convenience, it's far more efficient to use `Range` itself)
- Move the `Weighted` struct from `std::rand` to `std::rand::distributions` & improve it
- optimisations and docs
2013-10-23 08:31:21 -07:00
bors
8c97c5ebfd auto merge of #10021 : alexcrichton/rust/asm-now-analyzed-correctly, r=luqmana
We got a snapshot, taking care of a note to myself.
2013-10-23 00:01:23 -07:00
bors
c1ef1ce947 auto merge of #10015 : huonw/rust/minor-fixes, r=alexcrichton
- Use ["nothing up my sleeve numbers"](http://en.wikipedia.org/wiki/Nothing_up_my_sleeve_number) for the ISAAC tests.
- Replace the default implementation of `Rng.fill_bytes` with something that doesn't try to do bad things with `transmute` and vectors just for the sake of a little speed.
- Replace the transmutes used to seed the ISAAC RNGs with calls into `vec::raw`.
2013-10-22 22:51:10 -07:00