File: selector.rb

package info (click to toggle)
ruby-io-event 1.14.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 400 kB
  • sloc: ansic: 3,709; ruby: 736; makefile: 4
file content (48 lines) | stat: -rw-r--r-- 1,262 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# frozen_string_literal: true

# Released under the MIT License.
# Copyright, 2021-2024, by Samuel Williams.

require_relative "selector/select"
require_relative "debug/selector"
require_relative "support"

module IO::Event
	# @namespace
	module Selector
		# The default selector implementation, which is chosen based on the environment and available implementations.
		#
		# @parameter env [Hash] The environment to read configuration from.
		# @returns [Class] The default selector implementation.
		def self.default(env = ENV)
			if name = env["IO_EVENT_SELECTOR"]&.to_sym
				return const_get(name)
			end
			
			if self.const_defined?(:URing)
				URing
			elsif self.const_defined?(:EPoll)
				EPoll
			elsif self.const_defined?(:KQueue)
				KQueue
			else
				Select
			end
		end
		
		# Create a new selector instance, according to the best available implementation.
		#
		# @parameter loop [Fiber] The event loop fiber.
		# @parameter env [Hash] The environment to read configuration from.
		# @returns [Selector] The new selector instance.
		def self.new(loop, env = ENV)
			selector = default(env).new(loop)
			
			if debug = env["IO_EVENT_DEBUG_SELECTOR"]
				selector = Debug::Selector.wrap(selector, env)
			end
			
			return selector
		end
	end
end