Class: Orocos::RubyTasks::Process

Inherits:
ProcessBase show all
Defined in:
lib/orocos/ruby_tasks/process.rb

Overview

Representation and management of a set of ruby tasks

This provides a Process-compatible API to ruby tasks. It allows to define tasks in an oroGen deployment model and “spawn” them all at once, as well as dispose of them all at once.

Instance Attribute Summary collapse

Attributes inherited from ProcessBase

#default_logger, #logged_ports, #model, #name, #name_mappings, #tasks

Instance Method Summary collapse

Methods inherited from ProcessBase

#default_logger_name, #each_task, #get_mapped_name, #log_all_ports, #map_name, #orogen, #register_task, resolve_prefix, #setup_default_logger, #task_names

Constructor Details

#initialize(ruby_process_server, name, model, task_context_class: TaskContext) ⇒ Process

Creates a new ruby task process

Parameters:

  • ruby_process_server (nil, #dead_deployment)

    the process manager which creates this process. If non-nil, its #dead_deployment method will be called when this process stops

  • name (String)

    the process name

  • model (OroGen::Spec::Deployment)

    the deployment model


63
64
65
66
67
68
# File 'lib/orocos/ruby_tasks/process.rb', line 63

def initialize(ruby_process_server, name, model, task_context_class: TaskContext)
    @ruby_process_server = ruby_process_server
    @deployed_tasks = Hash.new
    @task_context_class = task_context_class
    super(name, model)
end

Instance Attribute Details

#deployed_tasks{String=>TaskContext} (readonly)

The set of deployed tasks

Returns:


22
23
24
# File 'lib/orocos/ruby_tasks/process.rb', line 22

def deployed_tasks
  @deployed_tasks
end

#ruby_process_server#dead_deployment? (readonly)

The Ruby process server that spawned this process

If non-nil, the object's #dead_deployment will be called when self is stopped

Returns:

  • (#dead_deployment, nil)

16
17
18
# File 'lib/orocos/ruby_tasks/process.rb', line 16

def ruby_process_server
  @ruby_process_server
end

#task_context_classClass (readonly)

The task context class that should be used on the client side

Defaults to TaskContext, another option is StubTaskContext

Returns:

  • (Class)

54
55
56
# File 'lib/orocos/ruby_tasks/process.rb', line 54

def task_context_class
  @task_context_class
end

Instance Method Details

#alive?Boolean

True if the process is running. This is an alias for running?

Returns:

  • (Boolean)

116
# File 'lib/orocos/ruby_tasks/process.rb', line 116

def alive?; @alive end

#dead!(status = ProcessManager::Status.new(:exit_code => 0)) ⇒ Object


104
105
106
107
108
109
# File 'lib/orocos/ruby_tasks/process.rb', line 104

def dead!(status = ProcessManager::Status.new(:exit_code => 0))
    @alive = false
    if ruby_process_server
        ruby_process_server.dead_deployment(name, status)
    end
end

#host_idString

The host on which this process' tasks run

This is always 'localhost' as ruby tasks are instanciated inside the ruby process

Returns:

  • (String)

30
# File 'lib/orocos/ruby_tasks/process.rb', line 30

def host_id; 'localhost' end

#joinObject

Raises:

  • (NotImplementedError)

111
112
113
# File 'lib/orocos/ruby_tasks/process.rb', line 111

def join
    raise NotImplementedError, "RemoteProcess#join is not implemented"
end

#kill(wait = true, status = ProcessManager::Status.new(:exit_code => 0)) ⇒ Object


97
98
99
100
101
102
# File 'lib/orocos/ruby_tasks/process.rb', line 97

def kill(wait = true, status = ProcessManager::Status.new(:exit_code => 0))
    deployed_tasks.each_value do |task|
        task.dispose
    end
    dead!(status)
end

#on_localhost?Boolean

Whether the tasks in this process are running on the same machine than the ruby process

This is always true as ruby tasks are instanciated inside the ruby process

Returns:

  • (Boolean)

39
# File 'lib/orocos/ruby_tasks/process.rb', line 39

def on_localhost?; true end

#pidInteger

The PID of the process in which the tasks run

This is always Process.pid as ruby tasks are instanciated inside the ruby process

Returns:

  • (Integer)

47
# File 'lib/orocos/ruby_tasks/process.rb', line 47

def pid; ::Process.pid end

#running?Boolean

True if the process is running. This is an alias for alive?

Returns:

  • (Boolean)

118
# File 'lib/orocos/ruby_tasks/process.rb', line 118

def running?; @alive end

#spawn(options = Hash.new) ⇒ void

This method returns an undefined value.

Deploys the tasks defined in ProcessBase#model as ruby tasks


73
74
75
76
77
78
79
80
# File 'lib/orocos/ruby_tasks/process.rb', line 73

def spawn(options = Hash.new)
    model.task_activities.each do |deployed_task|
        name = get_mapped_name(deployed_task.name)
        deployed_tasks[name] = task_context_class.
            from_orogen_model(name, deployed_task.task_model)
    end
    @alive = true
end

#task(task_name) ⇒ Object


90
91
92
93
94
95
# File 'lib/orocos/ruby_tasks/process.rb', line 90

def task(task_name)
    if t = deployed_tasks[task_name]
        t
    else raise ArgumentError, "#{self} has no task called #{task_name}, known tasks: #{deployed_tasks.keys.sort.join(", ")}"
    end
end

#wait_running(blocking = false) ⇒ Object

Waits for the tasks to be ready

This is a no-op for ruby tasks as they are ready as soon as they are created


86
87
88
# File 'lib/orocos/ruby_tasks/process.rb', line 86

def wait_running(blocking = false)
    true
end