bayserver-core 2.3.0 → 2.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f41f9fb4f873cb31dc74958aa960ea25631f97b3c247ec19e79610e7c7401891
4
- data.tar.gz: 9399102f0b30b1ad6dfe92439707ec97e6b678593855b5a3c0d933253f1d0744
3
+ metadata.gz: ef1870c148ef4f045575bdd31e28b5e13808013fa159e0642a627471e0b80962
4
+ data.tar.gz: 0247c5d8b92f4c9f1cf95b20ae02687202d524c6edd82158711bce98fa5e8e6e
5
5
  SHA512:
6
- metadata.gz: 5eaa95c017ca683078c214ba13700b3b99735a4883a74433b1a9654342930d2d5e297d7ab9fdcac3291da1ca51629e17315a88cd4a89b34124e5b76a3e8da05e
7
- data.tar.gz: dc9635c29598928060361e0ec733c3af899bc211486256b806f0d7ca00b38a6d4f73982d16a94624db3463ed23319105d59dbe03f2f4100f732b1506be55219d
6
+ metadata.gz: c3460ae4f7b5d50945fb20e5f6072838fe7277ccf6d6b9f0cd9d8e51e4ecd3c87a729121cc1d502edb8ddb120841e99377a63ba62324515a74de06d27fe769b6
7
+ data.tar.gz: 22d1f706b151704256cf55526e8b4bc6d29a04c2ab543c9803cb32316719239140997390d7b88b500e1d248cc8281821e68666ba68f2abdddd247880a2dbc698
@@ -37,7 +37,7 @@ module Baykit
37
37
  when GrandAgent::CMD_MEM_USAGE
38
38
  @agent.print_usage()
39
39
  when GrandAgent::CMD_SHUTDOWN
40
- @agent.shutdown()
40
+ @agent.req_shutdown()
41
41
  @aborted = true
42
42
  when GrandAgent::CMD_ABORT
43
43
  IOUtil.write_int32(@communication_channel, GrandAgent::CMD_OK)
@@ -125,112 +125,117 @@ module Baykit
125
125
  busy = true
126
126
  begin
127
127
  while not @aborted
128
- begin
129
- count = -1
130
-
131
- if @accept_handler
132
- test_busy = @accept_handler.ch_count >= @max_inbound_ships
133
- if test_busy != busy
134
- busy = test_busy
135
- if busy
136
- @accept_handler.on_busy()
137
- else
138
- @accept_handler.on_free()
139
- end
128
+
129
+ count = -1
130
+
131
+ if @accept_handler
132
+ test_busy = @accept_handler.ch_count >= @max_inbound_ships
133
+ if test_busy != busy
134
+ busy = test_busy
135
+ if busy
136
+ @accept_handler.on_busy()
137
+ else
138
+ @accept_handler.on_free()
140
139
  end
141
140
  end
141
+ end
142
142
 
143
- if !busy && @selector.count() == 2
144
- # agent finished
145
- BayLog.debug("%s Selector has no key", self)
146
- break
147
- end
143
+ if !busy && @selector.count() == 2
144
+ # agent finished
145
+ BayLog.debug("%s Selector has no key", self)
146
+ break
147
+ end
148
148
 
149
- if !@spin_handler.empty?
150
- timeout = 0
151
- else
152
- timeout = @select_timeout_sec
153
- end
149
+ if !@spin_handler.empty?
150
+ timeout = 0
151
+ else
152
+ timeout = @select_timeout_sec
153
+ end
154
154
 
155
- #@BayServer.debug("Selecting... read=" + read_list.to_s)
156
- selected_map = @selector.select(timeout)
157
- #BayLog.debug("%s selected: %s", self, selected_map)
155
+ if @aborted
156
+ BayLog.info("%s aborted by another thread", self)
157
+ break
158
+ end
159
+ #@BayServer.debug("Selecting... read=" + read_list.to_s)
160
+ selected_map = @selector.select(timeout)
161
+ #BayLog.debug("%s selected: %s", self, selected_map)
158
162
 
