timeout_queue 0.1.0
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 +7 -0
- data/lib/timeout_queue/version.rb +5 -0
- data/lib/timeout_queue.rb +134 -0
- data/test/timeout.rb +32 -0
- metadata +75 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 59b969678d331842aae14d22898b8ec774048d64387b9edcadad821870c5e4e8
|
4
|
+
data.tar.gz: 1b0e23ffb8727cddafb4dc52a0bfc448d620ec634cfb40d98f9568056b7c4ef0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f6007cde65568613756d2469236ec5dd78a1b5cdd7a8551300aaac55a68fa892b49f1e14a187d8b330a7d6d199993b4e6f3ec267fe837887bfbef2ca406f416c
|
7
|
+
data.tar.gz: 64b1bb7f09a1942d8309306739b7e12c10b36ec9bcf05bc64489216c149b3d414018bf9af6963200ac52b290e40f7ff27c576df0882dfb89e2f16a73ed1e33ca
|
@@ -0,0 +1,134 @@
|
|
1
|
+
class TimeoutQueue
|
2
|
+
|
3
|
+
def initialize(**opt)
|
4
|
+
|
5
|
+
@queue = []
|
6
|
+
@mutex = Mutex.new
|
7
|
+
@received = ConditionVariable.new
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
# push object into end of queue
|
12
|
+
#
|
13
|
+
# @param object
|
14
|
+
# @return object
|
15
|
+
#
|
16
|
+
def push(object, **opt)
|
17
|
+
__push do
|
18
|
+
@queue.send(__method__, object)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# push object into front of the queue
|
23
|
+
#
|
24
|
+
# @param object
|
25
|
+
# @return object
|
26
|
+
#
|
27
|
+
def unshift(object)
|
28
|
+
__push do
|
29
|
+
@queue.send(__method__, object)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# delete an object from the queue before it can be popped
|
34
|
+
#
|
35
|
+
# @param object
|
36
|
+
# @return object
|
37
|
+
#
|
38
|
+
def delete(object)
|
39
|
+
|
40
|
+
with_mutex do
|
41
|
+
@queue.delete(object)
|
42
|
+
end
|
43
|
+
|
44
|
+
object
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
# retrieve next object from queue
|
49
|
+
#
|
50
|
+
# @param non_block [TrueClass,FalseClass] set true to enable non-blocking mode
|
51
|
+
# @param opts [Hash]
|
52
|
+
#
|
53
|
+
# @option opts [Float,Integer] :timeout seconds to wait (in blocking mode)
|
54
|
+
#
|
55
|
+
# @raise ThreadError if timeout expires or queue is empty in non_block mode
|
56
|
+
#
|
57
|
+
def pop(non_block=false, **opts)
|
58
|
+
|
59
|
+
timeout = opts[:timeout]
|
60
|
+
|
61
|
+
if timeout
|
62
|
+
|
63
|
+
end_time = Time.now + timeout.to_f
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
with_mutex do
|
68
|
+
|
69
|
+
while @queue.empty? and not(non_block)
|
70
|
+
|
71
|
+
if timeout
|
72
|
+
|
73
|
+
break unless ((time_now = Time.now) < end_time)
|
74
|
+
|
75
|
+
@received.wait(@mutex, end_time - time_now)
|
76
|
+
|
77
|
+
else
|
78
|
+
|
79
|
+
@received.wait(@mutex)
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
raise ThreadError unless not @queue.empty?
|
86
|
+
|
87
|
+
@queue.shift
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
def empty?
|
94
|
+
@queue.send __method__
|
95
|
+
end
|
96
|
+
|
97
|
+
def size
|
98
|
+
@queue.send __method__
|
99
|
+
end
|
100
|
+
|
101
|
+
def clear
|
102
|
+
with_mutex do
|
103
|
+
@queue.clear
|
104
|
+
end
|
105
|
+
self
|
106
|
+
end
|
107
|
+
|
108
|
+
def with_mutex
|
109
|
+
@mutex.synchronize do
|
110
|
+
yield
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def __push(object)
|
115
|
+
with_mutex do
|
116
|
+
yield
|
117
|
+
@received.signal
|
118
|
+
end
|
119
|
+
object
|
120
|
+
end
|
121
|
+
|
122
|
+
alias_method :length, :size
|
123
|
+
|
124
|
+
alias_method :'<<', :push
|
125
|
+
alias_method :enq, :push
|
126
|
+
|
127
|
+
alias_method :shift, :pop
|
128
|
+
alias_method :deq, :pop
|
129
|
+
|
130
|
+
private :with_mutex, :__push
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
require 'timeout_queue/version'
|
data/test/timeout.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'timeout_queue'
|
3
|
+
|
4
|
+
describe "pop an empty queue" do
|
5
|
+
|
6
|
+
let(:q){ TimeoutQueue.new }
|
7
|
+
|
8
|
+
describe "with a timeout" do
|
9
|
+
|
10
|
+
it "raises ThreadError" do
|
11
|
+
|
12
|
+
assert_raises ThreadError do
|
13
|
+
q.pop(timeout: 1)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "with non_blocking" do
|
21
|
+
|
22
|
+
it "raises ThreadError" do
|
23
|
+
|
24
|
+
assert_raises ThreadError do
|
25
|
+
q.pop(true)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: timeout_queue
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Cameron Harper
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-08-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: minitest
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description:
|
42
|
+
email: contact@cjh.id.au
|
43
|
+
executables: []
|
44
|
+
extensions: []
|
45
|
+
extra_rdoc_files: []
|
46
|
+
files:
|
47
|
+
- lib/timeout_queue.rb
|
48
|
+
- lib/timeout_queue/version.rb
|
49
|
+
- test/timeout.rb
|
50
|
+
homepage: https://github.com/cjhdev/timeout_queue
|
51
|
+
licenses:
|
52
|
+
- MIT
|
53
|
+
metadata: {}
|
54
|
+
post_install_message:
|
55
|
+
rdoc_options: []
|
56
|
+
require_paths:
|
57
|
+
- lib
|
58
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '2.0'
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
requirements: []
|
69
|
+
rubyforge_project:
|
70
|
+
rubygems_version: 2.7.6
|
71
|
+
signing_key:
|
72
|
+
specification_version: 4
|
73
|
+
summary: Like Queue but with a pop timeout and a few other things
|
74
|
+
test_files:
|
75
|
+
- test/timeout.rb
|