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 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