159
- processed = @non_blocking_handler.register_channel_ops() > 0
163
+ processed = @non_blocking_handler.register_channel_ops() > 0
160
164
 
161
- if selected_map.length == 0
162
- # No channel is selected
163
- processed |= @spin_handler.process_data()
164
- end
165
+ if @aborted
166
+ BayLog.info("%s aborted by another thread", self)
167
+ break
168
+ end
165
169
 
166
- selected_map.keys().each do |ch|
167
- if ch == @select_wakeup_pipe[0]
168
- # Waked up by ask_to_*
169
- on_waked_up(ch)
170
- elsif ch == @command_receiver.communication_channel
171
- @command_receiver.on_pipe_readable()
172
- elsif @accept_handler && @accept_handler.server_socket?(ch)
173
- @accept_handler.on_acceptable(ch)
174
- else
175
- @non_blocking_handler.handle_channel(ch, selected_map[ch])
176
- end
177
- processed = true
178
- end
170
+ if selected_map.length == 0
171
+ # No channel is selected
172
+ processed |= @spin_handler.process_data()
173
+ end
179
174
 
180
- if not processed
181
- # timeout check
182
- @timer_handlers.each do |h|
183
- h.on_timer()
184
- end
175
+ selected_map.keys().each do |ch|
176
+ if ch == @select_wakeup_pipe[0]
177
+ # Waked up by ask_to_*
178
+ on_waked_up(ch)
179
+ elsif ch == @command_receiver.communication_channel
180
+ @command_receiver.on_pipe_readable()
181
+ elsif @accept_handler && @accept_handler.server_socket?(ch)
182
+ @accept_handler.on_acceptable(ch)
183
+ else
184
+ @non_blocking_handler.handle_channel(ch, selected_map[ch])
185
185
  end
186
+ processed = true
187
+ end
186
188
 
187
- rescue => e
188
- raise e
189
+ if not processed
190
+ # timeout check
191
+ @timer_handlers.each do |h|
192
+ h.on_timer()
193
+ end
189
194
  end
195
+
190
196
  end # while
191
197
 
192
198
  rescue => e
193
- BayLog.error_e(e)
194
- raise e
199
+ BayLog.fatal_e(e)
195
200
  ensure
196
201
  BayLog.info("%s end", self)
197
- abort_agent(nil, 0)
202
+ shutdown()
198
203
  end
199
204
  end
200
205
 
201
206
  def shutdown()
207
+ BayLog.info("%s shutdown", self)
208
+
202
209
  if @accept_handler != nil
203
210
  @accept_handler.shutdown()
204
211
  end
205
- @aborted = true
206
- wakeup()
207
- end
208
-
209
- def abort_agent(err = nil, status = 1)
210
- BayLog.info("%s abort aborted=%s", self, @aborted)
211
- if @aborted
212
- return
213
- end
214
-
215
- if err
216
- BayLog.fatal("%s abort", self)
217
- BayLog.fatal_e(err)
218
- end
219
212
 
220
213
  @command_receiver.end()
214
+ @non_blocking_handler.close_all()
215
+
221
216
  GrandAgent.listeners.each do |lis|
222
217
  lis.remove(self)
223
218
  end
224
219
 
225
220
  GrandAgent.agents.delete(@agent_id)
226
221
 
227
- @aborted = true
222
+ @agent_id = -1
223
+ if BayServer.harbor.multi_core
224
+ exit(1)
225
+ end
226
+ end
227
+
228
+ def abort_agent()
229
+ BayLog.info("%s abort", self)
230
+
228
231
  if BayServer.harbor.multi_core
229
232
  exit(1)
230
- else
231
- clean()
232
233
  end
234
+ end
233
235
 
