msg-batcher 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/msg-batcher.rb +32 -22
  3. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d684cdfcf05808ca303c7952ee150250a419a0b8e3cc09b95ff04ec1951e2267
4
- data.tar.gz: cccfb2b3897d60c6fa90c2c0849cfd233b6d42524056b795c02c5d0434cc1355
3
+ metadata.gz: c39c802008e79837870af5f88a607a52bc0d1fe47a634012b2fb9d683560d726
4
+ data.tar.gz: c2ca34fdb97390eb44953dcd2fd3fbefdad4c15f380ca52384ba1d7e1ff0e113
5
5
  SHA512:
6
- metadata.gz: 6c5cbccd73b45cf7a96434e9e27b0e0c1ec3a835e9f18ab515a708646912512262504a2ace353bd0c255ee4f934c05acff76b9ae569d9c232d2d9aecaf88b089
7
- data.tar.gz: e90b43430275a946a44dcd5ffd66ca2ba911eb26404faba334848e82c16d45d3a929391f5c8454024b4eef5e6faac946e90fbcb3485a2bcfae762f4498cee7ad
6
+ metadata.gz: 6398ddc1c414860880e4ed71e885856c657a5de8bc04e867fae8aa0c636b9ae9cdb8fe0d3228cb1eae086671ba9f6d82ff908c09b5b0215753d07792e05a4995
7
+ data.tar.gz: 2c301ea4cb70350c1a5a048612d7959dbda580897b99567d6b61a2ac3ee221271883040f70a4bbfb07c9916fa83407b2776d60b059fe251534217df01a73ec0c
data/lib/msg-batcher.rb CHANGED
@@ -36,17 +36,25 @@ class MsgBatcher
36
36
  end
37
37
 
38
38
  def kill(blocking: true)
39
- @closed = true
40
- # releasing timer thread
41
- @timer_start_cv.signal
42
- @timer_release_cv.signal
43
- @timer_thread.join if blocking
39
+ # no #push will interfere
40
+ @m.synchronize do
41
+ # want to make sure that timer thread is in a waiting position. Hence, acquiring @m2
42
+ @m2.synchronize do
43
+ @closed = true
44
+ # releasing timer thread
45
+ @timer_start_cv.signal
46
+ # This can happen, however, that timer thread will wait timeout on @timer_release_cv.
47
+ # If it was waiting on @timer_start_cv. Because timer thread won't reach @timer_release_cv wait poisition
48
+ @timer_release_cv.signal
49
+ end
50
+ @timer_thread.join if blocking
51
+ end
44
52
  end
45
53
 
46
54
  # Thread-safe
47
55
  # @raise [Error] when invoked when batcher has been closed
48
56
  def push(entry)
49
- raise Error, "Batcher is closed - cannot push" if @closed
57
+ raise Error, 'Batcher is closed - cannot push' if @closed
50
58
 
51
59
  @m.lock
52
60
  @m2.lock
@@ -81,7 +89,7 @@ class MsgBatcher
81
89
  @storage = []
82
90
 
83
91
  @already_released = true
84
- dputs "kill timer"
92
+ dputs 'kill timer'
85
93
  @timer_release_cv.signal # informing timer that release is happening
86
94
 
87
95
  # Now interesting happens
@@ -94,12 +102,20 @@ class MsgBatcher
94
102
  # So now we can be sure that timer is at the beginning, ready to wait for @timer_start_cv signal.
95
103
 
96
104
  if from_push
97
- dputs "--------before wait m2"
105
+ dputs '--------before wait m2'
98
106
  @timer_full_cycle_cv.wait @m2
99
107
  @m2.unlock
100
- dputs "-----22222"
108
+ dputs '-----22222'
101
109
  @m.unlock
102
- dputs "---- unlock all"
110
+ dputs '---- unlock all'
111
+ end
112
+
113
+ if temp.empty?
114
+ # The situation when the batch is empty should not happen.
115
+ # However, when the batcher is killed and the timer thread is forced to finish this can happen
116
+ # In any case, just ignoring this empty batch and do not call callback on it
117
+ warn 'MsgBatcher: empty batch. This should not have happened' unless @closed
118
+ return
103
119
  end
104
120
 
105
121
  begin
@@ -119,34 +135,28 @@ class MsgBatcher
119
135
  @already_released = false
120
136
  # informing release that timer is at the beginning
121
137
  @timer_full_cycle_cv.signal
122
- dputs "sdlkfjsd"
123
-
124
-
138
+ dputs 'sdlkfjsd'
125
139
 
126
140
  # Position: TT1
127
141
  # Wait for invocation from push
128
142
  # Each release invocation finishes when timer thread are below (waiting for @timer_start_cv)
129
-
130
- dputs "TT1"
143
+ dputs 'TT1'
131
144
  @timer_start_cv.wait @m2
132
- break if @closed
133
145
 
134
- dputs "TT1 after wait"
146
+ dputs 'TT1 after wait'
135
147
  @timer_started_cv.signal
136
148
 
137
- dputs "TT2"
149
+ dputs 'TT2'
138
150
  # then wait either time to elapse or signal that data has been released
139
151
  @timer_release_cv.wait @m2, @max_time_msecs / 1000.0
140
- break if @closed
141
-
142
152
  dputs "timer end #{@m2.owned?}"
143
-
144
153
  # @m2 is locked here!
145
-
146
154
  unless @already_released
147
155
  dputs "timer's release"
148
156
  release(false)
149
157
  end
158
+
159
+ break if @closed
150
160
  end
151
161
  end
152
162
  # wait for timer to be in waiting state
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: msg-batcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - ertygiq