datawire_mdk 2.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,457 @@
1
+ # Quark 1.0.406 run at 2016-08-31 13:21:53.028839
2
+ module Quark
3
+ require "quark"
4
+ def self.mdk_runtime; MdkRuntime; end
5
+ module MdkRuntime
6
+ def self.actors; Actors; end
7
+ module Actors
8
+ require "datawire-quark-core"
9
+ require_relative '../quark/reflect' # 0 ('quark',) ('mdk_runtime',)
10
+ require_relative '../datawire_mdk_md' # 0 () ('mdk_runtime',)
11
+ require_relative '../quark' # 0 () ('mdk_runtime',)
12
+ require_relative '../quark/concurrent' # 0 ('quark',) ('mdk_runtime',)
13
+
14
+
15
+ def self.Actor; Actor; end
16
+ ##
17
+ # A store of some state. Emits events and handles events.
18
+
19
+ class Actor < ::DatawireQuarkCore::QuarkObject
20
+ extend ::DatawireQuarkCore::Static
21
+
22
+ static mdk_runtime_actors_Actor_ref: -> { nil }
23
+
24
+
25
+
26
+ def initialize()
27
+ self.__init_fields__
28
+
29
+ nil
30
+ end
31
+
32
+
33
+
34
+
35
+ ##
36
+ # The Actor should start operating.
37
+
38
+ def onStart(dispatcher)
39
+ raise NotImplementedError, '`Actor.onStart` is an abstract method'
40
+
41
+ nil
42
+ end
43
+
44
+ ##
45
+ # The Actor should begin shutting down.
46
+
47
+ def onStop()
48
+
49
+ nil
50
+
51
+ nil
52
+ end
53
+
54
+ ##
55
+ # Called on incoming one-way message from another actor sent via tell().
56
+
57
+ def onMessage(origin, message)
58
+ raise NotImplementedError, '`Actor.onMessage` is an abstract method'
59
+
60
+ nil
61
+ end
62
+
63
+ def __init_fields__()
64
+
65
+
66
+ nil
67
+ end
68
+
69
+
70
+ end
71
+ Actor.unlazy_statics
72
+
73
+ def self._QueuedMessage; QueuedMessage; end
74
+ ##
75
+ # A message that can be queued for delivery in a MessageDispatcher.
76
+
77
+ class QueuedMessage < ::DatawireQuarkCore::QuarkObject
78
+ extend ::DatawireQuarkCore::Static
79
+
80
+ static mdk_runtime_actors__QueuedMessage_ref: -> { nil }
81
+
82
+
83
+
84
+ def initialize()
85
+ self.__init_fields__
86
+
87
+ nil
88
+ end
89
+
90
+
91
+
92
+
93
+ def deliver()
94
+ raise NotImplementedError, '`_QueuedMessage.deliver` is an abstract method'
95
+
96
+ nil
97
+ end
98
+
99
+ def __init_fields__()
100
+
101
+
102
+ nil
103
+ end
104
+
105
+
106
+ end
107
+ QueuedMessage.unlazy_statics
108
+
109
+ def self._InFlightMessage; InFlightMessage; end
110
+ ##
111
+ # A message that queued for delivery by a MessageDispatcher.
112
+
113
+ class InFlightMessage < ::DatawireQuarkCore::QuarkObject
114
+ attr_accessor :origin, :msg, :destination
115
+ extend ::DatawireQuarkCore::Static
116
+
117
+ static mdk_runtime_actors__InFlightMessage_ref: -> { nil }
118
+
119
+
120
+
121
+ def initialize(origin, msg, destination)
122
+
123
+ self.__init_fields__
124
+ (self).origin = origin
125
+ (self).msg = msg
126
+ (self).destination = destination
127
+
128
+ nil
129
+ end
130
+
131
+
132
+
133
+
134
+ ##
135
+ # Deliver the message.
136
+
137
+ def deliver()
138
+
139
+ (self).destination.onMessage((self).origin, (self).msg)
140
+
141
+ nil
142
+ end
143
+
144
+ def toString()
145
+
146
+ return (((((("{") + ((@origin).to_s)) + ("->")) + ((@destination).to_s)) + (": ")) + ((@msg).to_s)) + ("}")
147
+
148
+ nil
149
+ end
150
+
151
+ def _getClass()
152
+
153
+ return "mdk_runtime.actors._InFlightMessage"
154
+
155
+ nil
156
+ end
157
+
158
+ def _getField(name)
159
+
160
+ if ((name) == ("origin"))
161
+ return (self).origin
162
+ end
163
+ if ((name) == ("msg"))
164
+ return (self).msg
165
+ end
166
+ if ((name) == ("destination"))
167
+ return (self).destination
168
+ end
169
+ return nil
170
+
171
+ nil
172
+ end
173
+
174
+ def _setField(name, value)
175
+
176
+ if ((name) == ("origin"))
177
+ (self).origin = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_runtime.actors.Actor }
178
+ end
179
+ if ((name) == ("msg"))
180
+ (self).msg = value
181
+ end
182
+ if ((name) == ("destination"))
183
+ (self).destination = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_runtime.actors.Actor }
184
+ end
185
+
186
+ nil
187
+ end
188
+
189
+ def __init_fields__()
190
+
191
+ self.origin = nil
192
+ self.msg = nil
193
+ self.destination = nil
194
+
195
+ nil
196
+ end
197
+
198
+
199
+ end
200
+ InFlightMessage.unlazy_statics
201
+
202
+ def self._StartStopActor; StartStopActor; end
203
+ ##
204
+ # Start or stop an Actor.
205
+
206
+ class StartStopActor < ::DatawireQuarkCore::QuarkObject
207
+ attr_accessor :actor, :dispatcher, :start
208
+ extend ::DatawireQuarkCore::Static
209
+
210
+ static mdk_runtime_actors__StartStopActor_ref: -> { nil }
211
+
212
+
213
+
214
+ def initialize(actor, dispatcher, start)
215
+
216
+ self.__init_fields__
217
+ (self).actor = actor
218
+ (self).dispatcher = dispatcher
219
+ (self).start = start
220
+
221
+ nil
222
+ end
223
+
224
+
225
+
226
+
227
+ def toString()
228
+
229
+ result = "stopping"
230
+ if ((self).start)
231
+ result = "starting"
232
+ end
233
+ return ((result) + (" ")) + (((self).actor).to_s)
234
+
235
+ nil
236
+ end
237
+
238
+ def deliver()
239
+
240
+ if ((self).start)
241
+ (self).actor.onStart((self).dispatcher)
242
+ else
243
+ (self).actor.onStop()
244
+ end
245
+
246
+ nil
247
+ end
248
+
249
+ def _getClass()
250
+
251
+ return "mdk_runtime.actors._StartStopActor"
252
+
253
+ nil
254
+ end
255
+
256
+ def _getField(name)
257
+
258
+ if ((name) == ("actor"))
259
+ return (self).actor
260
+ end
261
+ if ((name) == ("dispatcher"))
262
+ return (self).dispatcher
263
+ end
264
+ if ((name) == ("start"))
265
+ return (self).start
266
+ end
267
+ return nil
268
+
269
+ nil
270
+ end
271
+
272
+ def _setField(name, value)
273
+
274
+ if ((name) == ("actor"))
275
+ (self).actor = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_runtime.actors.Actor }
276
+ end
277
+ if ((name) == ("dispatcher"))
278
+ (self).dispatcher = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_runtime.actors.MessageDispatcher }
279
+ end
280
+ if ((name) == ("start"))
281
+ (self).start = ::DatawireQuarkCore.cast(value) { ::Object }
282
+ end
283
+
284
+ nil
285
+ end
286
+
287
+ def __init_fields__()
288
+
289
+ self.actor = nil
290
+ self.dispatcher = nil
291
+ self.start = nil
292
+
293
+ nil
294
+ end
295
+
296
+
297
+ end
298
+ StartStopActor.unlazy_statics
299
+
300
+ def self.MessageDispatcher; MessageDispatcher; end
301
+ ##
302
+ # Manage a group of related Actors.
303
+ #
304
+ # Each Actor should only be started and used by one MessageDispatcher.
305
+ #
306
+ # Reduce accidental re-entrancy by making sure messages are run asynchronously.
307
+ #
308
+
309
+ class MessageDispatcher < ::DatawireQuarkCore::QuarkObject
310
+ attr_accessor :logger, :_queued, :_delivering, :_lock
311
+ extend ::DatawireQuarkCore::Static
312
+
313
+ static quark_List_mdk_runtime_actors__QueuedMessage__ref: -> { nil }
314
+ static mdk_runtime_actors_MessageDispatcher_ref: -> { nil }
315
+
316
+
317
+
318
+ def initialize()
319
+ self.__init_fields__
320
+
321
+ nil
322
+ end
323
+
324
+
325
+
326
+
327
+ ##
328
+ # Queue a message from origin to destination, and trigger delivery if necessary.
329
+
330
+ def tell(origin, message, destination)
331
+
332
+ inFlight = ::Quark.mdk_runtime.actors._InFlightMessage.new(origin, message, destination)
333
+ self._queue(inFlight)
334
+
335
+ nil
336
+ end
337
+
338
+ ##
339
+ # Start an Actor.
340
+
341
+ def startActor(actor)
342
+
343
+ self._queue(::Quark.mdk_runtime.actors._StartStopActor.new(actor, self, true))
344
+
345
+ nil
346
+ end
347
+
348
+ ##
349
+ # Stop an Actor.
350
+
351
+ def stopActor(actor)
352
+
353
+ self._queue(::Quark.mdk_runtime.actors._StartStopActor.new(actor, self, false))
354
+
355
+ nil
356
+ end
357
+
358
+ def _callQueuedMessage(ignore, message)
359
+
360
+ message.deliver()
361
+ return true
362
+
363
+ nil
364
+ end
365
+
366
+ ##
367
+ # Queue a message for delivery.
368
+
369
+ def _queue(inFlight)
370
+
371
+ @logger.debug(("Queued ") + ((inFlight).to_s))
372
+ (self)._lock.acquire()
373
+ ((self)._queued) << (inFlight)
374
+ if ((self)._delivering)
375
+ (self)._lock.release()
376
+ return
377
+ end
378
+ (self)._delivering = true
379
+ while ((((self)._queued).size) > (0)) do
380
+ toDeliver = (self)._queued
381
+ (self)._queued = ::DatawireQuarkCore::List.new([])
382
+ (self)._lock.release()
383
+ idx = 0
384
+ while ((idx) < ((toDeliver).size)) do
385
+ @logger.debug(("Delivering ") + (((toDeliver)[idx]).to_s))
386
+ deliver = ::Quark.quark._BoundMethod.new(self, "_callQueuedMessage", ::DatawireQuarkCore::List.new([(toDeliver)[idx]]))
387
+ ::Quark.quark.concurrent.Context.runtime().callSafely(deliver, false)
388
+ idx = (idx) + (1)
389
+ end
390
+ (self)._lock.acquire()
391
+ end
392
+ (self)._delivering = false
393
+ (self)._lock.release()
394
+
395
+ nil
396
+ end
397
+
398
+ def _getClass()
399
+
400
+ return "mdk_runtime.actors.MessageDispatcher"
401
+
402
+ nil
403
+ end
404
+
405
+ def _getField(name)
406
+
407
+ if ((name) == ("logger"))
408
+ return (self).logger
409
+ end
410
+ if ((name) == ("_queued"))
411
+ return (self)._queued
412
+ end
413
+ if ((name) == ("_delivering"))
414
+ return (self)._delivering
415
+ end
416
+ if ((name) == ("_lock"))
417
+ return (self)._lock
418
+ end
419
+ return nil
420
+
421
+ nil
422
+ end
423
+
424
+ def _setField(name, value)
425
+
426
+ if ((name) == ("logger"))
427
+ (self).logger = value
428
+ end
429
+ if ((name) == ("_queued"))
430
+ (self)._queued = ::DatawireQuarkCore.cast(value) { ::DatawireQuarkCore::List }
431
+ end
432
+ if ((name) == ("_delivering"))
433
+ (self)._delivering = ::DatawireQuarkCore.cast(value) { ::Object }
434
+ end
435
+ if ((name) == ("_lock"))
436
+ (self)._lock = ::DatawireQuarkCore.cast(value) { ::DatawireQuarkCore::Lock }
437
+ end
438
+
439
+ nil
440
+ end
441
+
442
+ def __init_fields__()
443
+
444
+ self.logger = ::Quark.quark._getLogger("actors")
445
+ self._queued = ::DatawireQuarkCore::List.new([])
446
+ self._delivering = false
447
+ self._lock = ::DatawireQuarkCore::Lock.new()
448
+
449
+ nil
450
+ end
451
+
452
+
453
+ end
454
+ MessageDispatcher.unlazy_statics
455
+ end # module Actors
456
+ end # module MdkRuntime
457
+ end # module Quark