236
+ def req_shutdown()
237
+ @aborted = true
238
+ wakeup()
234
239
  end
235
240
 
236
241
  def reload_cert()
@@ -281,11 +286,6 @@ module Baykit
281
286
  val = IOUtil.read_int32(pipe_fd)
282
287
  end
283
288
 
284
- def clean()
285
- @non_blocking_handler.close_all()
286
- @agent_id = -1
287
- end
288
-
289
289
  ######################################################
290
290
  # class methods
291
291
  ######################################################
@@ -25,11 +25,13 @@ module Baykit
25
25
  attr :agent_id
26
26
  attr :anchorable
27
27
  attr :communication_channel
28
+ attr :child_pid
28
29
 
29
- def initialize(agt_id, anchorable, com_channel)
30
+ def initialize(agt_id, anchorable, com_channel, child_pid)
30
31
  @agent_id = agt_id
31
32
  @anchorable = anchorable
32
33
  @communication_channel = com_channel
34
+ @child_pid = child_pid
33
35
  end
34
36
 
35
37
  def to_s()
@@ -42,7 +44,7 @@ module Baykit
42
44
  if res == nil || res == GrandAgent::CMD_CLOSE
43
45
  BayLog.debug("%s read Close", self)
44
46
  close()
45
- GrandAgentMonitor.agent_aborted(@agent_id, @anchorable)
47
+ agent_aborted()
46
48
  else
47
49
  BayLog.debug("%s read OK: %d", self, res)
48
50
  end
@@ -81,6 +83,33 @@ module Baykit
81
83
  @communication_channel.close()
82
84
  end
83
85
 
86
+ def agent_aborted()
87
+ BayLog.info(BayMessage.get(:MSG_GRAND_AGENT_SHUTDOWN, @agent_id))
88
+
89
+ if @child_pid != nil
90
+ begin
91
+ Process.kill("TERM", @child_pid)
92
+ rescue => e
93
+ BayLog.debug_e(e, "Error on killing process")
94
+ end
95
+ Process.wait(@child_pid)
96
+ end
97
+ GrandAgentMonitor.monitors.delete(@agent_id)
98
+
99
+ if not GrandAgentMonitor.finale
100
+ if GrandAgentMonitor.monitors.length < GrandAgentMonitor.num_agents
101
+ begin
102
+ if !BayServer.harbor.multi_core
103
+ GrandAgent.add(-1, @anchorable)
104
+ end
105
+ GrandAgentMonitor.add(@anchorable)
106
+ rescue => e
107
+ BayLog.error_e(e)
108
+ end
109
+ end
110
+ end
111
+ end
112
+
84
113
  ########################################
85
114
  # Class methods
86
115
  ########################################
@@ -151,32 +180,16 @@ module Baykit
151
180
  agt.run()
152
181
  end
153
182
 
183
+ child = nil
184
+
154
185
  end
155
186
 
156
187
  @monitors[agt_id] =
157
188
  GrandAgentMonitor.new(
158
189
  agt_id,
159
190
  anchoroable,
160
- client_socket)
161
- end
162
-
163
- def self.agent_aborted(agt_id, anchorable)
164
- BayLog.info(BayMessage.get(:MSG_GRAND_AGENT_SHUTDOWN, agt_id))
165
-
166
- @monitors.delete(agt_id)
167
-
168
- if not @finale
169
- if @monitors.length < @num_agents
170
- begin
171
- if !BayServer.harbor.multi_core
172
- GrandAgent.add(-1, anchorable)
173
- end
174
- add(anchorable)
175
- rescue => e
176
- BayLog.error_e(e)
177
- end
178
- end
179
- end
191
+ client_socket,
192
+ child)
180
193
  end
181
194
 
182
195
  def self.reload_cert_all()
@@ -77,6 +77,8 @@ module Baykit
77
77
  end
78
78
  tur.init(tur_key, self)
79
79
  @active_tours.append(tur)
