Documentation updates to switch bogomips.org to yhbt.net since the .org TLD won't be affordable in the near future. There's also a few warning fixes and such.
This release fixes some minor things for kqueue and clang users. Not much going on... *yawn* 6 changes since v3.5.0 (2017-03-22): kqueue: ensure close-on-exec flag is set kqueue: modernize Struct usage for Ruby 2.5.0dev fix 64-to-32-bit truncation warning kqueue: get rid of unused variable warnings epoll: avoid reduce block capture and ivar requests doc: use HTTPS URLS when possible
Most notably, kevent and epoll_wait wrappers are now nestable, so you can write your own event loops inside somebody elses event loop (not that it's a good idea, but hey, that's reality, sometimes). https://bogomips.org/sleepy_penguin/SleepyPenguin/Kqueue.html#method-i-kevent https://bogomips.org/sleepy_penguin/SleepyPenguin/Epoll.html#method-i-wait For Linux users, there is now copy_file_range(2) support for copying regular files: https://bogomips.org/sleepy_penguin/SleepyPenguin.html#method-c-copy_file_range There is also a new sendfile wrapper which emulates Linux sendfile behavior regardless of platform. It will use the native sendfile(2) syscall on FreeBSD and Linux, at least. https://bogomips.org/sleepy_penguin/SleepyPenguin.html#method-c-linux_sendfile Wrappers for the splice(2) and tee(2) syscalls also exist for Linux users (vmsplice(2) is omitted): https://bogomips.org/sleepy_penguin/SleepyPenguin.html#method-c-splice https://bogomips.org/sleepy_penguin/SleepyPenguin.html#method-c-tee Along with some related constants: https://bogomips.org/sleepy_penguin/SleepyPenguin.html#F_GETPIPE_SZ https://bogomips.org/sleepy_penguin/SleepyPenguin.html#F_SETPIPE_SZ https://bogomips.org/sleepy_penguin/SleepyPenguin.html#F_MORE https://bogomips.org/sleepy_penguin/SleepyPenguin.html#F_MOVE https://bogomips.org/sleepy_penguin/SleepyPenguin.html#F_NONBLOCK In other words, this release merges the useful parts of the old "io_splice" RubyGem: https://bogomips.org/ruby_io_splice/ Linux 4.5+ epoll users also get EPOLLEXCLUSIVE along existing constants: https://bogomips.org/sleepy_penguin/SleepyPenguin/Epoll.html#EXCLUSIVE Ruby 1.8 and 1.9 support are both gone, Ruby 2.0.0+ is required for keyword args, now(*). 31 changes since 3.4.1: README: fix wording: are => is TODO: add memfd item epoll: allow :CLOEXEC instead of the long constant note the epoll/io.rb file is only for Ruby 1.8 support the splice(2) and tee(2) syscalls implement copy_file_range support for Linux 4.5+ doc: various URL updates (https) unify rb_gc() handling for out-of-FD conditions splice: clarification regarding tee() flags pkg.mk: various updates from other projects copy_file_range: use correct syscall numbers on x86/x86-64 new API for splice and tee doc: remove references to IO#pipe_size accessor remove PIPE_BUF constant definition copy_file_range: move wrapper to Ruby for keyword arg handling gemspec: use SPDX-compatible license specifier implement linux_sendfile support portability fixes for systems w/o splice, copy_file_range tests: switch to test-unit free buffer if pthread_setspecific fails allow nestable TLS buffers within the same thread drop unused Ruby 1.8 support code epoll: add newline to Kernel#warn messages for atomicity favor require_relative over require epoll: add EPOLLEXCLUSIVE constant and documentation kqueue: remove IO#autoclose= and 1.8-related checks sp_copy: remove dummy 1.8 code for non-native threaded Ruby build: remove build-time olddoc dependency copy_file_range: add documentation doc: tests and examples for changing pipe size in Linux doc: avoid incorrect links to Epoll::IO
Most notably the mailing list is now subscription-optional on the bogomips.org server: sleepy-penguin@bogomips.org If you want to keep receiving email updates, you'll need to resubscribe by sending a message to: sleepy-penguin+subscribe@bogomips.org Migrating subscribers can't be done automatically as librelist (our old host) doesn't publish subscriber lists. But you don't have to subscribe, either, HTTP archives are available at: http://bogomips.org/sleepy-penguin/ There you'll also find links to ssoma/public-inbox for extracting the mail archives to git. shortlog: test_kqueue_io: add test for deleting items test_inotify: add test for rm_watch extconf: detect inotify_init1 in libc inotify: cleanup Inotify::Event creation switch documentation to olddoc change mailing list to sleepy-penguin@bogomips.org relax license to LGPLv2.1+ (from v2.1 && v3 only) cleanup documentation links and ignores gemspec: add dev dependency on test-unit 3.x README: label the link to the mailing list archives GNUmakefile: drop more RubyForge references README: stop mentioning Rubinius gemspec: use minitest, not test-unit
Most notably the mailing list is now subscription-optional on the bogomips.org server: sleepy-penguin@bogomips.org If you want to keep receiving email updates, you'll need to resubscribe by sending a message to: sleepy-penguin+subscribe@bogomips.org Migrating subscribers can't be done automatically as librelist (our old host) doesn't publish subscriber lists. But you don't have to subscribe, either, HTTP archives are available at: http://bogomips.org/sleepy-penguin/ There you'll also find links to ssoma/public-inbox for extracting the mail archives to git. shortlog: test_kqueue_io: add test for deleting items test_inotify: add test for rm_watch extconf: detect inotify_init1 in libc inotify: cleanup Inotify::Event creation switch documentation to olddoc change mailing list to sleepy-penguin@bogomips.org relax license to LGPLv2.1+ (from v2.1 && v3 only) cleanup documentation links and ignores gemspec: add dev dependency on test-unit 3.x README: label the link to the mailing list archives GNUmakefile: drop more RubyForge references README: stop mentioning Rubinius gemspec: use minitest, not test-unit
Most notably, this fixes memory leaks for any users of inotify reads, epoll/kevent waiting using short-lived thread. Users of long-lived threads for these functions (all Rainbows!, yahns, and zbatery users) are not affected. A fair amount of internal cleanup was necessary for this. Compatibility with non-Linux systems without clock_gettime is improved, thanks to Lin Jen-Shin. Note: the kevent code is not at all optimized and still uses RARRAY_PTR, so it likely sucks under rbx and MRI 2.1. Eric Wong (13): test_epoll: minor compatibility fix for Ruby 2.1.0 avoid RARRAY_PTR usage for Linux-only bits init: avoid redefinition warning for _GNU_SOURCE Rakefile: kill raa_update task util: minor cleanup to favor rb_io_get_io tests: switch to minitest test_epoll: switch test_dup_and_fork to exit! remove all signalfd-related files tests: remove version-dependent FD_CLOEXEC checks work around lack of rb_io_get_io in Rubinius value2timespec: use StringValueCStr for correctness refactor and fix leak from thread-local storage use extconf: avoid unnecessary linkage against libkqueue Lin Jen-Shin (1): Support for broken system without clock_gettime.
epoll support and thread-safety improvements. The dangerous Epoll::IO interface is now an option for those who want to share an epoll descriptor across fork and maintain their own IO object references to avoid extra overhead. Use the regular (high-level) Epoll interface unless you're willing to shoot yourself in the face. There is also preliminary Kqueue support (which should work under libkqueue on Linux). Similar to our epoll interface (and unlike most event libraries/frameworks) our kqueue interface also supports one-shot notifications and _embraces_ multi-threaded use. Note: unlike epoll, kqueue has close-on-fork behavior, so kqueue descriptors are not (ever) inheritable across fork. Added EPOLLWAKEUP constant (Linux 3.5 + glibc 2.17 required) to allow descriptors to prevent system suspend while active (this requires the CAP_BLOCK_SUSPEND privilege). Inotify and Epoll interfaces now use thread-local buffers for thread-safety and improved concurrency without GVL. Errno::EINTR is no longer propagated into Ruby-land, for consistency with existing Ruby IO APIs.
* add TimerFD::CANCEL_ON_SET constant ref: http://www.man7.org/tlpi/api_changes/ * fix concurrent Epoll#wait on the same epoll fd * SignalFD interface removed (unworkable with Ruby runtimes) * use rb_update_max_fd() if available (Ruby 1.9.3) * reintroduce SLEEPY_PENGUIN_VERSION constant ("3.1.0")
One bugfix: * epoll: avoid race condition in EINTR checking Even if we timeout while getting an EINTR, we'll retry epoll_wait() with a zero timeout like IO.select does in Ruby to avoid raising Errno::EINTR.
Epoll#wait always waits the specified amount of time and never raises Errno::EINTR. Disabled operations on Fixnum file descriptors, only IO objects may be passed to Epoll methods. Cross-thread Epoll#close behavior matches Ruby 1.9.3dev. Improved Rubinius support (lightly tested).