dango 0.4.5 → 0.4.6
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/dango/server_framework.rb +58 -46
- data/lib/dango/shared/memory_store.rb +11 -11
- data/lib/dango/version.rb +1 -1
- metadata +2 -2
@@ -72,10 +72,12 @@ class DangoServerFramework
|
|
72
72
|
|
73
73
|
def exit_process() # プロセス終了処理
|
74
74
|
debug_print("shutdown")
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
75
|
+
if @is_pid_file_create
|
76
|
+
begin
|
77
|
+
File.delete(@pid_file)
|
78
|
+
rescue
|
79
|
+
puts "failed delete file. #{@pid_file}:#{$!.class}:#{$!.message}"
|
80
|
+
end
|
79
81
|
end
|
80
82
|
puts "shutdown"
|
81
83
|
exit!
|
@@ -87,6 +89,8 @@ class DangoServerFramework
|
|
87
89
|
@gserver = nil # Gserver用の変数
|
88
90
|
@server_reload = nil # サーバーのリロード用フラグ
|
89
91
|
|
92
|
+
@is_pid_file_create = nil # pidファイルを作ったかどうかのフラグ
|
93
|
+
|
90
94
|
# SIGINT の捕捉
|
91
95
|
Signal.trap(:INT) do
|
92
96
|
logger.warn "SIGINT\n#{caller(0).pretty_inspect}"
|
@@ -183,6 +187,7 @@ class DangoServerFramework
|
|
183
187
|
|
184
188
|
GC.disable
|
185
189
|
open(@pid_file, "wb"){|fh| fh.write Process.pid.to_s } # pidをファイルに保存
|
190
|
+
@is_pid_file_create = true # pidファイルを作ったことを記録
|
186
191
|
|
187
192
|
# @gserver.start(@server_max_connections)
|
188
193
|
@gserver.start(@server_max_connections, 20) # backlogを20に設定
|
@@ -286,9 +291,9 @@ class DangoServerFramework
|
|
286
291
|
sock.binmode
|
287
292
|
sock.sync = true
|
288
293
|
|
289
|
-
session[:peer_addr]
|
294
|
+
session[:peer_addr] = sock.peeraddr
|
290
295
|
session[:peer_ip_address] = sock.peeraddr[3]
|
291
|
-
session[:peer_host]
|
296
|
+
session[:peer_host] = sock.peeraddr[2]
|
292
297
|
end
|
293
298
|
|
294
299
|
session[:encode_type] = DefaultEncodeType
|
@@ -306,6 +311,8 @@ class DangoServerFramework
|
|
306
311
|
@arr_send_response.delete_if{|r| r[:time] < Time.now - 60}
|
307
312
|
end
|
308
313
|
|
314
|
+
logger.debug "thread_main:do main loop."
|
315
|
+
|
309
316
|
# メインループ入り
|
310
317
|
loop do
|
311
318
|
if sock.closed?
|
@@ -322,9 +329,8 @@ class DangoServerFramework
|
|
322
329
|
end
|
323
330
|
|
324
331
|
if is_flash_policy_file # Flashのポリシーファイルが来たら
|
325
|
-
|
326
|
-
|
327
|
-
end
|
332
|
+
logger.debug "is_flash_policy_file"
|
333
|
+
do_flash_policy_file(sid, sock)
|
328
334
|
|
329
335
|
# この部分はポリシーファイルを返す設定に関係なく実行する部分
|
330
336
|
sleep 0.1
|
@@ -421,36 +427,40 @@ class DangoServerFramework
|
|
421
427
|
logger.error "Exception #{sid} #{error_message($!, 'u')}"
|
422
428
|
|
423
429
|
ensure
|
430
|
+
# 接続切断の処理
|
424
431
|
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
logger.info "#{sock.inspect} #{sid} is closing"
|
429
|
-
if session[:connected] # dango_connect()が実行済みなら
|
430
|
-
dango_close() # 接続解除時に呼び出されるメソッド
|
431
|
-
end
|
432
|
-
end
|
433
|
-
rescue Exception
|
434
|
-
logger.error "#{sock.inspect} #{sid} ERROR\n#{error_message($!, 'u')}"
|
435
|
-
ensure
|
436
|
-
socket_list.delete(sid) # ソケットリストから削除
|
432
|
+
if !is_flash_policy_file # Flash Policy Fileなら切断処理不要
|
433
|
+
logger.info "#{sock.inspect} #{sid} is closing"
|
434
|
+
if session[:connected] # dango_connect()が実行済みなら
|
437
435
|
begin
|
438
|
-
@
|
439
|
-
|
440
|
-
end
|
441
|
-
rescue IOError
|
442
|
-
logger.info "IOError #{sock.inspect} #{sid}"
|
436
|
+
@mutex_proc_thread.synchronize do
|
437
|
+
dango_close() # 接続解除時に呼び出されるメソッド
|
438
|
+
end # mutex_proc_thread
|
443
439
|
rescue Exception
|
444
|
-
logger.error "#{sock.inspect} #{sid}
|
445
|
-
end
|
446
|
-
|
447
|
-
logger.info "#{sock.inspect} #{sid} is closed"
|
448
|
-
@mutex_sock[sock.object_id].synchronize do
|
449
|
-
sock = nil
|
440
|
+
logger.error "#{sock.inspect} #{sid} ERROR\n#{error_message($!, 'u')}"
|
450
441
|
end
|
451
|
-
@mutex_sock.delete(sock.object_id)
|
452
442
|
end
|
453
|
-
end
|
443
|
+
end
|
444
|
+
|
445
|
+
begin
|
446
|
+
@mutex_sock[sock.object_id].synchronize do
|
447
|
+
sock.close # ソケットを閉じる
|
448
|
+
end
|
449
|
+
rescue IOError
|
450
|
+
logger.info "IOError #{sock.inspect} #{sid}"
|
451
|
+
rescue Exception
|
452
|
+
logger.error "#{sock.inspect} #{sid} Exception\n#{error_message($!, 'u')}"
|
453
|
+
end
|
454
|
+
|
455
|
+
logger.info "#{sock.inspect} #{sid} is closed"
|
456
|
+
|
457
|
+
socket_list.delete(sid) # ソケットリストから削除
|
458
|
+
|
459
|
+
@mutex_sock[sock.object_id].synchronize do
|
460
|
+
sock = nil # ソケット削除
|
461
|
+
end
|
462
|
+
|
463
|
+
@mutex_sock.delete(sock.object_id) # ソケット排他処理から削除
|
454
464
|
|
455
465
|
@session_manager.close_session(sid) # sessionの終了処理
|
456
466
|
end
|
@@ -459,11 +469,10 @@ class DangoServerFramework
|
|
459
469
|
|
460
470
|
# Flashのポリシーファイルの処理
|
461
471
|
def do_flash_policy_file(sid, sock)
|
462
|
-
logger.debug "is_flash_policy_file"
|
463
472
|
|
464
473
|
if @policy_file_request # ポリシーファイルを返す設定なら
|
465
474
|
logger.info "is_flash_policy_file #{sid} #{@policy_file_request}"
|
466
|
-
|
475
|
+
|
467
476
|
allow_str = ""
|
468
477
|
|
469
478
|
@policy_file_allow_domain.each do |one_host|
|
@@ -479,8 +488,11 @@ class DangoServerFramework
|
|
479
488
|
EOF
|
480
489
|
|
481
490
|
logger.debug policy_data
|
482
|
-
sock.
|
483
|
-
|
491
|
+
@mutex_sock[sock.object_id].synchronize do
|
492
|
+
sock.write policy_data
|
493
|
+
sock.flush
|
494
|
+
end
|
495
|
+
|
484
496
|
logger.info "policy file sent."
|
485
497
|
end
|
486
498
|
end
|
@@ -636,14 +648,14 @@ EOF
|
|
636
648
|
begin
|
637
649
|
sleep @gc_interval_sec
|
638
650
|
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
651
|
+
@mutex_proc_thread.synchronize do
|
652
|
+
logger.debug "GC start "
|
653
|
+
gc_start_time = Time.now
|
654
|
+
GC.enable
|
655
|
+
GC.start
|
656
|
+
GC.disable
|
657
|
+
logger.debug "GC end #{Time.now - gc_start_time}sec "
|
658
|
+
end
|
647
659
|
|
648
660
|
output_memory_statistics() if @statistics_process_memory # メモリ使用量統計
|
649
661
|
|
@@ -11,8 +11,8 @@ module DangoFrameworkModule
|
|
11
11
|
def initialize(config)
|
12
12
|
@config = config
|
13
13
|
@data = {}
|
14
|
-
|
15
|
-
@mutex = Mutex.new
|
14
|
+
@mutex = {}
|
15
|
+
# @mutex = Mutex.new
|
16
16
|
|
17
17
|
@transact_key = {}
|
18
18
|
@transact_thread = {}
|
@@ -66,8 +66,8 @@ module DangoFrameworkModule
|
|
66
66
|
raise(DangoFrameworkException, "Shared key is not exist.")
|
67
67
|
end
|
68
68
|
|
69
|
-
|
70
|
-
@mutex.synchronize do
|
69
|
+
@mutex[key].synchronize do
|
70
|
+
# @mutex.synchronize do
|
71
71
|
@transact_key[Thread.current] = key # 違うスレッドからcommitできないように
|
72
72
|
|
73
73
|
raise("nested transaction #{key}") if @transact_thread.has_key?(key)
|
@@ -148,8 +148,8 @@ module DangoFrameworkModule
|
|
148
148
|
# raise(DangoFrameworkException, "Shared key is not exist.")
|
149
149
|
end
|
150
150
|
|
151
|
-
|
152
|
-
@mutex.synchronize do
|
151
|
+
@mutex[key].synchronize do
|
152
|
+
# @mutex.synchronize do
|
153
153
|
@data[key].deep_dup
|
154
154
|
end
|
155
155
|
end
|
@@ -164,13 +164,13 @@ module DangoFrameworkModule
|
|
164
164
|
key = key.to_s
|
165
165
|
|
166
166
|
# 未定義なら定義する
|
167
|
-
|
168
|
-
|
169
|
-
|
167
|
+
if !@data.has_key?(key)
|
168
|
+
@mutex[key] = Mutex.new
|
169
|
+
end
|
170
170
|
|
171
171
|
# ロックしてデータを入れる
|
172
|
-
|
173
|
-
@mutex.synchronize do
|
172
|
+
@mutex[key].synchronize do
|
173
|
+
# @mutex.synchronize do
|
174
174
|
@data[key] = value.deep_dup
|
175
175
|
end
|
176
176
|
|
data/lib/dango/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dango
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keisuke Minami
|
@@ -30,7 +30,7 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.4.
|
33
|
+
version: 0.4.6
|
34
34
|
version:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: hoe
|