80
+ else
81
+ tur.ship.check_ship_id(@ship_id)
80
82
  end
81
83
  end
82
84
  return tur
@@ -203,7 +203,7 @@ module Baykit
203
203
  end
204
204
 
205
205
  def return_protocol_handler(agt, proto_hnd)
206
- BayLog.debug("%s Return protocol handler: ", proto_hnd)
206
+ BayLog.debug("%s Return protocol handler", proto_hnd)
207
207
  PortBase.get_protocol_handler_store(proto_hnd.protocol, agt).Return(proto_hnd)
208
208
  end
209
209
 
@@ -83,6 +83,10 @@ module Baykit
83
83
  end
84
84
  end
85
85
 
86
+ def on_timer()
87
+
88
+ end
89
+
86
90
  def post(data, adr, tag)
87
91
  @lock.synchronize do
88
92
  empty = @write_queue.empty?
@@ -66,17 +66,17 @@ module Baykit
66
66
  tur = pair[1]
67
67
  tur.check_tour_id pair[0]
68
68
 
69
- if !tur.res.header_sent
70
- BayLog.error("%s Send ServiceUnavailable: tur=%s", self, tur);
71
- tur.res.send_error(Tour::TOUR_ID_NOCHECK, HttpStatus::SERVICE_UNAVAILABLE, "Server closed on reading headers")
72
- else
73
- # NOT treat EOF as Error
74
- BayLog.debug("%s EOF is not an error: tur=%s", self, tur);
75
- begin
69
+ begin
70
+ if !tur.res.header_sent
71
+ BayLog.debug("%s Send ServiceUnavailable: tur=%s", self, tur)
72
+ tur.res.send_error(Tour::TOUR_ID_NOCHECK, HttpStatus::SERVICE_UNAVAILABLE, "Server closed on reading headers")
73
+ else
74
+ # NOT treat EOF as Error
75
+ BayLog.debug("%s EOF is not an error: tur=%s", self, tur)
76
76
  tur.res.end_content(Tour::TOUR_ID_NOCHECK)
77
- rescue IOError => e
78
- BayLog::debug_e(e, "%s end content error: tur=%s", self, tur);
79
77
  end
78
+ rescue IOError => e
79
+ BayLog::debug_e(e)
80
80
  end
81
81
  end
82
82
 
@@ -8,6 +8,7 @@ module Baykit
8
8
  # abstract method
9
9
  #
10
10
  # depart()
11
+ # on_timer()
11
12
  #
12
13
 
13
14
  class << self
@@ -20,6 +20,7 @@ module Baykit
20
20
  end
21
21
 
22
22
  def remove(agt)
23
+ BayLog.debug("%s Remove tax runner", agt)
23
24
  TaxiRunner.runners[agt.agent_id - 1].terminate()
24
25
  TaxiRunner.runners[agt.agent_id - 1] = nil
25
26
  end
@@ -63,15 +64,30 @@ module Baykit
63
64
 
64
65
  def terminate()
65
66
  @agent.remove_timer_handler(self)
67
+ @exe.shutdown
66
68
  end
67
69
 
68
70
  def submit(txi)
69
- @lock.synchronize do
70
- @running_taxis << txi
71
- end
72
- @exe.submit(txi)
73
- @lock.synchronize do
74
- @running_taxis.delete(txi)
71
+ @exe.submit() do
72
+ if @agent.aborted
73
+ BayLog.error("Agent is aborted")
74
+ return
75
+ end
76
+
77
+ @lock.synchronize do
78
+ @running_taxis << txi
79
+ end
80
+
81
+ begin
82
+ txi.run()
83
+ rescue => e
84
+ BayLog.fatal_e(e)
85
+ @agent.req_shutdown
86
+ ensure
87
+ @lock.synchronize do
88
+ @running_taxis.delete(txi)
89
+ end
90
+ end
75
91
  end
