murasaki 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 23fed947b6df870405250d679abc7ddad4e621aa
4
- data.tar.gz: 3a2c0e0a1bb6030e6cdf65a8ab2253df0c9756a3
2
+ SHA256:
3
+ metadata.gz: ad4a049570311120ece072730c1b005bc90f5854878fcaf1b5e1a619e26517dc
4
+ data.tar.gz: db0f726b3185842c74bf3936e6272de4ae61d80533cf711bd785ea61a20746e1
5
5
  SHA512:
6
- metadata.gz: faec2ae885b618eca239e55324e239a56c746997b8fa127343d109ab603c7f6ebea89f2276b85ba83fcca77ce23768aa0b2af43bdba90319a4430116930b98fe
7
- data.tar.gz: 7163f7dc780b5bcab599e0517992bde5b8b7898d9bac549134edced469a6708fd9d12fd01e5bb10e8c99693903641805fc0fb8d0eeaf92f16e3241353d004da1
6
+ metadata.gz: 4c329162006a69c8f321d2fe74cbe16dd7a4cf7368779f19d2ce0b285d1081ffbdd05ef6aea6655890e239535423e136c0701706104124482c8fe18fda50ebab
7
+ data.tar.gz: ca8b386203e419ce8931134bb057931d504aac4157c8773da4b2d8c00e0f57ab44a5b9a681db4cd42d3795121d2b35e0314bbc420d327adab4732e6c9376323a
@@ -3,5 +3,6 @@ require 'nio'
3
3
 
4
4
  require_relative 'murasaki/version'
5
5
  require_relative 'murasaki/event_loop'
6
+ require_relative 'murasaki/io'
6
7
  require_relative 'murasaki/timer'
7
8
  require_relative 'murasaki/promise'
@@ -15,25 +15,34 @@ module EventLoop
15
15
  @queue = Hash.new
16
16
  # Root fiber
17
17
  @root_fiber = Fiber.current
18
+ nil
18
19
  end
20
+ end
21
+ end
22
+
23
+ EventLoop.config
19
24
 
25
+ module EventLoop
26
+ class << self
20
27
  # Add timer in event loop
21
28
  # @param [EventLoop::Timer] timer timer to insert
22
29
  # @return [nil] nil
23
30
  def add_timer(timer)
24
- config if @selector.nil?
25
31
  timer.start_time = Time.now.to_f + timer.time
26
32
  @timers << timer
27
33
  nil
28
34
  end
29
35
 
36
+ def remove_timer(timer)
37
+ @timers.delete(timer)
38
+ end
39
+
30
40
  # Register I/O event with queue protection
31
41
  # @param [IO] io io to register
32
42
  # @param [Symbol] interest :r for read only, :w for write only, and :rw for both
33
43
  # @yield what to run when io callbacks
34
44
  # @return [nil] nil
35
45
  def register(io, interest=(:rw), &callback)
36
- config if @selector.nil?
37
46
  if @queue[io.to_i].nil?
38
47
  @queue[io.to_i] = Array.new
39
48
  register_raw(io, interest, callback)
@@ -49,7 +58,6 @@ module EventLoop
49
58
  # @param [Proc] callback what to run when io callbacks
50
59
  # @return [nil] nil
51
60
  def register_raw(io, interest=(:rw), callback)
52
- config if @selector.nil?
53
61
  @selector.register(io, interest)
54
62
  @ios[io] = { callback: callback }
55
63
  nil
@@ -59,18 +67,31 @@ module EventLoop
59
67
  # @param [IO] io io to deregister
60
68
  # @return [nil] nil
61
69
  def deregister(io)
62
- fd = io.to_i
63
70
  @selector.deregister(io)
64
71
  @ios.delete(io)
65
- next_register = @queue[fd].shift
66
- next_register.nil? ? @queue.delete(fd) : register_raw(*next_register)
72
+ unless io.closed?
73
+ # If the I/O closed accidentally, it should manually release the queue
74
+ # Otherwise, there would be a memory leak
75
+ fd = io.fileno
76
+ next_register = @queue[fd].shift
77
+ next_register.nil? ? @queue.delete(fd) : register_raw(*next_register)
78
+ end
79
+ nil
80
+ end
81
+
82
+ # Manually release queues of closed I/O
83
+ # if the I/O has accidentally closed
84
+ # @param [IO] io io to release
85
+ # @return [nil] nil
86
+ def release_queue(io)
87
+ fd = io.fileno
88
+ @queue.delete(fd)
67
89
  nil
68
90
  end
69
91
 
70
92
  # Run I/O selector once
71
93
  # @return [nil] nil
72
94
  def run_once
73
- config if @selector.nil?
74
95
  @selector.select(0.2) do |monitor| # Timeout for 0.2 secs
75
96
  @ios[monitor.io][:callback].call(monitor)
76
97
  end
@@ -81,7 +102,6 @@ module EventLoop
81
102
  # Run timer once
82
103
  # @return [nil] nil
83
104
  def timer_once
84
- config if @selector.nil?
85
105
  now_time = Time.now.to_f
86
106
  @timers.delete_if do |timer|
87
107
  if timer.start_time < now_time
@@ -118,7 +138,6 @@ module EventLoop
118
138
  end
119
139
 
120
140
  def root_fiber
121
- config if @selector.nil?
122
141
  @root_fiber
123
142
  end
124
143
  end
@@ -0,0 +1,11 @@
1
+ ##
2
+ # Meta-programming IO for Safety Check
3
+ class IO
4
+ raw_close = instance_method(:close)
5
+
6
+ define_method(:close) do
7
+ # Be sure to clean the queue
8
+ EventLoop.release_queue(self)
9
+ raw_close.bind(self).()
10
+ end
11
+ end
@@ -1,5 +1,5 @@
1
1
  # Murasaki Module
2
2
  module Murasaki
3
3
  # Current Version Code
4
- VERSION = '0.2.0'.freeze
4
+ VERSION = '0.2.1'.freeze
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: murasaki
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - HeckPsi Lab
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-31 00:00:00.000000000 Z
11
+ date: 2018-06-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nio4r
@@ -34,6 +34,7 @@ files:
34
34
  - LICENSE
35
35
  - lib/murasaki.rb
36
36
  - lib/murasaki/event_loop.rb
37
+ - lib/murasaki/io.rb
37
38
  - lib/murasaki/promise.rb
38
39
  - lib/murasaki/timer.rb
39
40
  - lib/murasaki/version.rb
@@ -60,7 +61,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
60
61
  version: '0'
61
62
  requirements: []
62
63
  rubyforge_project:
63
- rubygems_version: 2.6.14
64
+ rubygems_version: 2.7.6
64
65
  signing_key:
65
66
  specification_version: 4
66
67
  summary: Event Kernel for Ruby