dango 0.0.15 → 0.0.18

Sign up to get free protection for your applications and to get access to all the features.
@@ -71,6 +71,7 @@ class DangoClientFramework
71
71
 
72
72
  # ソケットの準備
73
73
  @sock = nil
74
+ @is_close = false
74
75
 
75
76
  # サーバーへ接続
76
77
  begin
@@ -116,19 +117,19 @@ class DangoClientFramework
116
117
  end
117
118
 
118
119
  # メソッド呼び出し
119
- cs_logger.info "calling method=#{ret_obj["notice"].inspect} #{@sid}"
120
+ cs_logger.info "calling method=#{ret_obj["notice"].inspect} #{@sid} #{Time.now_to_s}"
120
121
  begin
121
122
  __send__("cs_receive_#{ret_obj["notice"]}", ret_obj)
122
123
  rescue
123
- cs_logger.error "error in cs_receive_#{ret_obj["notice"]} #{@sid}\n#{error_message($!, 'u')}"
124
+ cs_logger.error "error in cs_receive_#{ret_obj["notice"]} #{@sid} #{Time.now_to_s}\n#{error_message($!, 'u')}"
124
125
  ensure
125
126
  # データの受信の送信返し
126
127
  response_notice_name = "_response"
127
128
  send_obj = {"_id" => ret_obj["_id"]}
128
129
  cs_client_send_data(response_notice_name, send_obj)
129
- cs_logger.debug "response_notice_name=#{response_notice_name.inspect} #{@sid}"
130
+ cs_logger.debug "response_notice_name=#{response_notice_name.inspect} #{@sid} #{Time.now_to_s}"
130
131
  end
131
- cs_logger.debug "called method=#{ret_obj["notice"].inspect} #{@sid}"
132
+ cs_logger.debug "called method=#{ret_obj["notice"].inspect} #{@sid} #{Time.now_to_s}"
132
133
 
133
134
  else
134
135
  sleep 0.01
@@ -160,16 +161,20 @@ class DangoClientFramework
160
161
 
161
162
  # クライアントの終了処理
162
163
  def client_quit()
163
- begin
164
- @sock.close if @sock
165
- rescue
166
- cs_logger.debug "sock close failed. #{$!}"
164
+ if ! @is_close
165
+ begin
166
+ @sock.close if @sock
167
+ rescue
168
+ cs_logger.debug "sock close failed. #{$!}"
169
+ end
170
+ @sock = nil
171
+
172
+ @is_session_closed = true
173
+ cs_logger.info "calling cs_session_closed()"
174
+ cs_session_closed() # セッションが切れると呼ばれる処理
175
+
176
+ @is_close = true
167
177
  end
168
- @sock = nil
169
-
170
- @is_session_closed = true
171
- cs_logger.info "calling cs_session_closed()"
172
- cs_session_closed() # セッションが切れると呼ばれる処理
173
178
  end
174
179
  private :client_quit
175
180
 
@@ -17,7 +17,7 @@ class DangoServerFramework
17
17
  include DangoFrameworkModule
18
18
 
19
19
  SendReceiveSleepIntervalSec = 0.1 # データ送信後の順の際のタイムアウトチェック間隔秒
20
- SendReceiveTimeoutDefaultSec = 0.5 # データ送受信時のデフォルトタイムアウト秒数
20
+ SendReceiveTimeoutDefaultSec = 2.0 # データ送受信時のデフォルトタイムアウト秒数
21
21
  SendTimeoutSec = 10.0 # データ送受信時の送信のタイムアウト秒数
22
22
 
23
23
  class DangoGServer < GServer
@@ -73,6 +73,7 @@ class DangoServerFramework
73
73
  set_server_variables() # 各種サーバー仕様の変数設定
74
74
 
75
75
  cs_logger.debug("===== server initialize =====") # loggerの準備
76
+ cs_logger.debug("#{Time.now_to_s}")
76
77
  cs_logger.debug("Process.pid=#{Process.pid}")
77
78
  cs_logger.debug("port=#{@connection_server_port}")
