Update my name in Contributors list
Motivation:
Name/email was wrong, should fix it. Also added an entry for Tom since he was appearing twice
Modifications:
Updated mail map, ran script to generate contributors list
Result:
New contributors list with correct name/email for me and new contributors added
Motivation:
Quick Documentation was not rendering some parameter documentation
correctly as it was over-indented.
Modifications:
Reduced indentation for over-indented parameters.
Result:
Quick Documentation renders correctly.
Motivation:
testCloseInReadTriggeredByDrainingTheReceiveBufferBecauseOfWriteError
expected (without knowing it) that networking on localhost is
synchronous enough that a succeeded write means that it has
simultaneously arrived in the reader's read buffer.
On macOS that's not necessarily true, so this test failed very seldom
seemingly more often if you had more physical cores.
Modifications:
Introduce a nasty blocking `poll` call in the test that waits until we
have bytes in the read buffer.
Result:
- fixes#657
Motivation:
While getting into NIO through the examples I stumbled
accross some chained dropFirst() calls, which can be
simplified by using dropFirst(_:) instead.
Modifications:
I did a quick project-wide search of chained dropFirst()
usage and modified every line to use dropFirst(_:) instead.
Result:
This will only effect the readability of the code,
not its functionality.
Remove EmbeddedChannel restriction to IOData
Motivation:
You should be able to read any type from the outbound buffer.
Modifications:
Change Embedded channel outboundBuffer and pendingOutboundBuffer to store NIOAny instead of IOData and refactor test code accordingly.
Result:
- Users can test what went through the pipeline without serializing everything and using "if case let" syntax everywhere.
- fixes#551
Motivation:
Previously we required all copyright headers to be 2017-2018 but now
that's not the only allowed string anymore.
Modifications:
allow 2017-2019 besides 2017-2018
Result:
Happy New Year
* Add cancel notification to RepeatedTask
Motivation:
When cancelling a RepeatedTask, it is often desirable to
wait until any still in-progress execution of the task is
finished - for example, to know when a periodic state save
is done before shutting down. The current API provides no
easy way to perform such a wait. With this addition,
repeating tasks can report completion of a cancellation
request regardless of in what state the task was in when the
request was issued.
Modifications:
A default-nil parameter is added to EventLoop.scheduleRepeatedTask(),
to which a promise can be provided; the promise will be
fulfilled at the time of the task's cancellation, plus any
time required for the task to complete running if it was
cancelled during execution. The promise is signaled even if
the cancellation is the result of the task throwing an error.
A default-nil paramter is also added to RepeatedTask.cancel(),
to which a second promise can be passed. This promise is
fulfilled under the same conditions as the first, even if the
first was not given; neither of the promises is dependent
upon the other and both are fulfilled at the same time if
provided. Further calls to cancel() with different promises
will result in fulfillment of each of those promises as well.
Result:
The observed behavior of RepeatedTask.cancel() now optionally
includes deterministic knowledge of when the task is no longer
executing or scheduled to be executed. The API changes are
designed to be additive in form, but the function signatures
do change. Source compatibility is maintained; binary
compatibility is not.
Motivation:
initialRingCapacity is not a great name, initialCapacity is much better
Modifications:
rename CircularBuffer(initialRingCapacity:) to initialCapacity
Result:
more consistent code
Motivation:
Remove the only warning in the project.
Modifications:
Use new withUnsafeBytes API.
Result:
The project will have no warnings.
(cherry picked from commit b41e50403b)
Motivation:
When counting the number of allocations it's important not to forget an
allocation function that Swift uses.
Modifications:
add posix_memalign to dev/malloc-aggregation.d
Result:
malloc aggregations accurate with recent Swift versions
Motivation:
Newer Swift versions are good and we should test them, this one threw a few curveballs at us:
- started using `posix_memalign` which needed fixing in our alloc tests (fixed in #782)
- the optimiser decided not to inline a function that needs to be inlined
Modifications
- `@inline(__always)` to help the optimiser
- update Swift version
Result:
- fixes#727
- fixes#726
Add deadlines as an alternative to timeouts
Motivation:
Address #603
Modifications:
- Add NIODeadline type
- Add func scheduleTask<T>(deadline: NIODeadline, _ task: @escaping () throws -> T) -> Scheduled<T>
- Reduce the use of DispatchTime in favor of Time
- Replace timeout calls with deadline calls where it makes sense
Result:
Tasks can be scheduled after an amount of time has passed, or at a certain time.
Motivation:
Swift started using posix_memalign very recently (Jan 2019) so we need
to hook that too to get correct results.
Modifications:
Hook posix_memalign, reallocf & valloc
Result:
alloc tests should pass again
Motivation:
ELFs and the stdlib's Result should be as compatible as possible so a
flatMapResult function which lifts and combines a result into an
EventLoopFuture sounds like a good idea.
Modifications:
add `flatMapResult` which does what it says.
Result:
more interop between `Result` and `EventLoopFuture`.
Motivation:
The name `mapIfError` implied that you can transform the error value but
really that's never what it did. Instead, it allowed you to recover
from a failure.
Modifications:
- rename `mapIfError` to `recover`
Result:
cleaner method names
Motivation:
EventLoopPromise.succeed/fail has extraneous labels that don't add
anything but noise.
Modifications:
remove extraneous labels
Result:
less noise in the code
Motivation:
It's important that in NIO1 API Shims everything that's defined is also
deprecated. Unfortunately I forgot one.
Modifications:
- deprecate thenIfErrorThrowing
Result:
- Xcode will correctly suggest changing thenIfErrorThrowing to flatMapErrorThrowing
Motivation:
Due to https://bugs.swift.org/browse/SR-9604, ByteBuffer.getBytes
seriously regressed (factor 10x) since NIO 1.11 . This works around it
until the issue is fixed.
Modifications:
bind the memory to UInt8s to get an UnsafeBufferPointer<UInt8> rather
than an UnsafeRawBufferPointer.
Result:
- getBytes 10x faster
- make @John-Connolly happy, thanks for reporting!
Motivation:
The switch from `ELF.then*` to `ELF.flatMap*` is pretty big so we should
provide NIO1 API shims.
Modifications:
add API shims for ELF.then*
Result:
easier for people to migrate from NIO1 to NIO2.
Motivation:
ELF's API should be as close as possible to the new Result's API.
Therefore, we should rename `then` to `flatMap`
Modifications:
- renamed `then` to `flatMap`
- renamed `thenIfError` to `flatMapError`
- renamed ELF's generic parameter from `T` to `Value`
Result:
- more like Result
- fixes#688
Motivation:
For package authors, the NIO1 to 2 transition can be taxing because we
keep changing things. So far, the community has done an incredible job
keeping up with our changes but we'd like to make it as easy as possible
continuing to do so.
Modifications:
- add a `_NIO1APIShims` module that when imported tries to provide some
of the NIO1 API in NIO2 with helpful fixup messages
Result:
easier transition from NIO1 to NIO2
Motivation:
Certain warnings we want to ignore in CI builds but we want to keep
`-warnings-to-errors` on.
Modifications:
define `NIO_CI_BUILD` in the CI builds
Result:
can ignore select warnings in CI
Motivation:
Forgot to introduce the -warnings-as-errors parameter in the `test:`
directive in the docker compose file.
Modifications:
added warnings-to-errors to the docker-compose.yml for 5.0
Result:
warnings to errors
Motivation:
When we write unit tests, we generally like them to actually test the
thing they claim to. This test never ran, and the assertions in place
to verify that it ran also never ran, so we didn't notice the test
not running.
Modifications:
- Moved the assertion that validates the test ran to a place where
it will definitely execute.
- Ensured the EmbeddedChannel gets marked as active, so that we
actually deliver the bytes from the HTTPDecoder.
Result:
This test will run, and actually pass.
Motivation:
SemVer requires us to declare a public API, we should do so for NIO 2.
Modifications:
declare our public API.
Result:
more transparency into our versioning policy.
Motivation:
While it's really a good idea to keep track of where promises get
allocated, once the promise has been fulfilled we probably don't
need to keep track of it any more.
Happily this leak only affects debug mode.
Modifications:
- Actually removed the element from the promise log when we
said we would.
Result:
Memory usage doesn't get totally out of hand in debug mode.
* Make EventLoopFuture.cascade and cascadeFailure accept an optional promise
Motivation:
fixes#756
Modifications:
Change EventLoopFuture.cascade to func cascade(promise: EventLoopPromise<T>?)
Result:
EventLoopFuture.cascade can be called without needing to check if the promise is nil
Motivation:
Addressing the https://github.com/apple/swift-nio/issues/713
Modifications:
Forward the statusCode from NIOHTTP1Server main handleJustWrite to ctx.writeAndFlush instead of always using "ok"
Result:
ChannelHandlerContext will write the correct status code even when it's not "ok"
Motivation:
SwiftPM recently introduced a feature that allows you to link libraries
without special system libraries.
Modifications:
make CNIOZlib link zlib directly
Result:
fewer repositories
Motivation:
BaseSocketChannel used to assert that `channelRead0` is only called when
the channel is active. That's bogus and it's trivial to hit this issue
when calling `fireChannelRead` in the last `ChannelHandler` when the
channel has gone inactive.
Modifications:
remove assertion, add comment
Result:
fewer crashes
Motivation:
We now depend on Swift 5.0, so we can remove all the backporting of
functionality.
Modifications:
deleted all backported Swift functionality
Result:
less code
Motivation:
No code is the best code, let's have the compiler generate more
Equatable instances for us.
Modifications:
remove some hand-written Equatable conformances
Result:
less code, possibly fewer bugs
Motivation:
Now that the stdlib has introduced the Result type, we can use it in the
implementation (and the whenComplete) function of EventLoopFuture
Modifications:
- replace EventLoopValue with Result
- make whenComplete provide the Result
Result:
use the new shiny stuff
Motivation:
DispatchData's APIs are less than optimal and the current one we used
did allocate at least on Linux to copy bytes out.
Modifications:
introduce ByteBuffer.write/read/set/getDispatchData
Result:
when Dispatch gets fixed, lower allocations
Motivation:
We had to disable the allocation test because of a SwiftPM bug which is
now fixed.
Modifications:
re-enable the allocation tests
Result:
more tests == better
BUGFIX: BlockingIOThreadPool not releasing the latest WorkItem
Fix is to clear the latest work item just before waiting for
the next one to be submitted.
Added two tests to validate the fix: submitting only one work item
to an IO thread pool, and submitting two consecutive work items.
Thanks to Gwynne Raskind for help troubleshooting & fix
(cherry picked from commit 8df414b716)
* Use fixed default string to write in response and do not hardcode content length
Motivation:
Improve example code, resolve#714
Modifications:
Move hardcoded "Hello world" string to a constant property and removed hardcoding of content length header value
Result:
In example code content length will be written correctly when default response changes
Motivation:
Swift 5 contains a regression where we get 1 extra allocations for the
ByteBuffer read/write allocation test.
I will track this problem down but for now it's important to unblock
other NIO2 work.
Modifications:
raise the allowed allocations for the ByteBuffer RW test by 1
Result:
allocation tests can be re-enabled again.
Motivation:
Swift 5 contains a regression where we get 2 extra allocations per
HTTP/1.1 request/response pair _only on Linux_. That happens both on
`master` as well as on `nio-1.12`.
I will track this problem down but for now it's important to unblock
12 work.
Modifications:
raise the allowed allocations per HTTP/1.1 req/res pair to 38 (from 36)
for Swift 5.
Result:
allocation tests can be re-enabled again.