dango 0.0.36 → 0.0.37

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/LICENSE ADDED
@@ -0,0 +1,16 @@
1
+ Copyright (C) 2007 Keisuke Minami
2
+
3
+ This library is free software; you can redistribute it and/or
4
+ modify it under the terms of the GNU Lesser General Public
5
+ License as published by the Free Software Foundation; either
6
+ version 2.1 of the License, or (at your option) any later version.
7
+
8
+ This library is distributed in the hope that it will be useful,
9
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ Lesser General Public License for more details.
12
+
13
+ You should have received a copy of the GNU Lesser General Public
14
+ License along with this library; if not, write to the Free Software
15
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16
+
data/Manifest.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  Manifest.txt
2
2
  README.txt
3
- MIT-LICENSE
3
+ LICENSE
4
4
  lib/dango/client_framework.rb
5
5
  lib/dango/framework_base.rb
6
6
  lib/dango/server_framework.rb
@@ -162,7 +162,7 @@ module DangoFrameworkModule
162
162
  if size_str == "<polic"
163
163
  logger.debug "size_str=#{size_str.inspect}"
164
164
  receive_data = sock.recv(18)
165
- logger.debug "dango_receive_data:receive_data=#{receive_data}"
165
+ logger.info "flash policy file: dango_receive_data:receive_data=#{receive_data}"
166
166
  raise(DangoFrameworkFlashPolicyError)
167
167
  end
168
168
 
@@ -10,9 +10,8 @@
10
10
 
11
11
  require 'dango/client_framework' # コネクションサーバーフレームワークの呼び出し
12
12
 
13
- #
14
13
 
15
- # メインクラス
14
+ # モニター用のdangoクライアントクラス
16
15
  class DangoMonitorClient < DangoClientFramework
17
16
  ConnTimeout = 6
18
17
 
@@ -35,22 +34,42 @@ class DangoMonitorClient < DangoClientFramework
35
34
  # 読み込みのみ
36
35
  attr_reader(:is_session_closed)
37
36
 
38
- # サーバーの全情報取得
39
- def get_all_info
40
- logger.debug "DangoMonitorClient:get_all_info:#{ENV['RAILS_ROOT']}"
37
+ # 情報取得系の処理を整理したもの
38
+ def get_server_info_common(monitor_action_name)
39
+ logger.debug "DangoMonitorClient:#{monitor_action_name}:#{ENV['RAILS_ROOT']}"
41
40
  begin
42
- ret_obj = send_action_return_notice('_monitor_all_info', {})
41
+ ret_obj = send_action_return_notice("_monitor_#{monitor_action_name}", {})
43
42
  raise("code is not 0 (faild). :code=#{ret_obj['code']}") if ret_obj['code'] != 0
44
- return(ret_obj['all_info'])
43
+ return(ret_obj[monitor_action_name])
45
44
  rescue DangoFrameworkConnectionError
46
- raise("monitor_all_info Connection error")
45
+ raise("#{monitor_action_name} Connection error")
47
46
  rescue DangoFrameworkTimeoutError
48
- raise("monitor_all_info Timeout error")
47
+ raise("#{monitor_action_name} Timeout error")
49
48
  ensure
50
49
  dango_client_close
51
50
  end
52
51
  end
53
52
 
53
+ # サーバーの情報取得
54
+ def get_server_info
55
+ get_server_info_common("get_server_info")
56
+ end
57
+
58
+ # sharedの情報取得
59
+ def get_shared
60
+ get_server_info_common("get_shared")
61
+ end
62
+
63
+ # session_listの情報取得
64
+ def get_session_list
65
+ get_server_info_common("get_session_list")
66
+ end
67
+
68
+ # socket_listの情報取得
69
+ def get_socket_list
70
+ get_server_info_common("get_socket_list")
71
+ end
72
+
54
73
  # サーバーのデータリロード
55
74
  def server_reload
56
75
  logger.debug "DangoMonitorClient:server_reload"
@@ -26,8 +26,17 @@ class ServerMonitorAction
26
26
  if action_name == '_monitor_all_info' # メンテナンスアクション名なら
27
27
  dango_server_monitor_all_info(ret_obj)
28
28
 