78
79
  cs_logger.debug("host=#{@connection_server_host}")
@@ -171,7 +172,7 @@ class DangoServerFramework
171
172
 
172
173
  # gserver接続開始処理
173
174
  def disconnecting(port)
174
- cs_logger.debug "disconnecting:port=#{port}"
175
+ cs_logger.debug "disconnecting:port=#{port} #{Time.now_to_s}"
175
176
  end
176
177
 
177
178
  # gserverのserveメソッド:スレッド開始処理
@@ -197,6 +198,11 @@ class DangoServerFramework
197
198
  cs_logger.debug "_notice_sid #{sid} #{Time.now_to_s}"
198
199
  # end
199
200
 
201
+ # 誰かが接続したときに60秒以上経った@arr_send_responseを削除
202
+ @mutex_send_response.synchronize do
203
+ @arr_send_response.delete_if{|r| r[:time] < Time.now - 60}
204
+ end
205
+
200
206
  # メインループ入り
201
207
  loop do
202
208
  if sock.closed?
@@ -258,7 +264,8 @@ class DangoServerFramework
258
264
 
259
265
  end # @mutex_proc_thread.synchronize
260
266
  end
261
- end
267
+
268
+ end # loop
262
269
 
263
270
  rescue DangoFrameworkReadNoDataError
264
271
  cs_logger.debug "read no data. maybe client closed. #{Thread.current.object_id} #{Time.now_to_s}"
@@ -294,8 +301,9 @@ class DangoServerFramework
294
301
 
295
302
  # action_nameが送信パケットの返事なら
296
303
  def action_name_is_response(ret_obj)
304
+ # cs_logger.warn "action_name_is_response:#{ret_obj['_id']} #{session[:sid]} #{Time.now_to_s}"
297
305
  @mutex_send_response.synchronize do
298
- @arr_send_response.push(ret_obj["_id"])
306
+ @arr_send_response.push({:_id => ret_obj["_id"], :time => Time.now})
299
307
  end
300
308
  end
301
309
 
@@ -489,12 +497,11 @@ class DangoServerFramework
489
497
 
490
498
  sock = socket_list[sid]
491
499
  raise(DangoFrameworkError, "not found sid=#{sid}") if !sock
492
- raise(DangoFrameworkConnectionError, "socket closed. s_id=#{sid}") if sock.closed?
500
+ raise(DangoFrameworkConnectionError, "socket closed. sid=#{sid}") if sock.closed?
493
501
 
494
502
  # cs_logger.debug "cs_server_send_data:sending data notice_name=#{notice_name.inspect}"
495
503
  send_obj_dup = send_obj.deep_dup
496
504
  send_obj_dup["notice"] = notice_name.to_s
497
- send_obj_dup["_id"] = Digest::MD5.hexdigest(sid.to_s + Time.now.to_i.to_s)
498
505
 
499
506
  # データ送信時にクライアントからのレスポンスを確認する(Flashのバグらしきもの対策)
500
507
  # if notice_name.to_s =~ /^return_/
@@ -508,13 +515,16 @@ class DangoServerFramework
508
515
  Thread.start do
509
516
  begin
510
517
  mutex_socket_list.synchronize(sid) do
511
- cs_logger.warn "mutex_socket_list:synchronize:#{notice_name} #{sid} #{Time.now_to_s}"
518
+ # cs_logger.debug "mutex_socket_list:synchronize:#{notice_name} #{sid} #{Time.now_to_s}"
519
+
520
+ digest_key = sid.to_s + notice_name.to_s + Time.now.to_f.to_s + rand().to_s
521
+ send_obj_dup["_id"] = Digest::MD5.hexdigest(digest_key)
512
522
  have_came_response = nil
513
523
 
514
524
  receive_thread = Thread.start do
515
525
  begin
516
526
  cs_send_data(sock, send_obj_dup, :type=>dtype) # データ送信
