class Orocos::Async::NameServiceBase

Attributes

task_context_proxies[R]

Public Class Methods

new(name_service,options = Hash.new) click to toggle source
Calls superclass method
# File lib/orocos/async/name_service.rb, line 53
def initialize(name_service,options = Hash.new)
    @options ||= Kernel.validate_options options,:period => default_period,:start => false,:sync_key => nil,:known_errors => Orocos::Async::KNOWN_ERRORS,:event_loop => Orocos::Async.event_loop
    @stored_names ||= Set.new
    _,options_async = Kernel.filter_options @options,:event_loop=>nil
    super(name_service.name,@options[:event_loop])
    disable_emitting do
        reachable! name_service
    end
    @watchdog_timer = @event_loop.async_every method(:names),options_async do |names|
        names.each do |name|
            n = @stored_names.add? name
            event :task_added,name if n
        end
        @stored_names.delete_if do |name|
            if !names.include?(name)
                event :task_removed,name
                true
            else
                false
            end
        end
    end
    @watchdog_timer.doc = name
    @task_context_proxies = Array.new
end

Public Instance Methods

proxy(name,options = Hash.new) click to toggle source
# File lib/orocos/async/name_service.rb, line 99
def proxy(name,options = Hash.new)
    name = if name.respond_to?(:name)
               name.name
           else
               name
           end
    options[:event_loop] ||= @event_loop
    options[:name_service] ||= self
    ns,base_name = split_name(name)
    ns ||= ""
    task = @task_context_proxies.find do |t|
        ns2,base_name2= split_name(t.name)
        ns2 ||= ""
        ns == ns2 && base_name == base_name2 && t.event_loop == options[:event_loop] && t.name_service == options[:name_service]
    end
    if task
        options.each_pair do |key,value|
            if task.options[key] != value
                # TODO add proper pretty_print methods to display options otherwise console will be flooded
                Orocos.warn "TaskContextProxy #{name} is already initialized with different options."
               # Orocos.warn "Ignoring options: #{options}."
                break
            end
        end
        task
    else
        @task_context_proxies << Orocos::Async::TaskContextProxy.new(name,options)
        @task_context_proxies.last
    end
end
really_add_listener(listener) click to toggle source
Calls superclass method
# File lib/orocos/async/name_service.rb, line 79
def really_add_listener(listener)
    if listener.event == :task_added || listener.event == :task_removed 
        @watchdog_timer.start unless @watchdog_timer.running?
        if listener.use_last_value? && !@stored_names.empty?
            @stored_names.each do |name|
                listener.call name
            end
        end
    end
    super
end
remove_listener(listener) click to toggle source
Calls superclass method
# File lib/orocos/async/name_service.rb, line 91
def remove_listener(listener)
    super
    if number_of_listeners(:task_removed) == 0 && number_of_listeners(:task_added) == 0
        @watchdog_timer.cancel
        @stored_names.clear
    end
end