aboutsummaryrefslogtreecommitdiff
path: root/src/platform/posix/posix_pollq_epoll.c
Commit message (Collapse)AuthorAge
* posix_pollq_epoll.c:add EPOLLHUP flag to aovid code error continues ↵wangchen2025-03-15
| | | | | | | | executing in tcp_cb the reason of the modification refers to https://github.com/nanomsg/nng/issues/2100 Signed-off-by: wangchen <wangchen41@xiaomi.com>
* fixes #530 POSIX pollqs should scale horizontally (epoll)Garrett D'Amore2024-12-30
| | | | | | | | This should help Linux platforms scale even further with NNG. Port events and *maybe* poll are the last to do. Probably select will remain left in the cold, because honestly select based systems are already performance constrained.
* epoll: use atomic event maskGarrett D'Amore2024-12-22
|
* epoll: fixes for races and early wakeupsGarrett D'Amore2024-12-21
|
* posix pollers: inline the pfd and make callbacks constantGarrett D'Amore2024-12-20
| | | | | | | This change moves the posix pollers to inline the PFD and makes the callbacks constant, so that we can dispense with tests, failures, and locks. It is anticipated that this will reduce lock based pressure on the bus and increase performance modestly.
* posix pollers: expose pfd structures (for sizes) and fix poller selectionGarrett D'Amore2024-12-19
| | | | | | | | | | | | | The poller selection in the previous poller changes for select were not quite functional. Also, while testing poll() based poller, there were problems where it simply did not work correctly, so this addresses those, and it seems to work now. The pfd structures are exposed as we intend to allow inlining them to eliminate the separate allocation and potential for failure during initialization. We also want to have plans afoot to eliminate a lot of the extra locking done done on each I/O iteration, and this is setting the foundation for that.
* refactor initialization/finalizationGarrett D'Amore2024-11-11
| | | | | | | | | Applications must now call nng_init(), but they can supply a set of parameters optionally. The code is now safe for multiple libraries to do this concurrently, meaning nng_fini no longer can race against another instance starting up. The nni_init checks on all public APIs are removed now.
* Fix valgrind error epoll_ctl points to uninitialised bytes (#1469)Jesper Wramberg2021-07-21
| | | | While not strictly an error, valgrind reports it as an error. This commit zero initializes the epoll_event before parsing it to the system call.
* Clean up warnings, and panic if epoll fd expectations fail.Garrett D'Amore2020-11-08
|
* fixes #960 NNG threads inherit application thread nameGarrett D'Amore2020-08-08
| | | | | | This also exposes an nng_thread_set_name() function for applications to use. All NNG thread names start with "nng:". Note that support is highly dependent on the operating system.
* fixes #1275 Test timeouts on FreeBSDGarrett D'Amore2020-08-08
| | | | | | | | | | This was responsible for hangs in close on FreeBSD. Apparently our use of EVFILT_USER was incorrect, and rather than fix it, we have switched to using a notification pipe for synchronizing closing pipes. In addition to fixing this problem, it should significantly improve things for NetBSD and OpenBSD, which will now be able tbenefit from kqueue(), since we no longer depend on EVFILT_USER.
* fixes #1112 POSIX pollq finalizers could be simplerGarrett D'Amore2020-01-05
| | | | | | | | | | | We reap the connections when closing, to ensure that the clean up is done outside the pollq thread. This also reduces pressure on the pollq, we think. But more importantly it eliminates some complex code that was meant to avoid deadlocks, but ultimately created other use-after-free challenges. This work is an enabler for further simplifications in the aio/task logic. While here we converted some potentially racy locking of the dialers and reference counts to simpler lock-free reference counting.
* Various clang tidy fixups in the POSIX pollers.Garrett D'Amore2019-12-26
|
* Address complaints found by lgtm.com.Garrett D'Amore2019-12-11
|
* fixes #653 Weird connect failures in dialer (multistress) (#660)Garrett D'Amore2018-08-20
| | | | | | | The POLLHUP (or rather EPOLLHUP) flag does not quite mean the same thing in Linux, and we've seen random failures where we will sometimes get this event on a socket that is freshly connected. This might be a bug in Linux, but it is easy enough to workaround -- we just don't watch for it at all.
* fixes #477 Android NDK build configurationGarrett D'Amore2018-05-30
| | | | | | | | | | | | This enables the software to be built for Android, going back to at least Android SDK r15 (IceCreamSandwich) and at least up to SDK r27 (Oreo). Older versions of Android may work, but we have no way to build them to test. While here we have changed our CMake configuration to disable building tools or tests when we detect a cross-compile situation. Documentation for cross-compilation is updated as well.
* fixes #484 crashes in websocket transportGarrett D'Amore2018-05-29
| | | | | | | | | | | | | | | | | | | | | | | fixes #490 posix_epdesc use-after-free bug fixes #489 Sanitizer based testing would help fixes #492 Numerous memory leaks found with sanitizer This introduces support for compiler-based sanitizers when using clang or gcc (and not on Windows). See NNG_SANITIZER for possible settings such as "thread" or "address". Furthermore, we have fixed the issues we found with both the thread and address sanitizers. We believe that the thread issues pointed to a low frequency use-after-free responsible for rare crashes in some of the tests. The tests generally have their timeouts doubled when running under a sanitizer, to account for the extra long times that the sanitizer can cause these to take. While here, we also changed the compat_ws test to avoid a particularly painful and time consuming DNS lookup, and we made the nngcat_unlimited test a bit more robust by waiting before sending traffic.
* fixes #352 aio lock is burning hotGarrett D'Amore2018-05-14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | fixes #326 consider nni_taskq_exec_synch() fixes #410 kqueue implementation could be smarter fixes #411 epoll_implementation could be smarter fixes #426 synchronous completion can lead to panic fixes #421 pipe close race condition/duplicate destroy This is a major refactoring of two significant parts of the code base, which are closely interrelated. First the aio and taskq framework have undergone a number of simplifications, and improvements. We have ditched a few parts of the internal API (for example tasks no longer support cancellation) that weren't terribly useful but added a lot of complexity, and we've made aio_schedule something that now checks for cancellation or other "premature" completions. The aio framework now uses the tasks more tightly, so that aio wait can devolve into just nni_task_wait(). We did have to add a "task_prep()" step to prevent race conditions. Second, the entire POSIX poller framework has been simplified, and made more robust, and more scalable. There were some fairly inherent race conditions around the shutdown/close code, where we *thought* we were synchronizing against the other thread, but weren't doing so adequately. With a cleaner design, we've been able to tighten up the implementation to remove these race conditions, while substantially reducing the chance for lock contention, thereby improving scalability. The illumos poller also got a performance boost by polling for multiple events. In highly "busy" systems, we expect to see vast reductions in lock contention, and therefore greater scalability, in addition to overall improved reliability. One area where we currently can do better is that there is still only a single poller thread run. Scaling this out is a task that has to be done differently for each poller, and carefuly to ensure that close conditions are safe on all pollers, and that no chance for deadlock/livelock waiting for pfd finalizers can occur.
* fixes #393 panic on illumos - epoll assertion errorGarrett D'Amore2018-05-06
| | | | | | | | This replaces the epoll support with proper illumos/SunOS port events. The port event support is structured so that it actually is superior to epoll and kqueue, because it avoids a single master lock on the poller. In the future we will explore this for macOS and Linux pollers.
* fixes #322 epoll implementation is racyGarrett D'Amore2018-03-30
| | | | | This uses numeric identifiers and an idhash table to make sure that the values we get back are still use.
* epoll: add epoll-based pollq implementationLiam Staskawicz2018-03-15
fixes #33