thread 0.0.6 → 0.0.6.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
2
  SHA1:
3
- metadata.gz: 06775ef0519c05357d40793c690e1d920d6986fd
4
- data.tar.gz: b99341b499d3f242c89a9e34dc1e5709475a309f
3
+ metadata.gz: d3ff37def7bb5f33d4edbfe721d2fd4ed76736c8
4
+ data.tar.gz: da06d07f29d4da2ad5ae0c965dd3b857ea2f4693
5
5
  SHA512:
6
- metadata.gz: af5195c38784de4e8e8053abd2aa1a9d6aa0769504ddb1eb9b7f985956a9d2a0d1a607ed2582f33612085a93a1213ae3113237170bd52f6f012b75c722b72468
7
- data.tar.gz: 8ceab0a43ed94525654db0d74f77b7902ada06248b58b011ff16e003ca454a871ff9ec54eccee7a1214e7d574dac60955f0f82ff32e8d5172ef6bea0a426201a
6
+ metadata.gz: ee229921f532e80cdcbccd1c3f68222b61b262e2bb46ecd0c47a149a5a37d43015705066108ca8a190b7d400b63a9b8be4ac1479669817e02e735cad876c77a0
7
+ data.tar.gz: 905962ca00d67d8acbc8eaefcc5be048da9fe799fb0a7f8cc1aa4fbd3c0e52dd88b61a30e9bf175c83dd7625a6bab3428978adb5fb0e9ea4661724185f281a82
data/lib/thread/pipe.rb CHANGED
@@ -14,25 +14,37 @@ require 'thread'
14
14
  # each datum inserted in the pipe is passed along through queues to the various
15
15
  # functions composing the pipe, the final result is inserted in the final queue.
16
16
  class Thread::Pipe
17
+ # A task incapsulates a part of the pipe.
17
18
  class Task
18
19
  attr_accessor :input, :output
19
20
 
21
+ # Create a Task which will call the passed function and get input
22
+ # from the optional parameter and put output in the optional parameter.
20
23
  def initialize (func, input = Queue.new, output = Queue.new)
21
- @input = input
22
- @output = output
24
+ @input = input
25
+ @output = output
26
+ @handling = false
23
27
 
24
28
  @thread = Thread.new {
25
29
  while true
30
+ value = @input.deq
31
+
32
+ @handling = true
26
33
  begin
27
- value = @input.deq
28
34
  value = func.call(value)
29
-
30
35
  @output.enq value
31
36
  rescue Exception; end
37
+ @handling = false
32
38
  end
33
39
  }
34
40
  end
35
41
 
42
+ # Check if the task has nothing to do.
43
+ def empty?
44
+ !@handling && @input.empty? && @output.empty?
45
+ end
46
+
47
+ # Stop the task.
36
48
  def kill
37
49
  @thread.raise
38
50
  end
@@ -51,21 +63,13 @@ class Thread::Pipe
51
63
  ObjectSpace.define_finalizer(self, self.class.finalize(@tasks))
52
64
  end
53
65
 
66
+ # @private
54
67
  def self.finalize (tasks)
55
68
  proc {
56
69
  tasks.each(&:kill)
57
70
  }
58
71
  end
59
72
 
60
- # Insert data in the pipe.
61
- def << (data)
62
- return if @tasks.empty?
63
-
64
- @input.enq data
65
-
66
- self
67
- end
68
-
69
73
  # Add a task to the pipe, it must respond to #call and #arity,
70
74
  # and #arity must return 1.
71
75
  def | (func)
@@ -81,13 +85,30 @@ class Thread::Pipe
81
85
  self
82
86
  end
83
87
 
88
+ # Check if the pipe is empty.
89
+ def empty?
90
+ @input.empty? && @output.empty? && @tasks.all?(&:empty?)
91
+ end
92
+
93
+ # Insert data in the pipe.
94
+ def enq (data)
95
+ return if @tasks.empty?
96
+
97
+ @input.enq data
98
+
99
+ self
100
+ end
101
+
102
+ alias push enq
103
+ alias << enq
104
+
84
105
  # Get an element from the output queue.
85
- def pop (non_block = false)
106
+ def deq (non_block = false)
86
107
  @output.deq(non_block)
87
108
  end
88
109
 
89
- alias deq pop
90
- alias ~ pop
110
+ alias pop deq
111
+ alias ~ deq
91
112
  end
92
113
 
93
114
  class Thread
data/tests/pipe_spec.rb CHANGED
@@ -12,4 +12,14 @@ describe Thread::Pipe do
12
12
  p.deq.should == 16
13
13
  p.deq.should == 32
14
14
  end
15
+
16
+ it 'empty works properly' do
17
+ p = Thread |-> d { sleep 0.2; d * 2 } |-> d { d * 4 }
18
+
19
+ p.empty?.should == true
20
+ p.enq 42
21
+ p.empty?.should == false
22
+ p.deq
23
+ p.empty?.should == true
24
+ end
15
25
  end
data/thread.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new {|s|
2
2
  s.name = 'thread'
3
- s.version = '0.0.6'
3
+ s.version = '0.0.6.1'
4
4
  s.author = 'meh.'
5
5
  s.email = 'meh@schizofreni.co'
6
6
  s.homepage = 'http://github.com/meh/ruby-thread'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thread
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - meh.