29
- elsif action_name == '_monitor_server_reload' # メンテナンスアクション名なら
30
- dango_server_monitor_server_reload(ret_obj)
29
+ elsif action_name == '_monitor_get_server_info' # メンテナンスアクション名なら
30
+ dango_server_monitor_get_server_info(ret_obj)
31
+
32
+ elsif action_name == '_monitor_get_shared' # メンテナンスアクション名なら
33
+ dango_server_monitor_get_shared(ret_obj)
34
+
35
+ elsif action_name == '_monitor_get_session_list' # メンテナンスアクション名なら
36
+ dango_server_monitor_get_session_list(ret_obj)
37
+
38
+ elsif action_name == '_monitor_get_socket_list' # メンテナンスアクション名なら
39
+ dango_server_monitor_get_socket_list(ret_obj)
31
40
 
32
41
  elsif action_name == '_monitor_send_system_message' # メンテナンスアクション名なら
33
42
  dango_server_monitor_send_system_message(ret_obj)
@@ -68,13 +77,9 @@ class ServerMonitorAction
68
77
  end
69
78
 
70
79
  # メンテナンスコマンド:サーバーからクライアントへのデータ送信
71
- def dango_server_monitor_all_info(ret_obj)
72
- logger.debug "dango_server_monitor_all_info:#{ret_obj.inspect}"
73
- all_info = {
74
- 'shareds' => shared.to_hash,
75
- 'socket_list' => socket_list.keys,
76
- 'session_list' => session_list,
77
-
80
+ def dango_server_monitor_get_server_info(ret_obj)
81
+ logger.debug "dango_server_monitor_get_server_info:#{ret_obj.inspect}"
82
+ get_server_info = {
78
83
  'server_start_time' => @parent.start_time.strftime("%Y-%m-%d %H:%M:%S"),
79
84
  'up_time' => Time.now - @parent.start_time,
80
85
 
@@ -87,12 +92,31 @@ class ServerMonitorAction
87
92
  'log_file' => @parent.log_file,
88
93
  'log_max_size' => @parent.log_max_size,
89
94
  'log_shift_age' => @parent.log_shift_age,
90
-
91
- # 'dummy' => "dummy "*1000, # ダミー情報
92
95
  }
93
96
 
94
- send_obj = {'code'=>0, 'all_info'=>all_info}
95
- @parent.send_notice(session[:sid], 'return__monitor_all_info', send_obj, :type=>2)
97
+ send_obj = {'code'=>0, 'get_server_info'=>get_server_info}
98
+ @parent.send_notice(session[:sid], 'return__monitor_get_server_info', send_obj, :type=>2)
99
+ end
100
+
101
+ # メンテナンスコマンド:サーバーからクライアントへのデータ送信
102
+ def dango_server_monitor_get_shared(ret_obj)
103
+ logger.debug "dango_server_monitor_get_shared:#{ret_obj.inspect}"
104
+ send_obj = {'code'=>0, 'get_shared'=>shared.to_hash}
105
+ @parent.send_notice(session[:sid], 'return__monitor_get_shared', send_obj, :type=>2)
106
+ end
107
+
108
+ # メンテナンスコマンド:サーバーからクライアントへのデータ送信
109
+ def dango_server_monitor_get_session_list(ret_obj)
110
+ logger.debug "dango_server_monitor_get_session_list:#{ret_obj.inspect}"
111
+ send_obj = {'code'=>0, 'get_session_list'=>session_list}
112
+ @parent.send_notice(session[:sid], 'return__monitor_get_session_list', send_obj, :type=>2)
113
+ end
114
+
115
+ # メンテナンスコマンド:サーバーからクライアントへのデータ送信
116
+ def dango_server_monitor_get_socket_list(ret_obj)
117
+ logger.debug "dango_server_monitor_get_socket_list:#{ret_obj.inspect}"
118
+ send_obj = {'code'=>0, 'get_socket_list'=>socket_list.keys}
119
+ @parent.send_notice(session[:sid], 'return__monitor_get_socket_list', send_obj, :type=>2)
96
120
  end
97
121
 
98
122
  # メンテナンスコマンド:サーバーデータ再読み込み
@@ -36,6 +36,7 @@ class DangoServerFramework
36
36
  HeartBeatReceiveWaitSec = 30.0 # C=>Sのheart beatの受信待ち秒数
37
37
  GCIntervalSec = 5.0 # GCの発生タイミング
38
38
 
39
+ ServerStopWait = 0.2 # サーバー停止時のGServerの確認待ち時間
39
40
 
40
41
  class DangoGServer < GServer
41
42
  def initialize(parent, *args)
@@ -56,14 +57,37 @@ class DangoServerFramework
56
57
  end
57
58
 
58
59
  def starting()
60
+ log("#{self.class.to_s} #{@host}:#{@port} start")
59
61
  @parent.starting()
60
62
  end
61
63
 
62
64
  def stopping()
65
+ log("#{self.class.to_s} #{@host}:#{@port} stop")
63
66
  @parent.stopping()
64
67
  end
65
68
  end
66
69
 
70
+ def exit_process() # プロセス終了処理
71
+ # サーバーを停止
72
+ if @gserver && !@gserver.stopped?
73
+ @gserver.shutdown
74
+ @gserver.stop
75
+ # while(!@gserver.stopped?) do
76
+ # sleep ServerStopWait
77
+ # debug_print("waiting... #{@gserver.stopped?} #{@gserver.connections}")
78
+ # end
79
+ 10.times do
80
+ break if @gserver.stopped?
81
+ sleep ServerStopWait
82
+ debug_print("waiting... #{@gserver.stopped?} #{@gserver.connections}")
83
+ end
84
+ end
85
+
86
+ debug_print("shutdown")
87
+ puts "shutdown"
88
+ exit!
89
+ end
90
+
67
91
  def initialize(config)
68
92
  @config = config # 設定ファイル
69
93
 
@@ -72,18 +96,12 @@ class DangoServerFramework
72
96
 
73
97
  # SIGINT の捕捉
74
98
  Signal.trap(:INT) do
75
- # サーバーを停止
76
- if @gserver && !@gserver.stopped?
77
- @gserver.shutdown
78
- @gserver.stop
79
- while(!@gserver.stopped?) do
80
- sleep 1
81
- debug_print("waiting... #{@gserver.stopped?} #{@gserver.connections}")
82
- end
83
- end
84
-
85
- puts "shutdown"
86
- exit!
99
+ exit_process() # プロセス終了処理
100
+ end
101
+
102
+ # 終了処理を登録しておく(これが無いとWindowsではエラーが出てもプロセスが落ちないことがある)
103
+ at_exit do
104
+ exit_process() # プロセス終了処理
87
105
  end
88
106
 
89
107
  # サーバー開始
@@ -107,11 +125,11 @@ class DangoServerFramework
107
125
  def server_start()
108
126
  set_server_variables() # 各種サーバー仕様の変数設定
109
127
 
110
- logger.info("===== server initialize =====") # loggerの準備
111
- logger.info("Process.pid=#{Process.pid}")
112
- logger.info("port=#{@server_port}")
113
- logger.info("host=#{@server_host}")
114
- logger.info("max_connections=#{@server_max_connections}")
128
+ logger.warn("===== server initialize =====") # loggerの準備
129
+ logger.warn("Process.pid=#{Process.pid}")
130
+ logger.warn("port=#{@server_port}")
131
+ logger.warn("host=#{@server_host}")
132
+ logger.warn("max_connections=#{@server_max_connections}")
115
133
 
116
134
  open("tmp/pids/dango.pid", "wb"){|fh| fh.write Process.pid.to_s }
117
135
 
@@ -171,7 +189,7 @@ class DangoServerFramework
171
189
  @gserver.shutdown
172
190
  @gserver.stop
173
191
  while(!@gserver.stopped?) do
174
- sleep 1
192
+ sleep ServerStopWait
175
193
  debug_print("waiting... #{@gserver.stopped?} #{@gserver.connections}")
176
194
  end
177
195
 
@@ -270,7 +288,7 @@ class DangoServerFramework
270
288
  # メインループ入り
271
289
  loop do
272
290
  if sock.closed?
273
- logger.debug "#{sock.inspect}:sock is closed..."
291
+ logger.info "#{sock.inspect}:sock is closed..."
274
292
  break
275
293
  end
276
294
 
@@ -283,7 +301,7 @@ class DangoServerFramework
283
301
  end
284
302
 
285
303
  if is_flash_policy_file && @policy_file_request # Flashのポリシーファイルが来たら
286
- logger.debug "is_flash_policy_file #{sid} "
304
+ logger.info "is_flash_policy_file #{sid} "
287
305
  policy_data = '<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>' + "\0" + "\n"
288
306
  logger.debug policy_data
289
307
  sock.write policy_data
@@ -296,7 +314,7 @@ class DangoServerFramework
296
314
 
297
315
  else # 受信データがあれば
298
316
  if !(ret_obj && ret_obj["action"]) # actionが無い場合はエラー
299
- logger.error "no action error:#{ret_obj.inspect}"
317
+ logger.warn "no action error:#{ret_obj.inspect}"
300
318
  raise(DangoFrameworkError, "no action error")
301
319
  end
302
320
 
@@ -313,7 +331,7 @@ class DangoServerFramework
313
331
  ServerMonitorAction.new(self, @config, sock, ret_obj)
314
332
 
315
333
  else # メンテナンスコマンド以外のユーザーアクション名なら
316
- logger.debug "receive_action:#{sid}:#{action_name}:"
334
+ logger.info "receive_action:#{sid}:#{action_name}:"
317
335
  begin
318
336
  __send__("dango_receive_#{action_name}", ret_obj)
319
337
  rescue NoMethodError
@@ -328,10 +346,10 @@ class DangoServerFramework
328
346
  end # loop
329
347
 
330
348
  rescue DangoFrameworkFlashPolicyError
331
- logger.debug "Flash policy file send. #{sid} "
349
+ logger.info "Flash policy file send. #{sid} "
332
350
 
333
351
  rescue DangoFrameworkMonitorSecurityError
334
- logger.debug "Monitor Security Error #{sid} "
352
+ logger.warn "Monitor Security Error #{sid} "
335
353
 
336
354
  rescue DangoFrameworkReadNoDataError
337
355
  @recv_fail_count += 1 if @recv_fail_count # 受信失敗回数カウント
@@ -351,10 +369,10 @@ class DangoServerFramework
351
369
  logger.error "Exception #{sid} #{error_message($!, 'u')}"
352
370
 
353
371
  ensure
354
- logger.info "#{sock.inspect} #{sid} is closing"
355
372
 
356
373
  @mutex_proc_thread.synchronize do
357
374
  begin
375
+ logger.info "#{sock.inspect} #{sid} is closing"
358
376
  dango_close() # 接続解除時に呼び出されるメソッド
359
377
  rescue Exception
360
378
  logger.error "#{sock.inspect} #{sid} ERROR\n#{error_message($!, 'u')}"
@@ -363,15 +381,15 @@ class DangoServerFramework
363
381
  begin
364
382
  sock.close if !sock.closed? # ソケットを閉じる
365
383
  rescue IOError
366
- logger.debug "IOError #{sock} #{sid}"
384
+ logger.error "IOError #{sock} #{sid}"
367
385
  end
368
386
 
369
387
  logger.info "#{sock.inspect} #{sid} is closed"
388
+
389
+ session_del()
370
390
  end
371
-
372
391
  end
373
392
 
374
- session_del()
375
393
  end
376
394
  end
377
395
 
@@ -426,10 +444,10 @@ class DangoServerFramework
426
444
 
427
445
 
428
446
  @start_time = Time.now # サーバー起動時間
429
- @recv_count = 0 # 受信回数
430
- @send_count = 0 # 送信回数
431
- @recv_fail_count = 0 # 受信失敗回数
432
- @send_fail_count = 0 # 送信失敗回数
447
+ @recv_count = 0 # 受信回数
448
+ @send_count = 0 # 送信回数
449
+ @recv_fail_count = 0 # 受信失敗回数
450
+ @send_fail_count = 0 # 送信失敗回数
433
451
  end
434
452
 
435
453
  attr_reader(:start_time, :recv_count, :send_count, :recv_fail_count, :send_fail_count)
@@ -541,11 +559,13 @@ class DangoServerFramework
541
559
  # セッション
542
560
  def session_init # セッション情報の初期化
543
561
  @session_list = {}
562
+ @session_th_list = {}
544
563
  end
545
564
  def session
546
565
  if !Thread.current[:session]
547
566
  Thread.current[:session] = {}
548
567
  @session_list[Thread.current.object_id] = Thread.current[:session]
568
+ @session_th_list[Thread.current.object_id] = Thread.current
549
569
  end
550
570
  Thread.current[:session]
551
571
  # sid = Thread.current.object_id
@@ -554,9 +574,11 @@ class DangoServerFramework
554
574
  end
555
575
  def session_del # セッション情報の初期化
556
576
  @session_list.delete(Thread.current.object_id)
577
+ @session_th_list.delete(Thread.current)
557
578
  end
558
579
 
559
580
  attr_reader(:session_list)
581
+ attr_reader(:session_th_list)
560
582
 
561
583
  # ソケットとIDの対応
562
584
  def socket_list_init
@@ -602,14 +624,16 @@ class DangoServerFramework
602
624
  begin
603
625
  sleep @gc_interval_sec
604
626
 
627
+ Thread.critical = true
605
628
  logger.debug "GC start "
606
629
  gc_start_time = Time.now
607
630
  GC.enable
608
631
  GC.start
609
632
  GC.disable
610
633
  logger.debug "GC end #{Time.now - gc_start_time}sec "
634
+ Thread.critical = false
611
635
 
612
- rescue
636
+ rescue Exception
613
637
  logger.error "Exception gc_thread_start #{error_message($!, 'u')}"
614
638
  end
615
639
  end
@@ -619,7 +643,7 @@ class DangoServerFramework
619
643
 
620
644
  # ハートビートスレッドの開始
621
645
  def heart_beat_thread_start
622
- shared[:heart_beat_time_hash] = {}
646
+ shared[:_heart_beat_time_hash] = {}
623
647
 
624
648
  th = Thread.start do
625
649
  loop do
@@ -630,7 +654,7 @@ class DangoServerFramework
630
654
  logger.debug "heart_beat_thread_start "
631
655
 
632
656
  # クライアントから来るハートビートのチェック
633
- heart_beat_time_hash = shared[:heart_beat_time_hash]
657
+ heart_beat_time_hash = shared[:_heart_beat_time_hash]
634
658
 
635
659
  # 全員へheart_beatパケットを送信
636
660
  socket_list.keys.each do |sid|
@@ -638,15 +662,17 @@ class DangoServerFramework
638
662
  # logger.debug "heart_beat_thread_start:sid=#{sid} #{sock} #{sock.closed?}"
639
663
  # send_notice(sid, "_heart_beat", {}, {:timeout=>@heart_beat_response_wait_sec})
640
664
 
641
- # クライアントから来たハートビートの時間チェック
665
+ # クライアントから来たハートビートの時間チェックし、古ければsocketを閉じて、threadを殺す
642
666
  if heart_beat_time_hash[sid] && heart_beat_time_hash[sid] < Time.now - @heart_beat_receive_wait_sec
643
- logger.debug "!!!! heart_beat_thread_start:heart beat old:#{sid}:#{heart_beat_time_hash[sid]}:#{sock}:#{sock.closed?}"
667
+ logger.warn "!!!! heart_beat_thread_start:heart beat old:#{sid}:#{heart_beat_time_hash[sid]}:#{sock}:#{sock.closed?}"
644
668
  sock.close if !sock.closed?
669
+ logger.warn "!!!! heart_beat_thread_start:thread kill:#{session_th_list[sid]}"
670
+ session_th_list[sid].kill
645
671
  end
646
672
  end
647
673
  end
648
674
 
649
- rescue
675
+ rescue Exception
650
676
  logger.error "Exception heart_beat_thread_start #{error_message($!, 'u')}"
651
677
  end
652
678
  end
@@ -658,7 +684,7 @@ class DangoServerFramework
658
684
  def dango_receive__notice_heart_beat(ret_obj)
659
685
  logger.debug "dango_receive__notice_heart_beat:#{session[:sid]}:#{ret_obj['_hb_id']} "
660
686
 
661
- shared.transaction(:heart_beat_time_hash) do |heart_beat_time_hash|
687
+ shared.transaction(:_heart_beat_time_hash) do |heart_beat_time_hash|
662
688
  heart_beat_time_hash[session[:sid]] = Time.now
663
689
  heart_beat_time_hash
664
690
  end
@@ -666,7 +692,7 @@ class DangoServerFramework
666
692
 
667
693
  # サーバーからクライアントへのデータ送信
668
694
  def send_notice(sid, notice_name, send_obj, options = {})
669
- logger.debug "send_notice(#{sid.inspect}, #{notice_name.inspect}) "
695
+ logger.info "send_notice(#{sid.inspect}, #{notice_name.inspect}) "
670
696
  # logger.debug "send_notice(#{sid.inspect}, #{notice_name.inspect}, #{send_obj.inspect}, #{options.inspect})"
671
697
 
672
698
  raise(DangoFrameworkError, "send_obj is not Hash.") if ! send_obj.is_a?(Hash)
@@ -711,9 +737,11 @@ class DangoServerFramework
711
737
  dango_send_data(sock, send_obj_dup, :type=>dtype) # データ送信
712
738
  # logger.debug "send_notice:sent:notice_name=#{send_obj_dup['_id']} #{notice_name.inspect} #{sid} "
713
739
  rescue DangoFrameworkConnectionError
714
- logger.debug "send_notice:DangoFrameworkConnectionError:notice_name=#{notice_name.inspect} #{sid} "
740
+ logger.warn "send_notice:DangoFrameworkConnectionError:notice_name=#{notice_name.inspect} #{sid} "
715
741
  rescue DangoFrameworkError
716
- logger.debug "ERROR:send_notice:DangoFrameworkError:notice_name=#{notice_name.inspect} #{sid} \n #{error_message($!, 'u')}"
742
+ logger.warn "ERROR:send_notice:DangoFrameworkError:notice_name=#{notice_name.inspect} #{sid} \n #{error_message($!, 'u')}"
743
+ rescue Exception
744
+ logger.warn "ERROR:send_notice:Exception:notice_name=#{notice_name.inspect} #{sid} \n #{error_message($!, 'u')}"
717
745
  end
718
746
  end
719
747
 
@@ -745,10 +773,10 @@ class DangoServerFramework
745
773
  if Time.now > end_reserved_time
746
774
  logger.debug "send_notice:receive timeout:#{notice_name} #{sid} #{end_reserved_time}"
747
775
 
748
- if notice_name.to_s == "_heart_beat" # heart beatだったらsockを止める
749
- logger.info "!!!! send_notice:heart_beat timeout"
750
- sock.close if !sock.closed?
751
- end
776
+ # if notice_name.to_s == "_heart_beat" # heart beatだったらsockを止める
777
+ # logger.info "!!!! send_notice:heart_beat timeout"
778
+ # sock.close if !sock.closed?
779
+ # end
752
780
  break
753
781
  end
754
782
 
@@ -760,8 +788,8 @@ class DangoServerFramework
760
788
  end
761
789
  end
762
790
  end # mutex
763
- rescue
764
- logger.debug "send_response_thread error:#{error_message($!, 'u')}"
791
+ rescue Exception
792
+ logger.error "send_response_thread error:#{error_message($!, 'u')}"
765
793
  end
766
794
  end # Thread:end
767
795
 
@@ -776,7 +804,7 @@ class DangoServerFramework
776
804
  key = $1
777
805
  method_action_notice_shared(key, name, *args)
778
806
  else
779
- logger.info "method not found. #{name.inspect} #{args.inspect}"
807
+ logger.error "method not found. #{name.inspect} #{args.inspect}"
780
808
  raise(NameError, "method not found. #{name.inspect} #{args.inspect}")
781
809
  end
782
810
  end
@@ -790,21 +818,21 @@ class DangoServerFramework
790
818
 
791
819
  # メインループ用の定義をするためのメソッド
792
820
  def flameloop_thread(loop_method, options={})
793
- logger.debug "flameloop_thread options:#{options.inspect}"
821
+ logger.warn "flameloop_thread options:#{options.inspect}"
794
822
 
795
823
  options = options.deep_dup
796
824
  options[:rate] ||= 10
797
825
 
798
826
  wait_sec = 1.0 / options[:rate]
799
- logger.debug "flameloop_thread wait_sec:#{wait_sec.inspect}"
827
+ logger.warn "flameloop_thread wait_sec:#{wait_sec.inspect}"
800
828
 
801
829
  th = Thread.new do
802
830
  loop do
803
831
  @mutex_proc_thread.synchronize do
804
832
  begin
805
833
  __send__(loop_method)
806
- rescue
807
- logger.debug "flameloop_thread error:#{error_message($!, 'u')}"
834
+ rescue Exception
835
+ logger.error "flameloop_thread error:#{error_message($!, 'u')}"
808
836
  end
809
837
  end
810
838
  sleep wait_sec
data/lib/dango/version.rb CHANGED
@@ -2,7 +2,7 @@ module Dango #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
- TINY = 36
5
+ TINY = 37
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
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.36
7
- date: 2007-11-20 00:00:00 +09:00
6
+ version: 0.0.37
7
+ date: 2007-11-28 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
@@ -31,7 +31,7 @@ authors:
31
31
  files:
32
32
  - Manifest.txt
33
33
  - README.txt
34
- - MIT-LICENSE
34
+ - LICENSE
35
35
  - lib/dango/client_framework.rb
36
36
  - lib/dango/framework_base.rb
37
37
  - lib/dango/server_framework.rb
data/MIT-LICENSE DELETED
@@ -1,21 +0,0 @@
1
- Copyright (c) 2007 Keisuke Minami
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
10
-
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
13
-
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
-