76
92
  end
77
93
 
@@ -24,6 +24,7 @@ module Baykit
24
24
  attr :running
25
25
  attr :lock
26
26
  attr :agent_id
27
+ attr :start_time
27
28
 
28
29
  def initialize(agt_id, buf_size)
29
30
  super()
@@ -58,28 +59,36 @@ module Baykit
58
59
  ######################################################
59
60
 
60
61
  def depart()
61
- @lock.synchronize do
62
- begin
63
- @buf.clear()
64
- @infile.read(@buf_size, @buf)
65
-
66
- if @buf.length == 0
67
- @data_listener.notify_eof()
68
- close()
69
- return
70
- end
62
+ @start_time = Time.now.to_i
63
+ begin
64
+ @buf.clear()
65
+ @infile.read(@buf_size, @buf)
71
66
 
72
- act = @data_listener.notify_read(@buf, nil)
67
+ if @buf.length == 0
68
+ close()
69
+ return
70
+ end
73
71
 
74
- @running = false
75
- if act == NextSocketAction::CONTINUE
76
- next_run()
77
- end
72
+ act = @data_listener.notify_read(@buf, nil)
78
73
 
79
- rescue Exception => e
80
- BayLog.error_e(e)
81
- close()
74
+ @running = false
75
+ if act == NextSocketAction::CONTINUE
76
+ next_run()
82
77
  end
78
+
79
+ rescue IOError => e
80
+ BayLog.debug_e(e)
81
+ close()
82
+ rescue Exception => e
83
+ close()
84
+ raise e
85
+ end
86
+ end
87
+
88
+ def on_timer()
89
+ duration_sec = Time.now.to_i - @start_time
90
+ if (@data_listener.check_timeout(duration_sec))
91
+ close()
83
92
  end
84
93
  end
85
94
 
@@ -94,9 +103,21 @@ module Baykit
94
103
  end
95
104
 
96
105
  def close()
97
- @ch_valid = false
98
- @infile.close()
99
- @data_listener.notify_close()
106
+ @lock.synchronize do
107
+ if !@ch_valid
108
+ return
109
+ end
110
+
111
+ @ch_valid = false
112
+ @data_listener.notify_eof()
113
+
114
+ begin
115
+ @infile.close()
116
+ rescue IOError => e
117
+ end
118
+
119
+ @data_listener.notify_close()
120
+ end
100
121
  end
101
122
  end
102
123
  end
@@ -57,7 +57,11 @@ module Baykit
57
57
 
58
58
  def notify_eof()
59
59
  BayLog.trace("%s EOF(^o^) %s", self, @file_name)
60
- @tour.res.end_content(@tour_id)
60
+ begin
61
+ @tour.res.end_content(@tour_id)
62
+ rescue IOError => e
63
+ BayLog.debug_e(e)
64
+ end
61
65
  return NextSocketAction::CLOSE
62
66
  end
63
67
 
@@ -123,17 +123,9 @@ module Baykit
123
123
  else
124
124
  begin
125
125
  city.enter(self)
126
- rescue Sink => e
127
- change_state(TOUR_ID_NOCHECK, TourState::ABORTED)
128
- raise e
129
126
  rescue HttpException => e
130
- BayLog.error_e(e)
131
127
  change_state(TOUR_ID_NOCHECK, TourState::ABORTED)
132
128
  raise e
133
- rescue => e
134
- BayLog.error_e(e)
135
- change_state(TOUR_ID_NOCHECK, TourState::ABORTED)
136
- raise HttpException.new(HttpStatus::INTERNAL_SERVER_ERROR, e.message)
137
129
  end
138
130
  end
139
131
  end
@@ -208,26 +208,27 @@ module Baykit
208
208
  end
209
209
 
210
210
  def abort()
211
- if !@tour.preparing?
212
- BayLog.debug("%s cannot abort non-preparing tour", @tour)
213
- return false
214
- end
215
-
216
211
  BayLog.debug("%s abort", @tour)
