evt 0.1.2 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/lib/evt.rb CHANGED
@@ -1,9 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'evt/version'
4
- require_relative 'evt/io'
5
- require_relative 'evt_ext'
6
4
  require_relative 'evt/scheduler'
5
+ require_relative 'evt_ext'
7
6
 
8
7
  module Evt
9
8
  end
@@ -2,56 +2,55 @@
2
2
 
3
3
  require 'fiber'
4
4
  require 'socket'
5
-
6
- begin
7
- require 'io/nonblock'
8
- rescue LoadError
9
- # Ignore.
10
- end
5
+ require 'io/nonblock'
11
6
 
12
7
  class Evt::Scheduler
13
8
  def initialize
14
9
  @readable = {}
15
10
  @writable = {}
11
+ @iovs = {}
16
12
  @waiting = {}
17
- @blocking = []
13
+
14
+ @lock = Mutex.new
15
+ @locking = 0
16
+ @ready = []
18
17
 
19
18
  @ios = ObjectSpace::WeakMap.new
20
19
  init_selector
21
20
  end
22
21
 
23
- attr :readable
24
- attr :writable
25
- attr :waiting
26
- attr :blocking
22
+ attr_reader :readable
23
+ attr_reader :writable
24
+ attr_reader :waiting
27
25
 
28
26
  def next_timeout
29
27
  _fiber, timeout = @waiting.min_by{|key, value| value}
30
28
 
31
29
  if timeout
32
30
  offset = timeout - current_time
33
-
34
- if offset < 0
35
- return 0
36
- else
37
- return offset
38
- end
31
+ offset < 0 ? 0 : offset
39
32
  end
40
33
  end
41
34
 
42
35
  def run
43
- while @readable.any? or @writable.any? or @waiting.any?
44
- readable, writable = self.wait
45
-
46
- # puts "readable: #{readable}" if readable&.any?
47
- # puts "writable: #{writable}" if writable&.any?
36
+ while @readable.any? or @writable.any? or @waiting.any? or @iovs.any? or @locking.positive?
37
+ readable, writable, iovs = self.wait
48
38
 
49
39
  readable&.each do |io|
50
- @readable[io]&.resume
40
+ fiber = @readable.delete(io)
41
+ fiber&.resume
51
42
  end
52
43
 
53
44
  writable&.each do |io|
54
- @writable[io]&.resume
45
+ fiber = @writable.delete(io)
46
+ fiber&.resume
47
+ end
48
+
49
+ unless iovs.nil?
50
+ iovs&.each do |io|
51
+ fiber = @iovs.delete(io)
52
+ fiber&.resume
53
+ end
55
54
  end
56
55
 
57
56
  if @waiting.any?
@@ -67,96 +66,56 @@ class Evt::Scheduler
67
66
  end
68
67
  end
69
68
  end
70
- end
71
- end
72
69
 
73
- def for_fd(fd)
74
- @ios[fd] ||= ::IO.for_fd(fd, autoclose: false)
75
- end
76
-
77
- def wait_readable(io)
78
- @readable[io] = Fiber.current
79
- self.register(io, IO::WAIT_READABLE)
80
- Fiber.yield
81
- @readable.delete(io)
82
- self.deregister(io)
83
- return true
84
- end
70
+ if @ready.any?
71
+ ready = nil
85
72
 
86
- def wait_readable_fd(fd)
87
- wait_readable(
88
- for_fd(fd)
89
- )
90
- end
91
-
92
- def wait_writable(io)
93
- @writable[io] = Fiber.current
94
- self.register(io, IO::WAIT_READABLE)
95
- Fiber.yield
96
- @writable.delete(io)
97
- self.deregister(io)
98
- return true
99
- end
73
+ @lock.synchronize do
74
+ ready, @ready = @ready, []
75
+ end
100
76
 
101
- def wait_writable_fd(fd)
102
- wait_writable(
103
- for_fd(fd)
104
- )
77
+ ready.each do |fiber|
78
+ fiber.resume
79
+ end
80
+ end
81
+ end
105
82
  end
106
83
 
107
84
  def current_time
108
85
  Process.clock_gettime(Process::CLOCK_MONOTONIC)
109
86
  end
110
87
 
111
- def wait_sleep(duration = nil)
112
- @waiting[Fiber.current] = current_time + duration
113
-
114
- Fiber.yield
115
-
116
- return true
117
- end
118
-
119
- def wait_any(io, events, duration)
120
- unless (events & IO::WAIT_READABLE).zero?
121
- @readable[io] = Fiber.current
122
- end
123
-
124
- unless (events & IO::WAIT_WRITABLE).zero?
125
- @writable[io] = Fiber.current
126
- end
127
-
88
+ def io_wait(io, events, duration)
89
+ @readable[io] = Fiber.current unless (events & IO::READABLE).zero?
90
+ @writable[io] = Fiber.current unless (events & IO::WRITABLE).zero?
128
91
  self.register(io, events)
