Class: Quark::MdkRuntime::Actors::MessageDispatcher

Inherits:
DatawireQuarkCore::QuarkObject show all
Extended by:
DatawireQuarkCore::Static
Defined in:
lib/mdk_runtime/actors.rb

Constant Summary

Constants included from DatawireQuarkCore::Static

DatawireQuarkCore::Static::Unassigned

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from DatawireQuarkCore::Static

_lazy_statics, static, unlazy_statics

Methods inherited from DatawireQuarkCore::QuarkObject

#to_s

Constructor Details

#initializeMessageDispatcher

Returns a new instance of MessageDispatcher.



317
318
319
320
321
# File 'lib/mdk_runtime/actors.rb', line 317

def initialize()
    self.__init_fields__

    nil
end

Instance Attribute Details

#_deliveringObject

Returns the value of attribute _delivering.



309
310
311
# File 'lib/mdk_runtime/actors.rb', line 309

def _delivering
  @_delivering
end

#_lockObject

Returns the value of attribute _lock.



309
310
311
# File 'lib/mdk_runtime/actors.rb', line 309

def _lock
  @_lock
end

#_queuedObject

Returns the value of attribute _queued.



309
310
311
# File 'lib/mdk_runtime/actors.rb', line 309

def _queued
  @_queued
end

#loggerObject

Returns the value of attribute logger.



309
310
311
# File 'lib/mdk_runtime/actors.rb', line 309

def logger
  @logger
end

Instance Method Details

#__init_fields__Object



441
442
443
444
445
446
447
448
449
# File 'lib/mdk_runtime/actors.rb', line 441

def __init_fields__()
    
    self.logger = ::Quark.quark._getLogger("actors")
    self._queued = ::DatawireQuarkCore::List.new([])
    self._delivering = false
    self._lock = ::DatawireQuarkCore::Lock.new()

    nil
end

#_callQueuedMessage(ignore, message) ⇒ Object



357
358
359
360
361
362
363
# File 'lib/mdk_runtime/actors.rb', line 357

def _callQueuedMessage(ignore, message)
    
    message.deliver()
    return true

    nil
end

#_getClassObject



397
398
399
400
401
402
# File 'lib/mdk_runtime/actors.rb', line 397

def _getClass()
    
    return "mdk_runtime.actors.MessageDispatcher"

    nil
end

#_getField(name) ⇒ Object



404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
# File 'lib/mdk_runtime/actors.rb', line 404

def _getField(name)
    
    if ((name) == ("logger"))
        return (self).logger
    end
    if ((name) == ("_queued"))
        return (self)._queued
    end
    if ((name) == ("_delivering"))
        return (self)._delivering
    end
    if ((name) == ("_lock"))
        return (self)._lock
    end
    return nil

    nil
end

#_queue(inFlight) ⇒ Object

Queue a message for delivery.



368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
# File 'lib/mdk_runtime/actors.rb', line 368

def _queue(inFlight)
    
    @logger.debug(("Queued ") + ((inFlight).to_s))
    (self)._lock.acquire()
    ((self)._queued) << (inFlight)
    if ((self)._delivering)
        (self)._lock.release()
        return
    end
    (self)._delivering = true
    while ((((self)._queued).size) > (0)) do
        toDeliver = (self)._queued
        (self)._queued = ::DatawireQuarkCore::List.new([])
        (self)._lock.release()
        idx = 0
        while ((idx) < ((toDeliver).size)) do
            @logger.debug(("Delivering ") + (((toDeliver)[idx]).to_s))
            deliver = ::Quark.quark._BoundMethod.new(self, "_callQueuedMessage", ::DatawireQuarkCore::List.new([(toDeliver)[idx]]))
            ::Quark.quark.concurrent.Context.runtime().callSafely(deliver, false)
            idx = (idx) + (1)
        end
        (self)._lock.acquire()
    end
    (self)._delivering = false
    (self)._lock.release()

    nil
end

#_setField(name, value) ⇒ Object



423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
# File 'lib/mdk_runtime/actors.rb', line 423

def _setField(name, value)
    
    if ((name) == ("logger"))
        (self).logger = value
    end
    if ((name) == ("_queued"))
        (self)._queued = ::DatawireQuarkCore.cast(value) { ::DatawireQuarkCore::List }
    end
    if ((name) == ("_delivering"))
        (self)._delivering = ::DatawireQuarkCore.cast(value) { ::Object }
    end
    if ((name) == ("_lock"))
        (self)._lock = ::DatawireQuarkCore.cast(value) { ::DatawireQuarkCore::Lock }
    end

    nil
end

#startActor(actor) ⇒ Object

Start an Actor.



340
341
342
343
344
345
# File 'lib/mdk_runtime/actors.rb', line 340

def startActor(actor)
    
    self._queue(::Quark.mdk_runtime.actors._StartStopActor.new(actor, self, true))

    nil
end

#stopActor(actor) ⇒ Object

Stop an Actor.



350
351
352
353
354
355
# File 'lib/mdk_runtime/actors.rb', line 350

def stopActor(actor)
    
    self._queue(::Quark.mdk_runtime.actors._StartStopActor.new(actor, self, false))

    nil
end

#tell(origin, message, destination) ⇒ Object

Queue a message from origin to destination, and trigger delivery if necessary.



329
330
331
332
333
334
335
# File 'lib/mdk_runtime/actors.rb', line 329

def tell(origin, message, destination)
    
    inFlight = ::Quark.mdk_runtime.actors._InFlightMessage.new(origin, message, destination)
    self._queue(inFlight)

    nil
end