From: Eric Wong <e@80x24.org> To: dtas-all@nongnu.org Subject: [PATCH 2/5] use fiddle-based eventfd implementation Date: Sun, 1 Dec 2019 01:26:50 +0000 Message-ID: <20191201012653.21967-3-e@80x24.org> (raw) In-Reply-To: <20191201012653.21967-1-e@80x24.org> sleepy_penguin requires a compiler and development headers to install, so it could be a PITA to install for users on distro-provided Ruby. Use fiddle since it's part of the Ruby standard library since 1.9.2 and users won't have to install anything else. --- lib/dtas.rb | 8 +++++++ lib/dtas/sigevent.rb | 3 +-- lib/dtas/sigevent/efd.rb | 20 ----------------- lib/dtas/sigevent/fiddle_efd.rb | 38 +++++++++++++++++++++++++++++++++ lib/dtas/sigevent/pipe.rb | 2 +- test/test_sigevent.rb | 20 +++++++++++++++++ 6 files changed, 68 insertions(+), 23 deletions(-) delete mode 100644 lib/dtas/sigevent/efd.rb create mode 100644 lib/dtas/sigevent/fiddle_efd.rb create mode 100644 test/test_sigevent.rb diff --git a/lib/dtas.rb b/lib/dtas.rb index 7e9c0d5..ae2f815 100644 --- a/lib/dtas.rb +++ b/lib/dtas.rb @@ -25,6 +25,14 @@ def self.null # :nodoc: @null ||= File.open('/dev/null', 'r+') end + @libc = nil + def self.libc + @libc ||= begin + require 'fiddle' + Fiddle.dlopen(nil) + end + end + # String#-@ will deduplicate strings when Ruby 2.5 is released (Dec 2017) # https://bugs.ruby-lang.org/issues/13077 if RUBY_VERSION.to_f >= 2.5 diff --git a/lib/dtas/sigevent.rb b/lib/dtas/sigevent.rb index d4a96d7..81b8160 100644 --- a/lib/dtas/sigevent.rb +++ b/lib/dtas/sigevent.rb @@ -3,8 +3,7 @@ # frozen_string_literal: true begin raise LoadError, "no eventfd with _DTAS_POSIX" if ENV["_DTAS_POSIX"] - require 'sleepy_penguin' - require_relative 'sigevent/efd' + require_relative 'sigevent/fiddle_efd' rescue LoadError require_relative 'sigevent/pipe' end diff --git a/lib/dtas/sigevent/efd.rb b/lib/dtas/sigevent/efd.rb deleted file mode 100644 index 4be2c84..0000000 --- a/lib/dtas/sigevent/efd.rb +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (C) 2013-2016 all contributors <dtas-all@nongnu.org> -# License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt> - -# used in various places for safe wakeups from IO.select via signals -# This requires a modern Linux system and the "sleepy_penguin" RubyGem -class DTAS::Sigevent < SleepyPenguin::EventFD # :nodoc: - def self.new - super(0, :CLOEXEC) - end - - def signal - incr(1) - end - - def readable_iter - value(true) - yield self, nil # calls DTAS::Process.reaper - :wait_readable - end -end diff --git a/lib/dtas/sigevent/fiddle_efd.rb b/lib/dtas/sigevent/fiddle_efd.rb new file mode 100644 index 0000000..e29f6ca --- /dev/null +++ b/lib/dtas/sigevent/fiddle_efd.rb @@ -0,0 +1,38 @@ +# Copyright (C) 2013-2019 all contributors <dtas-all@nongnu.org> +# License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt> +# frozen_string_literal: true + +# used in various places for safe wakeups from IO.select via signals +# This requires a modern GNU/Linux system with eventfd(2) support +require_relative '../nonblock' +require 'fiddle' +class DTAS::Sigevent # :nodoc: + + EventFD = Fiddle::Function.new(DTAS.libc['eventfd'], + [ Fiddle::TYPE_INT, Fiddle::TYPE_INT ], # initval, flags + Fiddle::TYPE_INT) # fd + + attr_reader :to_io + ONE = [ 1 ].pack('Q').freeze + + def initialize + fd = EventFD.call(0, 02000000|00004000) # EFD_CLOEXEC|EFD_NONBLOCK + raise "eventfd failed: #{Fiddle.last_error}" if fd < 0 + @to_io = DTAS::Nonblock.for_fd(fd) + @buf = ''.b + end + + def signal + @to_io.syswrite(ONE) + end + + def readable_iter + @to_io.read_nonblock(8, @buf, exception: false) + yield self, nil # calls DTAS::Process.reaper + :wait_readable + end + + def close + @to_io.close + end +end diff --git a/lib/dtas/sigevent/pipe.rb b/lib/dtas/sigevent/pipe.rb index 921a5b3..0ea9d31 100644 --- a/lib/dtas/sigevent/pipe.rb +++ b/lib/dtas/sigevent/pipe.rb @@ -3,7 +3,7 @@ # frozen_string_literal: true # used in various places for safe wakeups from IO.select via signals -# A fallback for non-Linux systems lacking the "sleepy_penguin" RubyGem +# A fallback for non-Linux systems lacking the "splice" syscall require_relative '../nonblock' class DTAS::Sigevent # :nodoc: attr_reader :to_io diff --git a/test/test_sigevent.rb b/test/test_sigevent.rb new file mode 100644 index 0000000..6cfe528 --- /dev/null +++ b/test/test_sigevent.rb @@ -0,0 +1,20 @@ +# Copyright (C) 2019 all contributors <dtas-all@nongnu.org> +# License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt> +# frozen_string_literal: true +require_relative 'helper' +require 'dtas' +require 'dtas/sigevent' + +class TestSigevent < Testcase + def test_sigevent + io = DTAS::Sigevent.new + io.signal + assert IO.select([io]), 'IO.select returns' + res = io.readable_iter do |f,arg| + assert_same io, f + assert_nil arg + end + assert_equal :wait_readable, res + assert_nil io.close + end +end
next prev parent reply other threads:[~2019-12-01 1:27 UTC|newest] Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-12-01 1:26 [PATCH 0/5] use fiddle for Linux-specific APIs Eric Wong 2019-12-01 1:26 ` [PATCH 1/5] pipe: avoid loading sleepy_penguin Eric Wong 2019-12-01 1:26 ` Eric Wong [this message] 2019-12-01 1:26 ` [PATCH 3/5] buffer: replace sleepy_penguin with fiddle Eric Wong 2019-12-01 1:26 ` [PATCH 4/5] watchable: use fiddle for inotify support Eric Wong 2019-12-01 1:26 ` [PATCH 5/5] doc: remove "sleepy_penguin" references Eric Wong 2019-12-13 18:16 ` [PATCH 0/5] use fiddle for Linux-specific APIs Eric Wong 2019-12-15 20:39 ` fiddle vs sleepy_penguin vs Perl syscall() bench scripts Eric Wong
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style List information: https://80x24.org/dtas/README * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20191201012653.21967-3-e@80x24.org \ --to=e@80x24.org \ --cc=dtas-all@nongnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
everything related to duct tape audio suite (dtas) This inbox may be cloned and mirrored by anyone: git clone --mirror https://80x24.org/dtas-all git clone --mirror http://ou63pmih66umazou.onion/dtas-all # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V1 dtas-all dtas-all/ https://80x24.org/dtas-all \ dtas-all@nongnu.org public-inbox-index dtas-all Example config snippet for mirrors. Newsgroups are available over NNTP: nntp://news.public-inbox.org/inbox.comp.audio.dtas nntp://ou63pmih66umazou.onion/inbox.comp.audio.dtas note: .onion URLs require Tor: https://www.torproject.org/ code repositories for the project(s) associated with this inbox: ../../dtas.git AGPL code for this site: git clone http://ou63pmih66umazou.onion/public-inbox.git