129
-
130
92
  Fiber.yield
131
-
132
- @readable.delete(io)
133
- @writable.delete(io)
134
93
  self.deregister(io)
135
-
136
- return true
94
+ true
137
95
  end
138
96
 
139
-
140
- def wait_for_single_fd(fd, events, duration)
141
- wait_any(
142
- for_fd(fd),
143
- events,
144
- duration
145
- )
97
+ def kernel_sleep(duration = nil)
98
+ @waiting[Fiber.current] = current_time + duration if duration.nil?
99
+ Fiber.yield
100
+ true
146
101
  end
147
102
 
148
- def enter_blocking_region
149
- # puts "Enter blocking region: #{caller.first}"
103
+ def mutex_lock(mutex)
104
+ @locking += 1
105
+ Fiber.yield
106
+ ensure
107
+ @locking -= 1
150
108
  end
151
109
 
152
- def exit_blocking_region
153
- # puts "Exit blocking region: #{caller.first}"
154
- @blocking << caller.first
110
+ def mutex_unlock(mutex, fiber)
111
+ @lock.synchronize do
112
+ @ready << fiber
113
+ end
155
114
  end
156
115
 
157
116
  def fiber(&block)
158
117
  fiber = Fiber.new(blocking: false, &block)
159
118
  fiber.resume
160
- return fiber
119
+ fiber
161
120
  end
162
121
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Evt
4
- VERSION = "0.1.2"
4
+ VERSION = "0.2.2"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: evt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Delton Ding
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-18 00:00:00.000000000 Z
11
+ date: 2020-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler
@@ -32,20 +32,23 @@ extensions:
32
32
  - ext/evt/extconf.rb
33
33
  extra_rdoc_files: []
34
34
  files:
35
+ - ".github/workflows/test.yml"
35
36
  - ".gitignore"
36
- - ".travis.yml"
37
37
  - CODE_OF_CONDUCT.md
38
38
  - Gemfile
39
- - Gemfile.lock
40
39
  - LICENSE
41
40
  - README.md
42
41
  - Rakefile
43
42
  - evt.gemspec
43
+ - ext/evt/epoll.h
44
44
  - ext/evt/evt.c
45
45
  - ext/evt/evt.h
46
46
  - ext/evt/extconf.rb
47
+ - ext/evt/iocp.h
48
+ - ext/evt/kqueue.h
49
+ - ext/evt/select.h
50
+ - ext/evt/uring.h
47
51
  - lib/evt.rb
48
- - lib/evt/io.rb
49
52
  - lib/evt/scheduler.rb
50
53
  - lib/evt/version.rb
51
54
  homepage: https://github.com/dsh0416/evt
@@ -62,15 +65,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
62
65
  requirements:
63
66
  - - ">="
64
67
  - !ruby/object:Gem::Version
65
- version: 2.7.1
68
+ version: 3.0.0.rc1
66
69
  required_rubygems_version: !ruby/object:Gem::Requirement
67
70
  requirements:
68
71
  - - ">="
69
72
  - !ruby/object:Gem::Version
70
73
  version: '0'
71
74
  requirements: []
72
- rubygems_version: 3.1.2
75
+ rubygems_version: 3.2.2
73
76
  signing_key:
74
77
  specification_version: 4
75
- summary: A low-level Event Handler designed for Ruby 3 Scheduler
78
+ summary: The Event Library that designed for Ruby 3.0 Fiber Scheluer.
76
79
  test_files: []
@@ -1,25 +0,0 @@
1
- ---
2
- language: ruby
3
- cache: bundler
4
- rvm: 2.7.1
5
- matrix:
6
- include:
7
- - rvm: 2.7.1
8
- os: linux
9
- - rvm: 2.7.1
10
- os: osx
11
- - rvm: ruby-head
12
- allow_failures:
13
- - rvm: ruby-head
14
- fast_finish: true
15
-
16
- before_install: gem install bundler -v 2.1.4
17
- script:
18
- - gem list -l
19
- - bundle exec rake compile
20
- - bundle exec rake
21
-
22
- bundler_args: --jobs 1 --retry 3
23
-
24
- notifications:
25
- email: false
@@ -1,24 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- evt (0.1.1)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- minitest (5.14.1)
10
- rake (12.3.3)
11
- rake-compiler (1.1.1)
12
- rake
13
-
14
- PLATFORMS
15
- ruby
16
-
17
- DEPENDENCIES
18
- evt!
19
- minitest (~> 5.0)
20
- rake (~> 12.0)
21
- rake-compiler (~> 1.0)
22
-
23
- BUNDLED WITH
24
- 2.2.0.dev
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Patch for 2.7.1 when tests
4
- class IO
5
- WAIT_READABLE = 1
6
- WAIT_WRITABLE = 3
7
- end