murasaki 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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