timeout_queue 0.1.0 → 0.1.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
  SHA256:
3
- metadata.gz: 59b969678d331842aae14d22898b8ec774048d64387b9edcadad821870c5e4e8
4
- data.tar.gz: 1b0e23ffb8727cddafb4dc52a0bfc448d620ec634cfb40d98f9568056b7c4ef0
3
+ metadata.gz: 29d93c187aaecf84b0dcfb32c5a05ae16bc6aa4b82636ffa43438ac731fd3ca7
4
+ data.tar.gz: c24440e09eab0ac50c295123b5faf95a9bf06757c2740ca633bb234a9e994c4d
5
5
  SHA512:
6
- metadata.gz: f6007cde65568613756d2469236ec5dd78a1b5cdd7a8551300aaac55a68fa892b49f1e14a187d8b330a7d6d199993b4e6f3ec267fe837887bfbef2ca406f416c
7
- data.tar.gz: 64b1bb7f09a1942d8309306739b7e12c10b36ec9bcf05bc64489216c149b3d414018bf9af6963200ac52b290e40f7ff27c576df0882dfb89e2f16a73ed1e33ca
6
+ metadata.gz: 41127cc7cd3cfc8e4b6fecd6d9b10a1e8c7023f95b1251450a29aacdc52902a22a541bd8128d1ede25550d864798cdbea93110c29b3aa4f37eb98f896f899bb0
7
+ data.tar.gz: 591f454b9cdfd8f9f882339f1c0711cd3f460df334da756af30b65343eb10d7f3b20e3b46965e70fff00f5728c25bfbe931e1581e447e5c9f1f2aea80efd1666
@@ -5,6 +5,8 @@ class TimeoutQueue
5
5
  @queue = []
6
6
  @mutex = Mutex.new
7
7
  @received = ConditionVariable.new
8
+ @closed = false
9
+ @waiting = []
8
10
 
9
11
  end
10
12
 
@@ -14,7 +16,7 @@ class TimeoutQueue
14
16
  # @return object
15
17
  #
16
18
  def push(object, **opt)
17
- __push do
19
+ __push(object) do
18
20
  @queue.send(__method__, object)
19
21
  end
20
22
  end
@@ -25,7 +27,7 @@ class TimeoutQueue
25
27
  # @return object
26
28
  #
27
29
  def unshift(object)
28
- __push do
30
+ __push(object) do
29
31
  @queue.send(__method__, object)
30
32
  end
31
33
  end
@@ -58,15 +60,15 @@ class TimeoutQueue
58
60
 
59
61
  timeout = opts[:timeout]
60
62
 
61
- if timeout
62
-
63
- end_time = Time.now + timeout.to_f
64
-
65
- end
66
-
67
63
  with_mutex do
64
+
65
+ @waiting << Thread.current
66
+
67
+ if timeout
68
+ end_time = Time.now + timeout.to_f
69
+ end
68
70
 
69
- while @queue.empty? and not(non_block)
71
+ while @queue.empty? and not(non_block) and not(@closed)
70
72
 
71
73
  if timeout
72
74
 
@@ -82,13 +84,45 @@ class TimeoutQueue
82
84
 
83
85
  end
84
86
 
85
- raise ThreadError unless not @queue.empty?
87
+ @waiting.delete(Thread.current)
88
+
89
+ if @queue.empty?
90
+
91
+ if @closed
92
+ raise ClosedQueueError
93
+ else
94
+ raise ThreadError
95
+ end
96
+
97
+ else
86
98
 
87
- @queue.shift
99
+ @queue.shift
100
+
101
+ end
88
102
 
89
103
  end
90
104
 
91
105
  end
106
+
107
+ def num_waiting
108
+ with_mutex do
109
+ @waiting.size
110
+ end
111
+ end
112
+
113
+ def closed?
114
+ @closed
115
+ end
116
+
117
+ def close
118
+ with_mutex do
119
+ if not @closed
120
+ @closed = true
121
+ @waiting.each(&:wakeup)
122
+ end
123
+ end
124
+ self
125
+ end
92
126
 
93
127
  def empty?
94
128
  @queue.send __method__
@@ -112,7 +146,8 @@ class TimeoutQueue
112
146
  end
113
147
 
114
148
  def __push(object)
115
- with_mutex do
149
+ with_mutex do
150
+ raise ClosedQueueError if closed?
116
151
  yield
117
152
  @received.signal
118
153
  end
@@ -1,5 +1,5 @@
1
1
  class TimeoutQueue
2
2
 
3
- VERSION = "0.1.0"
3
+ VERSION = "0.1.1"
4
4
 
5
5
  end
@@ -0,0 +1,38 @@
1
+ require 'minitest/autorun'
2
+ require 'timeout_queue'
3
+
4
+ describe "close a queue" do
5
+
6
+ let(:q){ TimeoutQueue.new }
7
+
8
+ it "is not closed to start" do
9
+
10
+ refute q.closed?
11
+
12
+ end
13
+
14
+ describe "with waiters" do
15
+
16
+ before do
17
+
18
+ q.closed?
19
+
20
+ Thread.new do
21
+
22
+ assert_raises ClosedQueueError do
23
+ q.pop
24
+ end
25
+
26
+ end
27
+
28
+ q.close
29
+
30
+ end
31
+
32
+ it "is closed" do
33
+ assert q.closed?
34
+ end
35
+
36
+ end
37
+
38
+ end
@@ -0,0 +1,69 @@
1
+ require 'minitest/autorun'
2
+ require 'timeout_queue'
3
+
4
+ describe "pop a closed queue" do
5
+
6
+ describe "queue is empty" do
7
+
8
+ let(:q){ TimeoutQueue.new.close }
9
+
10
+ describe "without a timeout" do
11
+
12
+ it "raises ClosedQueueError" do
13
+
14
+ assert_raises ClosedQueueError do
15
+ q.pop
16
+ end
17
+
18
+ end
19
+
20
+ end
21
+
22
+ describe "with a timeout" do
23
+
24
+ it "raises ClosedQueueError" do
25
+
26
+ assert_raises ClosedQueueError do
27
+ q.pop(timeout: 1)
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+
34
+ describe "with non_blocking" do
35
+
36
+ it "raises ClosedQueueError" do
37
+
38
+ assert_raises ClosedQueueError do
39
+ q.pop(true)
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+
46
+ end
47
+
48
+ describe "queue is not empty" do
49
+
50
+ let(:obj) { {} }
51
+ let(:q){ TimeoutQueue.new }
52
+
53
+ before do
54
+
55
+ q.push obj
56
+
57
+ q.close
58
+
59
+ end
60
+
61
+ it "returns obj" do
62
+
63
+ assert_equal obj, q.pop
64
+
65
+ end
66
+
67
+ end
68
+
69
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: timeout_queue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cameron Harper
@@ -46,6 +46,8 @@ extra_rdoc_files: []
46
46
  files:
47
47
  - lib/timeout_queue.rb
48
48
  - lib/timeout_queue/version.rb
49
+ - test/close.rb
50
+ - test/pop_closed.rb
49
51
  - test/timeout.rb
50
52
  homepage: https://github.com/cjhdev/timeout_queue
51
53
  licenses:
@@ -72,4 +74,6 @@ signing_key:
72
74
  specification_version: 4
73
75
  summary: Like Queue but with a pop timeout and a few other things
74
76
  test_files:
77
+ - test/close.rb
78
+ - test/pop_closed.rb
75
79
  - test/timeout.rb