timeout_queue 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,5 @@
1
+ class TimeoutQueue
2
+
3
+ VERSION = "0.1.0"
4
+
5
+ end
@@ -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