datawire_mdk 2.0.5

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,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