217
- if @tour.aborted?
218
- raise Sink.new("tour has already aborted")
219
- end
212
+ if @tour.preparing?
213
+ @tour.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ABORTED)
214
+ return true
220
215
 
221
- aborted = true
222
- if @tour.running? && @content_handler != nil
223
- aborted = @content_handler.on_abort(@tour)
224
- end
216
+ elsif @tour.running?
217
+ aborted = true
218
+ if @content_handler != nil
219
+ aborted = @content_handler.on_abort(@tour)
220
+ end
225
221
 
226
- if aborted
227
- @tour.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ABORTED)
222
+ if aborted
223
+ @tour.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ABORTED)
224
+ end
225
+
226
+ return aborted
227
+ else
228
+ BayLog.debug("%s tour is not preparing or not running", @tour)
229
+ return false
228
230
  end
229
231
 
230
- return aborted
231
232
  end
232
233
 
233
234
  def set_content_handler(hnd)
@@ -47,13 +47,11 @@ module Baykit
47
47
  attr :bytes_consumed
48
48
  attr :bytes_limit
49
49
  attr :buffer_size
50
- attr :tour_returned
51
50
 
52
51
  def initialize(tur)
53
52
  @headers = Headers.new()
54
53
  @tour = tur
55
54
  @buffer_size = BayServer.harbor.tour_buffer_size
56
- @tour_returned = false
57
55
  end
58
56
 
59
57
  def init()
@@ -187,6 +185,7 @@ module Baykit
187
185
  raise Sink.new("Response consume listener is null")
188
186
  end
189
187
 
188
+ @bytes_posted += len
190
189
  BayLog.debug("%s posted res content len=%d posted=%d limit=%d consumed=%d",
191
190
  @tour, len, @bytes_posted, @bytes_limit, @bytes_consumed)
192
191
  if @bytes_limit > 0 && @bytes_limit < self.bytes_posted
@@ -211,10 +210,6 @@ module Baykit
211
210
  end
212
211
  end
213
212
 
214
- @bytes_posted += len
215
-
216
- BayLog.debug("%s post res content: len=%d posted=%d limit=%d consumed=%d",
217
- @tour, len, @bytes_posted, @bytes_limit, @bytes_consumed)
218
213
 
219
214
  old_available = @available
220
215
  if !buffer_available()
@@ -248,17 +243,17 @@ module Baykit
248
243
 
249
244
 
250
245
  # Done listener
246
+ tour_returned = false
251
247
  done_lis = Proc.new() do
252
248
  @tour.check_tour_id(chk_tour_id)
253
249
  @tour.ship.return_tour(@tour)
254
- @tour_returned = true
250
+ tour_returned = true
255
251
  end
256
252
 
257
253
  begin
258
254
  if @tour.zombie? || @tour.aborted?
259
255
  # Don't send peer any data. Do nothing
260
256
  BayLog.debug("%s Aborted or zombie tour. do nothing: %s state=%s", self, @tour, @tour.state)
261
- @tour.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ENDED)
262
257
  done_lis.call()
263
258
  else
264
259
  begin
@@ -270,8 +265,10 @@ module Baykit
270
265
  end
271
266
  end
272
267
  ensure
273
- BayLog.debug("%s Tour is returned: %s", self, @tour_returned)
274
- if !@tour_returned
268
+ # If tour is returned, we cannot change its state because
269
+ # it will become uninitialized.
270
+ BayLog.debug("%s tur#%d is returned: %s", self, chk_tour_id, tour_returned)
271
+ if !tour_returned
275
272
  @tour.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ENDED)
276
273
  end
277
274
  end
@@ -326,8 +323,8 @@ module Baykit
326
323
  end
327
324
 
328
325
  if @header_sent