517
- cs_logger.debug "cs_server_send_data:sent:notice_name=#{notice_name.inspect} #{sid} #{Time.now_to_s}"
527
+ # cs_logger.debug "cs_server_send_data:sent:notice_name=#{send_obj_dup['_id']} #{notice_name.inspect} #{sid} #{Time.now_to_s}"
518
528
  rescue DangoFrameworkError
519
529
  cs_logger.debug "ERROR:cs_server_send_data:DangoFrameworkError:notice_name=#{notice_name.inspect} #{sid} #{Time.now_to_s}"
520
530
  end
@@ -525,6 +535,7 @@ class DangoServerFramework
525
535
  # タイムアウトの場合は
526
536
  cs_logger.warn "cs_server_send_data:send timeout:#{notice_name} #{sid} #{Time.now_to_s}"
527
537
  else
538
+ # cs_logger.warn "cs_server_send_data:sent after join:#{notice_name} #{sid} #{Time.now_to_s}"
528
539
  end_reserved_time = Time.now + timeout
529
540
 
530
541
  # タイムアウトチェック
@@ -536,9 +547,11 @@ class DangoServerFramework
536
547
  end
537
548
 
538
549
  @mutex_send_response.synchronize do
539
- if @arr_send_response.delete(send_obj_dup["_id"])
550
+ find_res = @arr_send_response.find{|r| r[:_id] == send_obj_dup["_id"]}
551
+
552
+ if find_res
553
+ @arr_send_response.delete(find_res)
540
554
  have_came_response = true
541
- # cs_logger.debug "response check ok:#{notice_name} #{sid} #{Time.now_to_s}"
542
555
  throw(:send_timeout)
543
556
  end
544
557
  end
@@ -551,7 +564,7 @@ class DangoServerFramework
551
564
  cs_logger.warn "!!! received data is none:#{notice_name} #{sid} #{Time.now_to_s}"
552
565
  end
553
566
  end
554
- end
567
+ end # mutex
555
568
  rescue
556
569
  cs_logger.debug "send_response_thread error:#{error_message($!, 'u')}"
557
570
  end
@@ -633,7 +646,8 @@ class DangoServerFramework
633
646
  key = $1
634
647
  method_action_notice_shared(key, name, *args)
635
648
  else
636
- # raise(NameError, "method not found. #{name.inspect} #{args.inspect}")
649
+ cs_logger.info "method not found. #{name.inspect} #{args.inspect}"
650
+ raise(NameError, "method not found. #{name.inspect} #{args.inspect}")
637
651
  end
638
652
  end
639
653
 
@@ -4,10 +4,59 @@ ENV['RAILS_ENV'] = ENV['RAILS_ENV'] || 'development'
4
4
  namespace :dango do
5
5
  desc "initialize dango"
6
6
  task :initialize do
7
+ puts "complete initialize."
7
8
  end
8
9
 
9
10
  desc "make swf"
10
11
  task :make_swf do
12
+ puts "complete make_swf."
13
+ end
14
+
15
+ desc "check dango process"
16
+ task :check_dango_process do
17
+ # pidのチェック
18
+ pid = open("tmp/pids/dango.pid", "rb"){|fh| fh.read }.to_i
19
+ puts "pid=#{pid}"
20
+
21
+ # そのpidのプロセスがあるかのチェック
22
+ is_pid_exist = nil
23
+ if RUBY_PLATFORM == 'i386-mswin32'
24
+ # WbemからProcessIDを取得
25
+ require "win32ole"
26
+ begin
27
+ n_locator = WIN32OLE.new("WbemScripting.SWbemLocator.1")
28
+ n_service = n_locator.ConnectServer
29
+ rescue
30
+ puts "failed connect to Wbem:#{$!.inspect}"
31
+ return
32
+ end
33
+
34
+ set = n_service.ExecQuery("select Caption, ProcessID from Win32_Process")
35
+ set.each do |one|
36
+ # puts(sprintf("Win32_Process %8d %s", one.ProcessID, one.Caption))
37
+ if one.ProcessID == pid
38
+ is_pid_exist = true
39
+ end
40
+ end
41
+ else
42
+ is_pid_exist = FileTest.exist?("/proc/#{pid}")
43
+ end
44
+
45
+ puts "is_pid_exist=#{is_pid_exist}"
46
+
47
+ # コンフィグから check_dango_process_cmd を取得
48
+ config = YAML.load(open("dango/config/#{ENV['RAILS_ENV']}.yml", "rb"){|fh| fh.read})
49
+ check_dango_process_cmd = config['server']['check_dango_process_cmd'] || nil
50
+
51
+ # is_pid_existがないならcheck_dango_process_cmd実行
52
+ if ! is_pid_exist && check_dango_process_cmd
53
+ puts "check_dango_process_cmd=#{check_dango_process_cmd}"
54
+ system(check_dango_process_cmd)
55
+ end
56
+
57
+ check_dango_process_cmd
58
+
59
+ puts "complete check_dango_process."
11
60
  end
