senotrusov-ruby-threading-toolkit 1.0.2 → 1.0.4

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.
@@ -22,6 +22,7 @@ require "ruby-toolkit"
22
22
  require 'ruby-threading-toolkit/condition_variable.rb'
23
23
  require 'ruby-threading-toolkit/mutexed_accessors.rb'
24
24
  require 'ruby-threading-toolkit/smart_queue.rb'
25
+ require 'ruby-threading-toolkit/persistent_queue.rb'
25
26
  require 'ruby-threading-toolkit/thread.rb'
26
27
  require 'ruby-threading-toolkit/thread_lock.rb'
27
28
  require 'ruby-threading-toolkit/threadsafe_sequence.rb'
@@ -0,0 +1,42 @@
1
+
2
+ # Copyright 2006-2009 Stanislav Senotrusov <senotrusov@gmail.com>
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+
17
+ class PersistentQueue < SmartQueue
18
+ attr_accessor :storage
19
+
20
+ def restore
21
+ @mutex.synchronize do
22
+ if @storage.exist?
23
+ data = Marshal.restore(@storage.read)
24
+ @storage.delete
25
+
26
+ @regular = data[:regular]
27
+ @priority = data[:priority]
28
+ end
29
+ end
30
+ end
31
+
32
+ def store_and_close
33
+ @mutex.synchronize do
34
+ @storage.write Marshal.dump({:regular => @regular, :priority => @priority})
35
+
36
+ # This will simply raise exception on trying to push/pop from/to queue
37
+ @regular = nil
38
+ @priority = nil
39
+ end
40
+ end
41
+ end
42
+
@@ -15,29 +15,20 @@
15
15
 
16
16
 
17
17
  class SmartQueue
18
- def initialize(dumped = nil)
18
+ def initialize
19
19
  @mutex = Mutex.new
20
20
 
21
21
  @arrived = ConditionVariable.new
22
22
  @shifted = ConditionVariable.new
23
23
 
24
- @persistent = false
25
-
26
- if dumped && (dumped = Marshal.restore(dumped))
27
- @regular = dumped[:regular]
28
- @priority = dumped[:priority]
29
- else
30
- @regular = []
31
- @priority = []
32
- end
24
+ @regular = []
25
+ @priority = []
33
26
 
34
27
  @regular_limit = nil
35
28
 
36
29
  @stop_list = {}
37
30
  end
38
31
 
39
- attr_accessor :persistent
40
-
41
32
  def release_blocked thread
42
33
  @mutex.synchronize do
43
34
  # Cleaning up @stop_list right here, so, at maximum, it holds only one dead thread.
@@ -50,22 +41,13 @@ class SmartQueue
50
41
  end
51
42
  end
52
43
 
53
- def to_storage
54
- @mutex.synchronize do
55
- dump = Marshal.dump({:regular => @regular, :priority => @priority})
56
- @regular.clear
57
- @priority.clear
58
- return dump
59
- end
60
- end
61
-
62
44
  def regular_limit= limit
63
45
  @mutex.synchronize do
64
46
  @regular_limit = limit
65
47
  end
66
48
  end
67
49
 
68
- def push message
50
+ def regular_enqueue action, data
69
51
  @mutex.synchronize do
70
52
  @shifted.if_wait_while(@mutex) { @regular_limit && @regular.length >= @regular_limit && !@stop_list.include?(Thread.current) }
71
53
 
@@ -73,20 +55,36 @@ class SmartQueue
73
55
  @stop_list.delete(Thread.current)
74
56
  end
75
57
 
76
- @regular.push message
58
+ @regular.__send__(action, data)
77
59
  @arrived.signal
78
60
  end
79
61
  true
80
62
  end
81
63
 
82
- def priority_push message
64
+ def push message
65
+ regular_enqueue :push, message
66
+ end
67
+
68
+ def concat messages
69
+ regular_enqueue :concat, messages
70
+ end
71
+
72
+ def priority_enqueue action, data
83
73
  @mutex.synchronize do
84
- @priority.push message
74
+ @priority.__send__(action, data)
85
75
  @arrived.signal
86
76
  end
87
77
  true
88
78
  end
89
79
 
80
+ def priority_push message
81
+ priority_enqueue :push, message
82
+ end
83
+
84
+ def priority_concat messages
85
+ priority_enqueue :concat, messages
86
+ end
87
+
90
88
  def shift
91
89
  @mutex.synchronize do
92
90
  @arrived.if_wait_while(@mutex) { @priority.empty? && @regular.empty? && !@stop_list.include?(Thread.current) }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: senotrusov-ruby-threading-toolkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stanislav Senotrusov
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-07-27 00:00:00 -07:00
12
+ date: 2009-08-09 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -46,6 +46,7 @@ files:
46
46
  - LICENSE
47
47
  - lib/ruby-threading-toolkit
48
48
  - lib/ruby-threading-toolkit/thread_lock.rb
49
+ - lib/ruby-threading-toolkit/persistent_queue.rb
49
50
  - lib/ruby-threading-toolkit/threadsafe_sequence_loop.rb
50
51
  - lib/ruby-threading-toolkit/condition_variable.rb
51
52
  - lib/ruby-threading-toolkit/smart_queue.rb