DeepConnect 0.4.06

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,149 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # evaluator.rb -
4
+ # Copyright (C) 1996-2010 Keiju ISHITSUKA
5
+ # (Penta Advanced Labrabries, Co.,Ltd)
6
+ #
7
+
8
+
9
+ require "deep-connect/event"
10
+ require "deep-connect/exceptions"
11
+
12
+ module DeepConnect
13
+ class Evaluator
14
+ def initialize(org)
15
+ @organizer = org
16
+ end
17
+
18
+ def evaluate_request(session, event)
19
+ begin
20
+ if @organizer.shallow_connect?
21
+ if !(mspec = Organizer::method_spec(event.receiver, event.method)) or
22
+ !mspec.interface?
23
+ DC.Raise NoInterfaceMethod, event.receiver.class, event.method
24
+ end
25
+ end
26
+ ret = event.receiver.send(event.method, *event.args)
27
+ unless event.kind_of?(Event::NoReply)
28
+ session.accept event.reply(ret)
29
+ end
30
+ # rescue SygnalException
31
+ # puts "Info: catch"
32
+ #
33
+ rescue SystemExit
34
+ raise
35
+ rescue Exception
36
+ #p event.receiver.class
37
+ #p event.method
38
+ #p $!
39
+ #p $@
40
+ unless event.kind_of?(Event::NoReply)
41
+ session.accept event.reply(ret, $!)
42
+ end
43
+ end
44
+ end
45
+
46
+ def evaluate_iterator_request(session, event)
47
+ begin
48
+ if @organizer.shallow_connect?
49
+ if !(mspec = Organizer::method_spec(event.receiver, event.method)) or
50
+ !mspec.interface?
51
+ DC.Raise NoInterfaceMethod, event.receiver.class, event.method
52
+ end
53
+ end
54
+ fin = event.receiver.send(event.method, *event.args){|*args|
55
+ begin
56
+ # if args.size == 1 && args.first.kind_of?(Array)
57
+ # args = args.first
58
+ # end
59
+ callback_req = session.block_yield(event, args)
60
+
61
+ case callback_req.result_event
62
+ when Event::IteratorCallBackReplyBreak
63
+ break callback_req.result
64
+ else
65
+ callback_req.result
66
+ end
67
+ rescue
68
+ # ここ内部エラーじゃないなぁ...
69
+ if Conf.DEBUG
70
+ puts "INFO: BLOCK YIELD EXCEPTION:"
71
+ puts "\t#{$!}"
72
+ $@.each{|l| puts "\t#{l}"}
73
+ end
74
+ raise
75
+ end
76
+ }
77
+ session.accept event.reply(fin)
78
+ rescue SystemExit
79
+ raise
80
+ rescue Exception
81
+ session.accept event.reply(fin, $!)
82
+ end
83
+ end
84
+
85
+ def evaluate_block_yield(session, ev)
86
+ if @organizer.shallow_connect?
87
+ # yield が許されているかチェック
88
+ end
89
+ begin
90
+ args = ev.args
91
+
92
+ if ev.block.arity > 1
93
+ begin
94
+ if args.size == 1 && args.first.__deep_connect_reference?
95
+ if args.first.kind_of?(Array)
96
+ args = args.first.dc_dup
97
+ end
98
+ end
99
+ rescue
100
+ p $!, $!
101
+ raise
102
+ end
103
+ end
104
+ ret = ev.block.call(*args)
105
+ session.accept ev.reply(ret)
106
+ rescue LocalJumpError
107
+ exp = $!
108
+ case exp.reason
109
+ when :break
110
+ session.accept ev.reply(ret,
111
+ exp.exit_value,
112
+ Event::IteratorCallBackReplyBreak)
113
+ else
114
+ session.accept ev.reply(ret, exp)
115
+ end
116
+ rescue Exception
117
+ exp = $!
118
+ session.accept e = ev.reply(ret, exp)
119
+ end
120
+ end
121
+
122
+ def evaluate_mq_request(session, event, callback)
123
+ begin
124
+ if @organizer.shallow_connect?
125
+ if !(mspec = Organizer::method_spec(event.receiver, event.method)) or
126
+ !mspec.interface?
127
+ DC.Raise NoInterfaceMethod, event.receiver.class, event.method
128
+ end
129
+ end
130
+ ret = event.receiver.send(event.method, *event.args)
131
+ if callback
132
+ callback.asynchronus_send(:call, ret, nil)
133
+ callback.release
134
+ end
135
+ rescue SystemExit
136
+ raise
137
+ rescue Exception
138
+ if callback
139
+ p event.receiver.class
140
+ p event.method
141
+ p $!
142
+ p $@
143
+ callback.asynchronus_send(:call, ret, $!)
144
+ callback.release
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,551 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # event.rb -
4
+ # Copyright (C) 1996-2010 Keiju ISHITSUKA
5
+ # (Penta Advanced Labrabries, Co.,Ltd)
6
+ #
7
+
8
+ require "deep-connect/class-spec-space"
9
+ require "deep-connect/reference"
10
+
11
+ module DeepConnect
12
+
13
+ class PeerSideException<StandardError
14
+ def initialize(exp)
15
+ #Fairy::Log.debug(self, exp.inspect)
16
+ begin
17
+ m = exp.message
18
+ rescue
19
+ m = "(NoMessage from PeerSide)"
20
+ end
21
+ super(m)
22
+ @peer_exception = exp
23
+ end
24
+
25
+ attr_reader :peer_exception
26
+ end
27
+
28
+ module Event
29
+ EV = Event
30
+
31
+ def Event.materialize(session, type, *rest)
32
+ type.materialize_sub(session, type, *rest)
33
+ end
34
+
35
+ class Event
36
+ def initialize(session, receiver)
37
+ @session = session
38
+ @receiver = receiver
39
+ end
40
+
41
+ attr_reader :session
42
+ attr :receiver
43
+ attr :seq
44
+
45
+ public :iterator?
46
+
47
+ def inspect
48
+ sprintf "#<#{self.class}, session=#{@session}, seq=#{@seq}, receiver=#{@receiver}>"
49
+ end
50
+ end
51
+
52
+ module NoReply; end
53
+
54
+ class Request < Event
55
+ def Request.request(session, receiver, method, args)
56
+ req = new(session, receiver, method, args)
57
+ req.init_req
58
+ req
59
+ end
60
+
61
+ def Request.receipt(session, seq, receiver, method, args)
62
+ rec = new(session, receiver, method, args)
63
+ rec.set_seq(seq)
64
+ rec
65
+ end
66
+
67
+ def Request.materialize_sub(session, type, klass, seq, receiver_id, method, args)
68
+ receiver = session.deep_space.root(receiver_id)
69
+
70
+ type.receipt(session, seq,
71
+ receiver,
72
+ method,
73
+ args.collect{|elm|
74
+ Reference.materialize(session.deep_space, *elm)})
75
+ end
76
+
77
+ def reply(ret, exp = nil, reply_class = reply_class)
78
+ reply_class.reply(self.session, self, ret, exp)
79
+ end
80
+
81
+ def reply_class
82
+ Reply
83
+ end
84
+
85
+ def initialize(session, receiver, method, args)
86
+ super(session, receiver)
87
+ @method = method
88
+ @args = args
89
+ end
90
+
91
+ def init_req
92
+ @seq = @session.next_request_event_id
93
+ @result = :__DEEPCONNECT__NO_VALUE__
94
+ @result_mutex = Mutex.new
95
+ @result_cv = ConditionVariable.new
96
+ end
97
+
98
+ def set_seq(seq)
99
+ @seq = seq
100
+ end
101
+
102
+ def serialize
103
+ mspec = @session.deep_space.method_spec(@receiver, @method)
104
+ if mspec && mspec.args
105
+ args = mspec.arg_zip(@args){|spec, arg|
106
+ Reference.serialize_with_spec(@session.deep_space, arg, spec)
107
+ }
108
+ else
109
+ args = @args.collect{|elm|
110
+ Reference.serialize(@session.deep_space, elm)
111
+ }
112
+ end
113
+ sel = [self.class, @seq, @receiver.peer_id, @method]
114
+ sel.push args
115
+ sel
116
+ end
117
+
118
+ def request?
119
+ true
120
+ end
121
+
122
+ def result_event
123
+ @result_mutex.synchronize do
124
+ while @result == :__DEEPCONNECT__NO_VALUE__
125
+ @result_cv.wait(@result_mutex)
126
+ end
127
+ end
128
+ @result
129
+ end
130
+
131
+ def result
132
+ result_event
133
+ if @result.exp
134
+ raise create_exception
135
+ end
136
+ @result.result
137
+ end
138
+
139
+ def result=(ev)
140
+ @result = ev
141
+ @result_cv.broadcast
142
+ end
143
+
144
+ attr :method
145
+ attr :args
146
+
147
+ def inspect
148
+ sprintf "#<#{self.class}, session=#{@session}, seq=#{@seq}, receiver=#{@receiver}, method=#{@method.id2name}, args=#{@args.collect{|e| e.to_s}.join(', ')}>"
149
+ end
150
+
151
+ def create_exception
152
+ exp = nil
153
+ begin
154
+ exp = @result.exp.dc_dup
155
+ rescue
156
+ exp = PeerSideException.new(@result.exp)
157
+ end
158
+
159
+ bt = @result.exp.backtrace
160
+ bt.push "-- peer side --"
161
+ bt.push *caller(0)
162
+ bt = bt.select{|e| /deep-connect/ !~ e} unless Conf.DEBUG
163
+ exp.set_backtrace(bt)
164
+ exp
165
+ end
166
+
167
+ end
168
+
169
+ class RequestWithBlock < Request
170
+ def self.materialize_sub(session, type, klass, seq, receiver_id, method, args, block)
171
+
172
+ receiver = receiver(session, receiver_id)
173
+
174
+ type.receipt(session, seq,
175
+ receiver,
176
+ method,
177
+ args.collect{|elm|
178
+ Reference.materialize(session.deep_space, *elm)},
179
+ Reference.materialize(session.deep_space, *block))
180
+ end
181
+
182
+ def self.request(session, receiver, method, args, block)
183
+ req = new(session, receiver, method, args, block)
184
+ req.init_req
185
+ req
186
+ end
187
+
188
+ def self.receipt(session, seq, receiver, method, args, block)
189
+ rec = new(session, receiver, method, args, block)
190
+ rec.set_seq(seq)
191
+ rec
192
+ end
193
+
194
+ def initialize(session, receiver, method, args, block)
195
+ super(session, receiver, method, args)
196
+ @block = block
197
+ end
198
+
199
+ attr_reader :block
200
+
201
+ def serialize
202
+ mspec = method_spec(@receiver, @method)
203
+ if mspec && mspec_args(mspec)
204
+ args = mspec_arg_zip(mspec){|spec, arg|
205
+ Reference.serialize_with_spec(@session.deep_space, arg, spec)
206
+ }
207
+ else
208
+ args = @args.collect{|elm|
209
+ Reference.serialize(@session.deep_space, elm)
210
+ }
211
+ end
212
+ receiver_id = receiver_id(@receiver)
213
+ # @receiver.peer_id
214
+ sel = [self.class, @seq, receiver_id, @method]
215
+ sel.push args
216
+ sel.push Reference.serialize(@session.deep_space, @block)
217
+ sel
218
+ end
219
+ end
220
+
221
+ class IteratorRequest<RequestWithBlock
222
+
223
+ def self.receiver(session, receiver_id)
224
+ session.deep_space.root(receiver_id)
225
+ end
226
+
227
+ def method_spec(receiver, method)
228
+ @session.deep_space.method_spec(receiver, method)
229
+ end
230
+
231
+ def receiver_id(receriver)
232
+ receiver.peer_id
233
+ end
234
+
235
+ def mspec_args(mspec)
236
+ mspec.args
237
+ end
238
+
239
+ def mspec_arg_zip(mspec, &block)
240
+ mspec.arg_zip(@args, &block)
241
+ end
242
+
243
+ def reply_class
244
+ IteratorReply
245
+ end
246
+ end
247
+
248
+ class IteratorCallBackRequest<RequestWithBlock
249
+
250
+ def self.receiver(session, receiver_id)
251
+ Reference.materialize(session.deep_space, *receiver_id)
252
+ end
253
+
254
+ def method_spec(receiver, method)
255
+ @session.deep_space.my_method_spec(receiver, method)
256
+ end
257
+
258
+ def receiver_id(receriver)
259
+ Reference.serialize(@session.deep_space, @receiver)
260
+ end
261
+
262
+ def mspec_args(mspec)
263
+ mspec.block_args
264
+ end
265
+
266
+ def mspec_arg_zip(mspec, &block)
267
+ mspec.block_arg_zip(@args, &block)
268
+ end
269
+
270
+ def IteratorCallBackRequest.call_back_event(event, args)
271
+ req = new(event.session, event.receiver, event.method, args, event.block)
272
+ req.init_req
273
+ req
274
+ end
275
+
276
+ def reply_class
277
+ IteratorCallBackReply
278
+ end
279
+ end
280
+
281
+ class AsyncronusRequest<Request
282
+ def AsyncronusRequest.request(session, receiver, method, args, callback)
283
+ req = new(session, receiver, method, args, callback)
284
+ req.init_req
285
+ req
286
+ end
287
+
288
+ def AsyncronusRequest.receipt(session, seq, receiver, method, args)
289
+ rec = new(session, receiver, method, args)
290
+ rec.set_seq(seq)
291
+ rec
292
+ end
293
+
294
+
295
+ def initialize(session, receiver, method, args, callback = nil)
296
+ super(session, receiver, method, args)
297
+ @callback = callback
298
+ end
299
+
300
+ def reply_class
301
+ AsyncronusReply
302
+ end
303
+
304
+ def result=(ev)
305
+ @result = ev
306
+ if @callback
307
+ Thread.start do
308
+ if ev.exp
309
+ exp = create_exception
310
+ @callback.call(nil, exp)
311
+ else
312
+ @callback.call(ev.result, nil)
313
+ end
314
+ end
315
+ end
316
+ end
317
+ end
318
+
319
+ class MQRequest<IteratorRequest
320
+ def MQRequest.request(session, receiver, method, args, callback)
321
+ req = new(session, receiver, method, args, callback)
322
+ req.init_req
323
+ req
324
+ end
325
+
326
+ def MQRequest.receipt(session, seq, receiver, method, args, callback)
327
+ rec = new(session, receiver, method, args, callback)
328
+ rec.set_seq(seq)
329
+ rec
330
+ end
331
+
332
+
333
+ def initialize(session, receiver, method, args, callback = nil)
334
+ super(session, receiver, method, args, callback)
335
+ @callback = callback
336
+ end
337
+ attr_reader :callback
338
+
339
+ def reply_class
340
+ MQReply
341
+ end
342
+ end
343
+
344
+ class SessionRequest < Request
345
+ def SessionRequest.request(session, method, args=[])
346
+ req = new(session, session, method, args)
347
+ req.init_req
348
+ req
349
+ end
350
+
351
+ def SessionRequest.receipt(session, seq, dummy, method, args=[])
352
+ rec = new(session, session, method, args)
353
+ rec.set_seq(seq)
354
+ rec
355
+ end
356
+
357
+ def reply_class
358
+ SessionReply
359
+ end
360
+
361
+ def serialize
362
+ args = @args.collect{|elm|
363
+ Reference.serialize(@session.deep_space, elm)
364
+ }
365
+ sel = [self.class, @seq, @receiver.peer_id, @method]
366
+ sel.push args
367
+ sel
368
+ end
369
+
370
+ def inspect
371
+ # sprintf "#<#{self.class}, session=#{@session}, seq=#{@seq}, method=#{@method.id2name}, args=#{@args.collect{|e| e.to_s}.join(', ')}>"
372
+ sprintf "#<#{self.class}, session=#{@session}, seq=#{@seq}, method=#{@method.id2name}, args=...>"
373
+ end
374
+ end
375
+
376
+ class SessionRequestNoReply<SessionRequest
377
+ include NoReply
378
+ end
379
+
380
+ class Reply < Event
381
+ def Reply.materialize_sub(session, type, klass, seq, receiver, method, ret, exp=nil)
382
+ if exp
383
+ type.new(session, seq,
384
+ session.deep_space.root(receiver),
385
+ method,
386
+ Reference.materialize(session.deep_space, *ret),
387
+ Reference.materialize(session.deep_space, *exp))
388
+ else
389
+ type.new(session, seq,
390
+ session.deep_space.root(receiver),
391
+ method,
392
+ Reference.materialize(session.deep_space, *ret))
393
+
394
+ end
395
+ end
396
+
397
+ def self.reply(session, req, ret, exp=nil)
398
+ new(session, req.seq, req.receiver, req.method, ret, exp)
399
+ end
400
+
401
+ def initialize(session, seq, receiver, method, ret, exp=nil)
402
+ super(session, receiver)
403
+ @seq = seq
404
+ @method = method
405
+ @result = ret
406
+ @exp = exp
407
+ end
408
+
409
+ def serialize
410
+ mspec = @session.deep_space.my_method_spec(@receiver, @method)
411
+ if mspec && mspec.rets
412
+ if mspec.rets.kind_of?(Array)
413
+ rets = mspec.rets_zip(@result){|spec, ret|
414
+ Reference.serialize_with_spec(@session.deep_space, ret, spec)
415
+ }
416
+ sel_result = [:VAL, "Array", [Array, rets]]
417
+ else
418
+ sel_result = Reference.serialize(@session.deep_space, @result, mspec.rets)
419
+ end
420
+ else
421
+ sel_result = Reference.serialize(@session.deep_space, @result)
422
+ end
423
+
424
+ if @exp
425
+ [self.class, @seq,
426
+ # Reference.serialize(@session.deep_space, @receiver),
427
+ nil,
428
+ @method,
429
+ sel_result,
430
+ Reference.serialize(@session.deep_space, @exp)]
431
+ else
432
+ [self.class, @seq,
433
+ # Reference.serialize(@session.deep_space, @receiver),
434
+ nil,
435
+ @method,
436
+ sel_result]
437
+ end
438
+ end
439
+
440
+ def request?
441
+ false
442
+ end
443
+
444
+ attr_reader :result
445
+ attr_reader :exp
446
+ attr_reader :method
447
+
448
+ def inspect
449
+ sprintf "#<#{self.class}, session=#{@session}, seq=#{@seq}, receiver=#{@receiver}, method=#{@method} result=#{@result} exp=#{@exp}}>"
450
+ end
451
+ end
452
+
453
+ class IteratorReply < Reply; end
454
+
455
+ class IteratorCallBackReply<Reply
456
+ def serialize
457
+ mspec = @session.deep_space.method_spec(@receiver, @method)
458
+ if mspec && mspec.rets
459
+ if mspec.rets.kind_of?(Array)
460
+ rets = mspec.rets_zip(@result){|spec, ret|
461
+ Reference.serialize_with_spec(@session.deep_space, ret, spec)
462
+ }
463
+ sel_result = [:VAL, "Array", [Array, rets]]
464
+ else
465
+ sel_result = Reference.serialize(@session.deep_space, @result, mspec.rets)
466
+ end
467
+ else
468
+ sel_result = Reference.serialize(@session.deep_space, @result)
469
+ end
470
+
471
+ if @exp
472
+ [self.class, @seq,
473
+ # Reference.serialize(@session.deep_space, @receiver),
474
+ nil,
475
+ @method,
476
+ sel_result,
477
+ Reference.serialize(@session.deep_space, @exp)]
478
+ else
479
+ [self.class, @seq,
480
+ # Reference.serialize(@session.deep_space, @receiver),
481
+ nil,
482
+ @method,
483
+ sel_result]
484
+ end
485
+ end
486
+ end
487
+
488
+ class IteratorCallBackReplyBreak<IteratorCallBackReply; end
489
+ class IteratorReplyFinish < Reply; end
490
+
491
+ class AsyncronusReply<Reply; end
492
+
493
+ class MQReply<Reply;end
494
+
495
+ class SessionReply < Reply
496
+ def SessionReply.materialize_sub(session, type, klass, seq, receiver, method, ret, exp = nil)
497
+ # puts "SESSIONREPLY: #{type}, #{session}, #{ret.collect{|e| e.to_s}.join(',')}"
498
+ if exp
499
+ type.new(session, seq,
500
+ session,
501
+ method,
502
+ Reference.materialize(session.deep_space, *ret),
503
+ Reference.materialize(session.deep_space, *exp))
504
+ else
505
+ type.new(session, seq,
506
+ session,
507
+ method,
508
+ Reference.materialize(session.deep_space, *ret))
509
+ end
510
+ end
511
+
512
+ def inspect
513
+ sprintf "#<#{self.class}, session=#{@session}, seq=#{@seq}, result=#{@result}}>"
514
+ end
515
+ end
516
+
517
+ # session 初期化
518
+ class InitSessionEvent<Event
519
+ def self.materialize_sub(session, type, klass, local_id)
520
+ new(local_id)
521
+ end
522
+
523
+ def initialize(local_id)
524
+ @local_id=local_id
525
+ end
526
+
527
+ attr_reader :local_id
528
+
529
+ def serialize
530
+ [self.class, @local_id]
531
+ end
532
+ end
533
+
534
+ class ConnectResult<Event
535
+ def self.materialize_sub(session, type, klass, result)
536
+ new(result)
537
+ end
538
+
539
+ def initialize(result)
540
+ @result = result
541
+ end
542
+
543
+ attr_reader :result
544
+
545
+ def serialize
546
+ [self.class, @result]
547
+ end
548
+ end
549
+ end
550
+ end
551
+