12
61
 
13
62
  namespace :monitor do
@@ -56,7 +105,7 @@ namespace :dango do
56
105
  p $!.message
57
106
  p $!.backtrace
58
107
  end
59
- puts "complete server_reload."
108
+ puts "complete send_system_message."
60
109
  end
61
110
 
62
111
  end
@@ -39,11 +39,22 @@ class DangoTesterClient
39
39
  end
40
40
 
41
41
  attr_reader(:client_conns)
42
+
43
+ def die(str)
44
+ puts "============ die ============ #{Time.now_to_s}"
45
+ pp caller()
46
+ puts str
47
+ exit 1
48
+ end
49
+
50
+ def self.die(str)
51
+ die(str)
52
+ end
42
53
  end
43
54
 
44
55
  # テスト接続用のクラス
45
56
  class TestClient < DangoClientFramework
46
- SendReceiveSleepIntervalSec = 0.001 # データ送信後の順の際のタイムアウトチェック間隔秒
57
+ SendReceiveSleepIntervalSec = 0.03 # データ送信後の順の際のタイムアウトチェック間隔秒
47
58
  ReceiveWaitTimeoutSec = 10 # データ受信確認の待ち秒数
48
59
  ReceiveTrapTimeoutSec = 0 # データ受信確認のトラップの秒数
49
60
 
@@ -55,6 +66,7 @@ class TestClient < DangoClientFramework
55
66
 
56
67
  @receive_mutex = Mutex.new # 送受信用の排他処理
57
68
  @receive_arr = []
69
+ @trap_thread_hash = {}
58
70
 
59
71
  @receive_methods = []
60
72
 
@@ -86,99 +98,115 @@ class TestClient < DangoClientFramework
86
98
  cs_client_send_data(name, send_obj)
87
99
  end
88
100
 
89
- # trap_receive_data
90
- def trap_receive_data(receive_name, options = {})
101
+ # trap_receive
102
+ def trap_receive(receive_name, options = {})
91
103
  cs_logger.debug "trap_receive_data:#{receive_name}:#{Time.now_to_s}"
92
104
  timeout = options[:timeout] || ReceiveTrapTimeoutSec
93
105
  trap_proc = options[:proc] || nil
94
106
  raise(ArgumentError, ":proc is not Proc class.") if trap_proc && ! trap_proc.is_a?(Proc)
95
107
 
96
- cs_logger.debug "trap_receive_data:trap_proc:#{trap_proc.inspect}"
108
+ # 戻ってきたデータのチェックメソッド
109
+ receive_name_sym = (receive_name.class == Symbol) ? (":"+receive_name.to_s) : ('"'+receive_name+'"')
97
110
 
