dango 0.0.30 → 0.0.31
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.
- data/lib/dango/client_framework.rb +25 -1
- data/lib/dango/server_framework.rb +65 -40
- data/lib/dango/version.rb +1 -1
- metadata +2 -2
@@ -80,9 +80,12 @@ class DangoClientFramework
|
|
80
80
|
|
81
81
|
@sock.binmode
|
82
82
|
@sock.sync = true
|
83
|
-
@tmutex = Mutex.new # sockの排他処理用
|
84
83
|
logger.debug("addr:#{@sock.addr.inspect}")
|
85
84
|
|
85
|
+
@tmutex = Mutex.new # sockの排他処理用
|
86
|
+
|
87
|
+
dango_heart_beat_thread_init() # ハートビート送信スレッドの起動
|
88
|
+
|
86
89
|
@sid = nil # 接続して決まるsidを保持
|
87
90
|
|
88
91
|
# データ受信用のスレッドの開始
|
@@ -143,6 +146,27 @@ class DangoClientFramework
|
|
143
146
|
end
|
144
147
|
private :thread_main
|
145
148
|
|
149
|
+
# ハートビート送信スレッドの起動
|
150
|
+
def dango_heart_beat_thread_init
|
151
|
+
th = Thread.start do
|
152
|
+
loop do
|
153
|
+
begin
|
154
|
+
sleep 10
|
155
|
+
|
156
|
+
if @sock && ! @sock.closed?
|
157
|
+
logger.debug "dango_heart_beat_thread_init:send heart beat #{Time.now_to_s}"
|
158
|
+
|
159
|
+
send_action("_notice_heart_beat", {})
|
160
|
+
end
|
161
|
+
|
162
|
+
rescue
|
163
|
+
logger.error "Exception dango_heart_beat_thread_init #{Time.now_to_s} #{error_message($!, 'u')}"
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
th.priority = 1
|
168
|
+
end
|
169
|
+
|
146
170
|
# 接続直後のsid通知なら
|
147
171
|
def dango_receive__notice_sid(rec_obj)
|
148
172
|
@sid = rec_obj["_sid"]
|
@@ -23,10 +23,11 @@ class DangoServerFramework
|
|
23
23
|
|
24
24
|
# ここから先は普通は変更しなくていいだろうというもの
|
25
25
|
SendReceiveSleepIntervalSec = 0.2 # データ送信時のタイムアウトチェック間隔秒
|
26
|
-
SendReceiveTimeoutDefaultSec =
|
27
|
-
SendTimeoutSec =
|
28
|
-
HeartBeatIntervalSec =
|
29
|
-
HeartBeatResponseWaitSec =
|
26
|
+
SendReceiveTimeoutDefaultSec = 5.0 # データ送受信時のデフォルトタイムアウト秒数
|
27
|
+
SendTimeoutSec = 4.0 # データ送受信時の送信のタイムアウト秒数
|
28
|
+
HeartBeatIntervalSec = 10.0 # S=>Cのheart beatの送信間隔秒数
|
29
|
+
HeartBeatResponseWaitSec = 10.0 # S=>Cのheart beatの返信待ち秒数
|
30
|
+
HeartBeatReceiveWaitSec = 20.0 # C=>Sのheart beatの受信待ち秒数
|
30
31
|
GCIntervalSec = 5.0 # GCの発生タイミング
|
31
32
|
|
32
33
|
|
@@ -267,7 +268,7 @@ class DangoServerFramework
|
|
267
268
|
@mutex_proc_thread.synchronize do
|
268
269
|
|
269
270
|
if action_name == '_response' # 送信パケットの返事なら
|
270
|
-
# logger.debug "action_name=#{action_name} #{Time.now_to_s}"
|
271
|
+
# logger.debug "action_name=#{action_name} #{ret_obj['_id']} #{Time.now_to_s}"
|
271
272
|
action_name_is_response(ret_obj)
|
272
273
|
|
273
274
|
elsif action_name[0, 9] == '_monitor_' # メンテナンスアクション名なら
|
@@ -334,7 +335,7 @@ class DangoServerFramework
|
|
334
335
|
|
335
336
|
# action_nameが送信パケットの返事なら
|
336
337
|
def action_name_is_response(ret_obj)
|
337
|
-
|
338
|
+
logger.debug "action_name_is_response: #{ret_obj['_id']} #{session[:sid]} #{Time.now_to_s}"
|
338
339
|
@mutex_send_response.synchronize do
|
339
340
|
@arr_send_response.push({:_id => ret_obj["_id"], :time => Time.now})
|
340
341
|
end
|
@@ -357,6 +358,7 @@ class DangoServerFramework
|
|
357
358
|
@send_timeout_sec = @config['server']['send_timeout_sec'] || SendTimeoutSec
|
358
359
|
@herat_beat_interval_sec = @config['server']['heart_beat_interval_sec'] || HeartBeatIntervalSec
|
359
360
|
@heart_beat_response_wait_sec = @config['server']['heart_beat_response_wait_sec'] || HeartBeatResponseWaitSec
|
361
|
+
@heart_beat_receive_wait_sec = @config['server']['heart_beat_receive_wait_sec'] || HeartBeatReceiveWaitSec
|
360
362
|
@gc_interval_sec = @config['server']['gc_interval_sec'] || GCIntervalSec
|
361
363
|
|
362
364
|
|
@@ -541,9 +543,32 @@ class DangoServerFramework
|
|
541
543
|
dango_server_receive_decrypt(str)
|
542
544
|
end
|
543
545
|
|
546
|
+
# GCスレッドの開始
|
547
|
+
def gc_thread_start
|
548
|
+
th = Thread.start do
|
549
|
+
loop do
|
550
|
+
begin
|
551
|
+
sleep @gc_interval_sec
|
552
|
+
|
553
|
+
gc_start_time = Time.now
|
554
|
+
GC.enable
|
555
|
+
GC.start
|
556
|
+
GC.disable
|
557
|
+
logger.debug "GC #{Time.now - gc_start_time}sec #{Time.now_to_s}"
|
558
|
+
|
559
|
+
rescue
|
560
|
+
logger.error "Exception gc_thread_start #{Time.now_to_s} #{error_message($!, 'u')}"
|
561
|
+
end
|
562
|
+
end
|
563
|
+
end
|
564
|
+
th.priority = -1
|
565
|
+
end
|
566
|
+
|
544
567
|
# ハートビートスレッドの開始
|
545
568
|
def heart_beat_thread_start
|
546
|
-
|
569
|
+
shared[:heart_beat_time_hash] = {}
|
570
|
+
|
571
|
+
th = Thread.start do
|
547
572
|
loop do
|
548
573
|
begin
|
549
574
|
sleep @herat_beat_interval_sec
|
@@ -551,13 +576,20 @@ class DangoServerFramework
|
|
551
576
|
if ! @gserver.stopped? # gserverが起動していれば
|
552
577
|
logger.debug "heart_beat_thread_start #{Time.now_to_s}"
|
553
578
|
|
579
|
+
# クライアントから来るハートビートのチェック
|
580
|
+
heart_beat_time_hash = shared[:heart_beat_time_hash]
|
581
|
+
|
554
582
|
# 全員へheart_beatパケットを送信
|
555
583
|
socket_list.keys.each do |sid|
|
556
|
-
|
584
|
+
sock = socket_list[sid]
|
557
585
|
# logger.debug "heart_beat_thread_start:sid=#{sid} #{sock} #{sock.closed?}"
|
558
|
-
#
|
559
|
-
|
560
|
-
|
586
|
+
# send_notice(sid, "_heart_beat", {}, {:timeout=>@heart_beat_response_wait_sec})
|
587
|
+
|
588
|
+
# クライアントから来たハートビートの時間チェック
|
589
|
+
if heart_beat_time_hash[sid] && heart_beat_time_hash[sid] < Time.now - @heart_beat_receive_wait_sec
|
590
|
+
logger.debug "heart_beat_thread_start:heart beat old #{heart_beat_time_hash[sid]} #{sock} #{sock.closed?}"
|
591
|
+
sock.close if !sock.closed?
|
592
|
+
end
|
561
593
|
end
|
562
594
|
end
|
563
595
|
|
@@ -566,25 +598,16 @@ class DangoServerFramework
|
|
566
598
|
end
|
567
599
|
end
|
568
600
|
end
|
601
|
+
th.priority = 1
|
569
602
|
end
|
570
603
|
|
571
|
-
#
|
572
|
-
def
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
gc_start_time = Time.now
|
579
|
-
GC.enable
|
580
|
-
GC.start
|
581
|
-
GC.disable
|
582
|
-
logger.debug "GC #{Time.now - gc_start_time}sec #{Time.now_to_s}"
|
583
|
-
|
584
|
-
rescue
|
585
|
-
logger.error "Exception gc_thread_start #{Time.now_to_s} #{error_message($!, 'u')}"
|
586
|
-
end
|
587
|
-
end
|
604
|
+
# クライアントから来たheart_beatなら
|
605
|
+
def dango_receive__notice_heart_beat(ret_obj)
|
606
|
+
logger.debug "dango_receive__notice_heart_beat:#{session[:sid]} #{Time.now_to_s}"
|
607
|
+
|
608
|
+
shared.transaction(:heart_beat_time_hash) do |heart_beat_time_hash|
|
609
|
+
heart_beat_time_hash[session[:sid]] = Time.now
|
610
|
+
heart_beat_time_hash
|
588
611
|
end
|
589
612
|
end
|
590
613
|
|
@@ -600,7 +623,7 @@ class DangoServerFramework
|
|
600
623
|
|
601
624
|
sock = socket_list[sid]
|
602
625
|
if !sock || sock.closed? # sockがないという事はすでに切断済み
|
603
|
-
logger.info "send_notice:already closed socket. sid=#{sid.inspect} sock=#{sock.inspect} #{Time.now_to_s}"
|
626
|
+
logger.info "send_notice:already closed socket. sid=#{sid.inspect} sock=#{sock.inspect} #{sock ? sock.closed? : nil} #{Time.now_to_s}"
|
604
627
|
return(self)
|
605
628
|
end
|
606
629
|
|
@@ -652,15 +675,7 @@ class DangoServerFramework
|
|
652
675
|
# タイムアウトチェック
|
653
676
|
catch(:send_timeout) do
|
654
677
|
(timeout.to_f / @send_receive_sleep_interval_sec).to_i.times do
|
655
|
-
|
656
|
-
logger.debug "send_notice:receive timeout:#{notice_name}"
|
657
|
-
|
658
|
-
if notice_name.to_s == "_heart_beat" # heart beatだったらsockを止める
|
659
|
-
logger.info "!!!! send_notice:heart_beat timeout"
|
660
|
-
sock.close if !sock.closed?
|
661
|
-
end
|
662
|
-
break
|
663
|
-
end
|
678
|
+
sleep @send_receive_sleep_interval_sec # スリープ
|
664
679
|
|
665
680
|
@mutex_send_response.synchronize do # データ送信の返信が来たかどうかの確認
|
666
681
|
find_res = @arr_send_response.find{|r| r[:_id] == send_obj_dup["_id"]}
|
@@ -674,7 +689,16 @@ class DangoServerFramework
|
|
674
689
|
end
|
675
690
|
end
|
676
691
|
|
677
|
-
|
692
|
+
if Time.now > end_reserved_time
|
693
|
+
logger.debug "send_notice:receive timeout:#{notice_name} #{sid} #{Time.now_to_s} #{end_reserved_time}"
|
694
|
+
|
695
|
+
if notice_name.to_s == "_heart_beat" # heart beatだったらsockを止める
|
696
|
+
logger.info "!!!! send_notice:heart_beat timeout"
|
697
|
+
sock.close if !sock.closed?
|
698
|
+
end
|
699
|
+
break
|
700
|
+
end
|
701
|
+
|
678
702
|
end # タイムアウト処理終わり
|
679
703
|
end # catch 終わり
|
680
704
|
|
@@ -721,7 +745,7 @@ class DangoServerFramework
|
|
721
745
|
wait_sec = 1.0 / options[:rate]
|
722
746
|
logger.debug "flameloop_thread wait_sec:#{wait_sec.inspect}"
|
723
747
|
|
724
|
-
Thread.new do
|
748
|
+
th = Thread.new do
|
725
749
|
loop do
|
726
750
|
@mutex_proc_thread.synchronize do
|
727
751
|
begin
|
@@ -733,6 +757,7 @@ class DangoServerFramework
|
|
733
757
|
sleep wait_sec
|
734
758
|
end
|
735
759
|
end
|
760
|
+
th.priority = 1
|
736
761
|
|
737
762
|
end
|
738
763
|
|
data/lib/dango/version.rb
CHANGED
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: dango
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2007-11-
|
6
|
+
version: 0.0.31
|
7
|
+
date: 2007-11-10 00:00:00 +09:00
|
8
8
|
summary: Realtime communications network framework for Ruby and Flash on Rails.
|
9
9
|
require_paths:
|
10
10
|
- lib
|