| Commit message (Collapse) | Author | Age | Files | Lines |
| | |
|
| |\
| |
| |
| |
| | |
RFC: Provide and use SometimesUnboundedSender in circuit reactor
See merge request tpo/core/arti!2172
|
| | | |
|
| | | |
|
| | | |
|
| | |
| |
| |
| |
| | |
If only I'd used a macro for these, but that's not entirely
straightforward.
|
| | | |
|
| | | |
|
| | | |
|
| |\|
| |
| |
| |
| | |
Tidy up the ChannelSender::poll_ready inherent method
See merge request tpo/core/arti!2171
|
| | | |
|
| | |
| |
| |
| | |
This is where it belongs.
|
| | |
| |
| |
| |
| |
| |
| | |
This makes this available for any Sink + Unpin. Which we want because
we're about to wrap our ChannelSender in a Sink wrapper.
It's in the wrong place now; we'll move it in a moment.
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This would otherwise shadow the poll_ready method, which is
confusing.
Also this paves the way for making it available for any
Sink + Unpin.
Improve the docs somewhat to explain what this thing actually is.
|
| | |
| |
| |
| |
| |
| |
| |
| | |
I think this error was in fact always Error::CircuitClosed because it
came from ChannelClosed.into(). Anyway, we shouldn't squash it.
Now this function has semantics identical to Sink::poll_ready, just a
slightly different signature.
|
| | |
| |
| |
| | |
Make it clear we're discarding `()`, not an actual value.
|
| | |
| |
| |
| |
| |
| |
| |
| |
| | |
We're going to change this function, but first we are going to make
its behaviour identical to Sink::poll_ready.
This avoids open-coding the call to poll_read on cell_tx.
The error handling is still strange. We'll fix that in a moment.
|
| | | |
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This test verifies that when we invoke the code to close a stream,
an END message is actually sent.
The test comes in two versions:
* `drop_stream` closes the stream by dropping it. It currently
passes on main.
* `close_stream` closes the stream by running `AsyncWriteExt::close`
on the writer. It is a regression test for #1368. It currently
fails on main.
|
| | |
| |
| |
| |
| |
| |
| | |
In particular, clarify that dropping the DataWriter on its own does
nothing unless the DataReader is also dropped.
Related to #1368.
|
| |/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Previously we had a bug where `<DataWriter as AsyncWrite>::close`
(or `shutdown` in tokio-land) would not actually have any effect.
It _would_ drop the `StreamTarget` held by the `DataWriter`, but
since the `DataReader` also held a `StreamTarget`, the
MPSC channel would not get closed, and the circuit reactor would
not realize that the stream wanted to shut down.
Now we use `mpsc::Sender::close_channel` to make our closes
effectual.
Closes #1368.
Additionally, we fix a bug where `poll_close()` never actually did
anything if the buffer had nothing in it when it was called.
Previously, `poll_flush_impl()` would exit immediately if it had no
data to flush. That isn't what we want when we are closing!
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Previously ChannelDetails had a double duty: It held elements shared
among the clones of a Channel, and it also held elements shared
between the Channel and the Reactor. But now that Channel doesn't
have to implement Clone, we can more the non-Reactor elements into
Channel itself.
This change may improve cache locality a bit, and should make it a
little easier to follow the channel code.
I've also moved unique_id out of ChannelDetails into Channel _and_
Reactor: it is small, immutable, and used all the time in logging.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Previously, Channel was a type that you could Clone that implicitly
its state. Now, Channel always appears as an Arc<Channel>.
This change has several benefits:
* It makes the relationship between Channel struct and the
underlying channel more clear.
* It enables Channel to participate in the RPC system,
where everything has to be an Arc<.>
* It enables us to have a Weak<Channel>, if we ever want to.
* It will let us move various members out of ChannelDetails.
We did this change a while ago with ClientCirc.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
This serves three purposes:
* It removes the 'send a cell' method from the channel's public
API. Nothing outside of tor-proto should have to use this.
* It paves the way for giving each circuit a separate handle onto
the channel's send functionality. This will eventually let
the channel multiplex among circuits more intelligently.
* It prepares for the next commit, which will make Channel itself
universally Arc<.>ed.
|
| | |
|
| |
|
|
|
| |
For all mutable shared state, we ought to know which part of the
program sets it, which part of the program reads it, and why.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
No actual bug here, just technical debt:
For `SendWindow`s, our tag system already ensured that we rejected
any SENDME that didn't correspond to an appropriate drain. Still,
it doesn't hurt to check.
For `RecvWindow`s, it would have been a protocol violation if we
ever did this, but it makes sense to make it an internal error if we
try.
Part of #1383.
|
| | |
|
| | |
|
| |\
| |
| |
| |
| |
| |
| | |
add_warning/CI: New strategy to avoid "unexpected-cfgs" warning
Closes #1395
See merge request tpo/core/arti!2129
|
| | |
| |
| |
| | |
This commit is automatically generated.
|
| | | |
|
| | |
| |
| |
| |
| | |
It was a bit misleading since it doesn't cover all processing for the
hop.
|
| | |
| |
| |
| |
| |
| |
| | |
Get rid of an `if` block by changing the guarded loop to check its
conditions at the beginning of the loop instead of the end. This
is a slight behavior change, since previously channel readiness
wasn't checked before the first iteration of the loop.
|
| |/
|
|
|
|
| |
This should be a pure refactor. We remove a large if block and
modify the first loop inside it to check whether the channel is ready
before each attempt to send a message instead of after.
|
| |
|
|
|
|
|
|
| |
There are some tricky bits here that implicitly assume particular
behavior in other bits for correctness. Document these requirements and
assumptions.
Fixes arti#1373
|
| | |
|
| |
|
|
|
|
| |
The old code produced a warning from clippy nightly; we may as well
update to use the new associated consts. (They've been there since
Rust 1.4x.)
|
| | |
|
| | |
|
| |
|
|
| |
This is always Send+Sync, and invariant with P.
|
| |
|
|
|
| |
(We're letting the "unchecked" suffix of this function be enough
to indicate that it's risky to use.)
|
| |
|
|
|
|
|
|
|
|
| |
Instead of making `streammap.rs` responsible for keeping track of a
count field, this lowers that functionality into a lower-level
CountedHashMap type. Said type has a little more functionality than
we need, to sketch out how we'd want to develop it moving forward if
we find that it's useful elsewhere.
Closes #1344.
|
| | |
|
| |
|
|
|
|
|
|
| |
With this patch, it holds only a reference to `&reactor.hops`,
which greatly simplifies the reactor code's fight with the
borrow checker.
I've left some TODO comments about future directions here.
|
| |
|
|
| |
(Doing this to prevent us having two structs with the same name.)
|