DeepConnect 0.4.06

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.
@@ -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
+