98
- Thread.start do
99
- send_receive_shared[receive_name] = nil
100
- if timeout == 0
101
- end_reserved_time = Time.at(0) # 0ならepochを入れる
102
- else
103
- end_reserved_time = Time.now + timeout # 0以上ならタイムアウト時間決定
104
- end
105
-
106
- # 戻ってきたデータのチェックメソッド
107
- receive_name_sym = (receive_name.class == Symbol) ? (":"+receive_name.to_s) : ('"'+receive_name+'"')
108
-
109
- if ! @receive_methods.include?(receive_name_sym)
110
- instance_method_name = "cs_receive_#{receive_name}"
111
- expr = <<-EOF
112
- def self.#{instance_method_name}(ret_obj)
113
- cs_logger.debug "ret_obj:" + ret_obj.inspect
114
- send_receive_shared[#{receive_name_sym}] = ret_obj
115
- end
116
- EOF
117
- instance_eval expr
118
- @receive_methods.push(receive_name_sym)
119
- end
111
+ if ! @receive_methods.include?(receive_name_sym)
112
+ instance_method_name = "cs_receive_#{receive_name}"
113
+ expr = <<-EOF
114
+ def self.#{instance_method_name}(ret_obj)
115
+ cs_logger.debug "ret_obj:" + ret_obj.inspect + " " + Time.now_to_s
116
+ send_receive_shared[#{receive_name_sym}] = ret_obj
117
+ end
118
+ EOF
119
+ instance_eval expr
120
+ @receive_methods.push(receive_name_sym)
121
+ end
122
+
123
+ # @trap_thread_hashにスレッド登録
124
+ if ! @trap_thread_hash.has_key?(receive_name)
120
125
 
121
- # タイムアウトチェック
122
- cs_logger.debug "trap_receive_data:666:#{end_reserved_time}"
123
- loop do
124
- # (timeout.to_f / SendReceiveSleepIntervalSec).to_i.times do
125
- # if end_reserved_time < Time.now
126
+ # スレッド開始
127
+ th = Thread.start do
128
+ send_receive_shared[receive_name] = nil
129
+ if timeout == 0
130
+ end_reserved_time = Time.at(0) # 0ならepochを入れる
131
+ else
132
+ end_reserved_time = Time.now + timeout # 0以上ならタイムアウト時間決定
133
+ end
126
134
 
127
- if end_reserved_time != Time.at(0) && end_reserved_time < Time.now
128
- raise(DangoFrameworkTimeoutError, "timeout:client_name=#{@client_name}:receive_name=#{receive_name} #{Time.now_to_s}")
135
+ # タイムアウトチェック
136
+ loop do
137
+ if end_reserved_time != Time.at(0) && end_reserved_time < Time.now
138
+ raise(DangoFrameworkTimeoutError, "timeout:timeout_sec=#{timeout}:\nclient_name=#{@client_name}(#{self.sid}):\nreceive_name=#{receive_name} \n#{Time.now_to_s}")
139
+ end
140
+
141
+ # 戻ってきたデータがあれば
142
+ if send_receive_shared[receive_name]
143
+ cs_logger.debug "receive_name:#{send_receive_shared[receive_name].inspect} #{Time.now_to_s}"
144
+ break
145
+ end
146
+
147
+ sleep SendReceiveSleepIntervalSec # スリープ
129
148
  end
130
149
 
131
- # 戻ってきたデータがあれば
132
- if send_receive_shared[receive_name]
133
- cs_logger.debug "receive_name:#{send_receive_shared[receive_name].inspect}"
134
- break
150
+ # 戻ってきたデータがあるかどうかチェック
151
+ if !send_receive_shared[receive_name]
152
+ raise(DangoFrameworkError, "received data is none. sid=#{sid} receive_name=#{receive_name}")
135
153
  end
136
154
 
137
- sleep SendReceiveSleepIntervalSec # スリープ
138
- end
155
+ # :procが設定されている場合は、それを呼び出す
156
+ if trap_proc
157
+ cs_logger.debug "trap_receive_data:trap_proc:#{trap_proc.inspect} #{Time.now_to_s}"
158
+ trap_proc.call(send_receive_shared[receive_name])
159
+
160
+ # :procが設定されていなければ、wait用に@receive_arrに入れておく
161
+ else
162
+ @receive_mutex.synchronize do
163
+ cs_logger.debug "receive_name:#{receive_name}:#{send_receive_shared[receive_name].inspect} #{Time.now_to_s}"
164
+ @receive_arr.push([receive_name, send_receive_shared[receive_name]])
165
+ end
166
+ end
167
+ end # Thread
139
168
 
140
- cs_logger.debug "trap_receive_data:555"
141
- # 戻ってきたデータがあるかどうかチェック
142
- if !send_receive_shared[receive_name]
143
- raise(DangoFrameworkError, "received data is none. sid=#{sid} receive_name=#{receive_name}")
144
- end
169
+ @trap_thread_hash[receive_name] = th
170
+ else
145
171
 
146
- # :procが設定されている場合は、それを呼び出す
147
- cs_logger.debug "trap_receive_data:222:#{receive_name}:#{trap_proc.inspect}"
148
- if trap_proc
149
- cs_logger.debug "trap_receive_data:333:#{receive_name}"
150
- cs_logger.debug "trap_receive_data:trap_proc is true:#{trap_proc.inspect}"
151
- trap_proc.call(send_receive_shared[receive_name])
152
-
153
- # :procが設定されていなければ、wait用に@receive_arrに入れておく
154
- else
155
- cs_logger.debug "trap_receive_data:444"
156
- @receive_mutex.synchronize do
157
- cs_logger.debug "receive_name:#{receive_name}:#{send_receive_shared[receive_name].inspect}"
158
- @receive_arr.push([receive_name, send_receive_shared[receive_name]])
159
- end
160
- end
172
+ cs_logger.debug "trap_receive_data:already register trap:receive_name:#{receive_name} #{Time.now_to_s}"
161
173
  end
174
+
175
+ end
176
+
177
+ # cancel trap_receive
178
+ def cancel_trap_receive(receive_name, options = {})
179
+ cs_logger.debug "cancel_trap_receive:#{receive_name}:#{Time.now_to_s}"
180
+
181
+ @trap_thread_hash[receive_name].kill
182
+
183
+ @trap_thread_hash.delete(receive_name)
162
184
  end
163
185
 
164
- # wait_receive_data
165
- def wait_receive_data(receive_name, options = {})
186
+ # wait_receive
187
+ def wait_receive(receive_name, options = {})
188
+ cs_logger.debug "wait_receive_data:#{receive_name}:#{Time.now_to_s}"
166
189
  timeout = options[:timeout] || ReceiveWaitTimeoutSec
167
190
 
168
191
  # データ受信待ち
169
192
  receive_data = nil
170
- (timeout.to_f / SendReceiveSleepIntervalSec).to_i.times do
193
+
194
+ end_reserved_time = Time.now + timeout # 0以上ならタイムアウト時間決定
195
+
196
+ loop do
171
197
  @receive_mutex.synchronize do
172
198
  receive_data = @receive_arr.find{|r| r[0] == receive_name}.deep_dup
173
- # p @receive_arr
174
199
  end
200
+
175
201
  break if receive_data != nil
202
+ break if end_reserved_time < Time.now
203
+
176
204
  sleep SendReceiveSleepIntervalSec # スリープ
177
205
  end
178
206
 
179
207
  # タイムアウトなら
180
208
  if receive_data == nil
181
- raise(DangoFrameworkTimeoutError, "timeout:client_name=#{@client_name}:receive_name=#{receive_name} #{Time.now_to_s}")
209
+ raise(DangoFrameworkTimeoutError, "timeout:timeout_sec=#{timeout}:\nclient_name=#{@client_name}(#{self.sid})\:receive_name=#{receive_name} \n#{Time.now_to_s}")
182
210
  end
183
211
 
184
212
  # 結果を削除しておく
@@ -186,6 +214,8 @@ class TestClient < DangoClientFramework
186
214
  @receive_arr.delete_if{|r| r[0] == receive_name}
187
215
  end
188
216
 
217
+ @trap_thread_hash.delete(receive_name)
218
+
189
219
  receive_data[1]
190
220
  end
191
221
 
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 = 15
5
+ TINY = 18
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.15
7
- date: 2007-10-18 00:00:00 +09:00
6
+ version: 0.0.18
7
+ date: 2007-10-22 00:00:00 +09:00
8
8
  summary: Ruby - Flash conneciton network flamework
9
9
  require_paths:
10
10
  - lib