41 Commits

Author SHA1 Message Date
Jacek Sieka
c25fa1f6cd
posix: fast path for write (#244)
When `write` is called on a `StreamTransport`, the current sequence of
operations is:

* copy data to queue
* register for "write" event notification
* return unfinished future to `write` caller
* wait for "write" notification (in `poll`)
* perform one `send`
* wait for notification again if there's more data to write
* complete the future

In this PR, we introduce a fast path for writing:

* If the queue is empty, try to send as much data as possible
  * If all data is sent, return completed future without `poll` round
  * If there's more data to send than can be sent in one go, add the
rest to queue
* If the queue is not empty, enqueue as above
* When notified that write is possible, keep writing until OS buffer is
full before waiting for event again

The fast path provides significant performance benefits when there are
many small writes, such as when sending gossip to many peers, by
avoiding the poll loop and data copy on each send.

Also fixes an issue where the socket would not be removed from the
writer set if there were pending writes on close.
2021-12-08 11:35:27 +01:00
Eugene Kabanov
5034f0a5a6
Fix issue #219 (#220)
* Address issue #219 and add tests for it.
Some cosmetic refactoring.

* Fix *nix tests.
2021-09-05 00:53:27 +03:00
Jacek Sieka
4abd7a5645
exception tracking (#166)
* exception tracking

This PR adds minimal exception tracking to chronos, moving the goalpost
one step further.

In particular, it becomes invalid to raise exceptions from `callSoon`
callbacks: this is critical for writing correct error handling because
there's no reasonable way that a user of chronos can possibly _reason_
about exceptions coming out of there: the event loop will be in an
indeterminite state when the loop is executing an _random_ callback.

As expected, there are several issues in the error handling of chronos:
in particular, it will end up in an inconsistent internal state whenever
the selector loop operations fail, because the internal state update
functions are not written in an exception-safe way. This PR turns this
into a Defect, which probably is not the optimal way of handling things
- expect more work to be done here.

Some API have no way of reporting back errors to callers - for example,
when something fails in the accept loop, there's not much it can do, and
no way to report it back to the user of the API - this has been fixed
with the new accept flow - the old one should be deprecated.

Finally, there is information loss in the API: in composite operations
like `poll` and `waitFor` there's no way to differentiate internal
errors from user-level errors originating from callbacks.

* store `CatchableError` in future
* annotate proc's with correct raises information
* `selectors2` to avoid non-CatchableError IOSelectorsException
* `$` should never raise
* remove unnecessary gcsafe annotations
* fix exceptions leaking out of timer waits
* fix some imports
* functions must signal raising the union of all exceptions across all
platforms to enable cross-platform code
* switch to unittest2
* add `selectors2` which supercedes the std library version and fixes
several exception handling issues in there

* fixes

* docs, platform-independent eh specifiers for some functions

* add feature flag for strict exception mode

also bump version to 3.0.0 - _most_ existing code should be compatible
with this version of exception handling but some things might need
fixing - callbacks, existing raises specifications etc.

* fix AsyncCheck for non-void T
2021-03-24 10:08:33 +01:00
cheatfate
46c0bf3c5a
Fix define to skip flaky test on MacOS. 2020-11-27 03:50:38 +02:00
Eugene Kabanov
ac9b3e304f
Fix deadlock for pending write() calls on transport close. (#139)
Add tests for read() and write() deadlocks.
2020-11-18 11:30:33 +02:00
cheatfate
3968f09ae1
Skip flaky test on MacOS. 2020-07-17 09:38:58 +03:00
Eugene Kabanov
02b8da986b
Add accept() call (#103)
* Add accept() call and tests.
* Fix rare fd leaks on Windows.
* Fix compilation warnings.
* Add fd leak test.
* Bump version to 2.4.0.
2020-06-24 11:21:52 +03:00
Jacek Sieka
d8f8e3d9fc
readMsg branch by @arnetheduck with some changes. (#83)
Co-authored-by: Eugene Kabanov <ka@hardcore.kiev.ua>
2020-03-05 10:59:10 +01:00
cheatfate
80351cb928
Fix #73. 2020-02-12 22:54:05 +02:00
cheatfate
fb00b20cfa
Fix all compilation warnings for 1.0.2.
Fix all related problems.
2019-10-29 23:19:41 +02:00
cheatfate
29d9274e03
Fix some compilation warnings. 2019-10-24 16:01:57 +03:00
cheatfate
3b8874a9e8
Fix issue with Windows connect(0.0.0.0). 2019-10-09 15:12:19 +03:00
cheatfate
ec7f2a14a8
Fix compilation warnings in osnet.nim
Fix non stable stream tests.
2019-07-12 10:40:18 +03:00
cheatfate
9c15a09904
Bump version to 2.2.7.
Attempt to fix stability of MacOS test.
2019-07-04 15:30:07 +03:00
cheatfate
317ce3c797
Ignore ECONNRESET and EPIPE errors on sending.
Add test for ECONNRESET error.
2019-05-28 09:29:00 +03:00
cheatfate
6a1f7785a0
Custom tracking mechanism.
1. Add simple tracking of Datagram and Stream transports.
2. Fix leaks in tests.
3. Add leaks tests to Datagram and Stream transport tests.
2019-04-04 12:34:23 +03:00
cheatfate
80ee289847
Fix rarely appearing Windows bug with close(transport).
Add tests for it.
Add fromProc for all Future[T] in transports.
Add testall to improve tests speed.
Bump version to 2.2.4.
2019-03-31 00:31:10 +02:00
Ștefan Talpalaru
685665ad21
assert() -> doAssert() 2019-03-14 04:03:32 +01:00
cheatfate
eac1b1a965 Decrease number of tests. 2019-02-06 18:29:58 +02:00
Mamy Ratsimbazafy
9f15c6b752
Rebrand Asyncdispatch2 to Chronos [WIP] (#20)
* Update file headers, copyright date

* Rename files and hopefully fix nimble

* Forgot to change path in tests

* Update readme
2019-02-06 15:49:11 +01:00
andri lim
b6ffaf1dc7 fixes StreamTransport readOnce bug 2018-11-20 13:58:25 +07:00
cheatfate
de7fb4ad49 One more attempt to fix freeze. 2018-10-27 21:09:23 +03:00
cheatfate
774269f2f0 Fix sendfile behavior on BSD/MacOSX. 2018-10-25 22:59:40 +03:00
cheatfate
0ea8e65b2c Fix connection refused check. 2018-10-25 13:52:56 +03:00
cheatfate
a4c27806ea Add AF_UNIX sockets support.
Add Windows emulation of AF_UNIX sockets via Named Pipes.
Add tests for AF_UNIX sockets.
TransportAddress object change.
2018-10-25 13:19:19 +03:00
cheatfate
da1fb97c7a Added code for TransportOsError exception.
Fixed bug with connect on Windows.
Added test for `Connection Refused`.
Bump version to 2.1.4.
2018-10-03 03:44:39 +03:00
cheatfate
530905f276 Fix #8 and related issues, added more tests for it.
Fix Unix connection failed bug.
2018-08-24 15:20:08 +03:00
cheatfate
293f993bed Fix 32bit windows tests. 2018-07-31 13:11:47 +03:00
cheatfate
38f30e0f18 Added createStreamServer() for GC userdata types. 2018-06-07 00:29:37 +03:00
cheatfate
b8e8d96f3b Fix datagram: for send/sendTo (string, seq[T]) versions.
Fix stream: for write (string, seq[T]) versions
More tests for both datagram/stream.
2018-06-05 23:21:07 +03:00
cheatfate
3cb521c920 Add datagram transport utility templates send(string) send(seq[byte]).
Fix bugs in stream.nim
Add more tests for stream.nim
2018-06-05 08:51:59 +03:00
cheatfate
2b8eeef7aa Added templates write(string), write(seq[byte])
Added consume()
Added tests for write(string), write(seq[byte]), consume().
2018-06-04 19:42:54 +03:00
cheatfate
960b675d62 Changed TransportAddress API.
Introduced resolveTAddress().
Added TransportAddress tests.
2018-06-02 17:25:26 +03:00
cheatfate
027e7c02a9 Added DatagramServer.
Changed StreamServer API a bit.
Added test for DatagramServer.
2018-05-31 11:03:58 +03:00
cheatfate
a8212e8910 Added timers test. 2018-05-23 01:29:07 +03:00
cheatfate
d28e4d0c49 Enable all tests.
Adding more iterations for UDP stream test.
Fixed bugs in TCP stream.
2018-05-22 18:21:58 +03:00
Your Name
e935c7e518 Fix test file path location. 2018-05-22 01:12:30 +03:00
Your Name
23a81b6492 Refactoring, more tests. 2018-05-22 00:52:57 +03:00
Your Name
570467a306 Attempts to fix #01 2018-05-17 11:45:18 +03:00
cheatfate
868ae64ae0 Fix compilation warning at asyncfutures2.nim
Add spawn procedure
Add usage of spawn procedure in datagram.nim
Some fixes at stream.nim
Increase number of clients in testdatagram.nim
2018-05-16 18:28:23 +03:00
cheatfate
4d144753ee Initial commit 2018-05-16 11:22:34 +03:00