329
- BayLog.warn("Try to send error after response header is sent (Ignore)")
330
- BayLog.warn("%s: status=%d, message=%s", self, status, msg)
326
+ BayLog.debug("Try to send error after response header is sent (Ignore)")
327
+ BayLog.debug("%s: status=%d, message=%s", self, status, msg)
331
328
  if err != nil
332
329
  BayLog.error_e(err);
333
330
  end
@@ -341,7 +338,7 @@ module Baykit
341
338
  begin
342
339
  @tour.ship.send_error(@tour.ship_id, @tour, status, msg, err)
343
340
  rescue IOError => e
344
- BayLog.debug("%s Error on sending end tour", self)
341
+ BayLog.debug_e(e, "%s Error on sending error", self)
345
342
  @tour.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ABORTED)
346
343
  end
347
344
  @header_sent = true
@@ -20,17 +20,25 @@ module Baykit
20
20
  @name = name
21
21
  end
22
22
 
23
+ def to_s
24
+ @name
25
+ end
26
+
23
27
  def run
24
28
  while true
25
- tsk = @que.deq
26
- BayLog.debug("%s Start task on: %s", tsk, @name)
27
- tsk.run
28
- BayLog.debug("%s End task on: %s", tsk, @name)
29
+ block = @que.deq
30
+ if block == nil
31
+ break
32
+ end
33
+ BayLog.debug("Start task on: %s", @name)
34
+ block.call
35
+ BayLog.debug("End task on: %s", @name)
29
36
  end
30
37
  end
31
38
 
32
- def to_s
33
- @name
39
+ def shutdown
40
+ @que.pop until @que.empty?
41
+ @que.enq(nil)
34
42
  end
35
43
  end
36
44
 
@@ -40,12 +48,14 @@ module Baykit
40
48
  attr :count
41
49
  attr :max_queue_len
42
50
  attr :name
51
+ attr :executors
43
52
 
44
53
  def initialize(name, count)
45
54
  @que = Thread::Queue.new
46
55
  @count = count
47
56
  @max_queue_len = MAX_LEN_PER_EXECUTOR * count
48
57
  @name = name
58
+ @executors = []
49
59
 
50
60
  count.times do |i|
51
61
  started = false
@@ -56,6 +66,7 @@ module Baykit
56
66
  Thread.current.name = th_name
57
67
  e = Executor.new @que, id, th_name
58
68
  e.run
69
+ @executors << e
59
70
  end
60
71
  while !started
61
72
  sleep(0.01)
@@ -63,17 +74,23 @@ module Baykit
63
74
  end
64
75
  end
65
76
 
66
- def to_s()
77
+ def to_s
67
78
  return "ExecutorService[#{@name}]"
68
79
  end
69
80
 
70
81
  # post task
71
- def submit(tsk)
72
- BayLog.debug("%s Submit: task=%s (qlen=%d/%d)", self, tsk, @que.length, @max_queue_len)
82
+ def submit(&block)
83
+ BayLog.debug("%s Submit: (qlen=%d/%d)", self, @que.length, @max_queue_len)
73
84
  if @que.length > @max_queue_len
74
85
  raise IOError("Task queue is full (>_<)")
75
86
  end
76
- @que.enq(tsk)
87
+ @que.enq(block)
88
+ end
89
+
90
+ def shutdown
91
+ @executors.each do |exe|
92
+ exe.shutdown
93
+ end
77
94
  end
78
95
  end
79
96
  end
@@ -1,7 +1,7 @@
1
1
  module Baykit
2
2
  module BayServer
3
3
  class Version
4
- VERSION='2.3.0'
4
+ VERSION='2.3.2'
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bayserver-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michisuke-P
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-11-15 00:00:00.000000000 Z
11
+ date: 2023-12-23 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: BayServer is one of the high-speed web servers. It operates as a single-threaded,
14
14
  asynchronous server, which makes it exceptionally fast. It also supports multi-core