Orocos Real-Time Toolkit  2.6.0
Public Member Functions | Protected Member Functions | Protected Attributes
RTT::ExecutionEngine Class Reference

An execution engine serialises (executes one after the other) the execution of all commands, programs, state machines and incomming events for a task. More...

#include <rtt/ExecutionEngine.hpp>

Inheritance diagram for RTT::ExecutionEngine:
RTT::base::RunnableInterface RTT::internal::GlobalEngine

List of all members.

Public Member Functions

 ExecutionEngine (base::TaskCore *owner=0)
 Create an execution engine with a internal::CommandProcessor, scripting::ProgramProcessor and StateMachineProcessor.
base::TaskCoregetParent ()
 The base::TaskCore which created this ExecutionEngine.
virtual void addChild (base::TaskCore *tc)
 Add a base::TaskCore to execute.
virtual void removeChild (base::TaskCore *tc)
 Remove a base::TaskCore from execution.
base::TaskCoregetTaskCore () const
 Returns the owner of this execution engine.
virtual bool process (base::DisposableInterface *c)
 Queue and execute (process) a given message.
virtual bool runFunction (base::ExecutableInterface *f)
 Run a given function in step() or loop().
virtual bool removeFunction (base::ExecutableInterface *f)
 Remove a running function added with runFunction.
virtual bool removeSelfFunction (base::ExecutableInterface *f)
 Self-removal for a running function added with runFunction.
void waitForMessages (const boost::function< bool(void)> &pred)
 Call this if you wish to block on a message arriving in the Execution Engine.
void waitForFunctions (const boost::function< bool(void)> &pred)
 Call this if you wish to block on a function completing in the Execution Engine.
bool stopTask (base::TaskCore *task)
 Stops executing the updateHook of task.
void setExceptionTask ()
 Set the 'owner' task in the exception state.
virtual void loop ()
 The method that will be executed once when this class is run in a non periodic thread.
virtual os::ThreadInterfacegetThread () const
 Get the thread this object is run in.
ActivityInterfacegetActivity () const
 Query for the task this interface is run in.
virtual void setActivity (ActivityInterface *task)
 Set the task this interface is run in.

Protected Member Functions

void waitForMessagesInternal (boost::function< bool(void)> const &pred)
 Call this if you wish to block on a message arriving in the Execution Engine.
void waitAndProcessMessages (boost::function< bool(void)> const &pred)
 Call this if you wish to block on a message arriving in the Execution Engine and execute it.
void waitAndProcessFunctions (boost::function< bool(void)> const &pred)
 Call this if you wish to block on a function completing in the Execution Engine and execute it.
void processMessages ()
void processFunctions ()
void processChildren ()
virtual bool initialize ()
 The method that will be called before the first periodical execution of step() ( or non periodical execution of loop() ), when the thread is started.
virtual void step ()
 Executes (in that order) Messages, Functions and updateHook() functions of this TaskContext and its children.
virtual bool breakLoop ()
 This method is called by the framework to break out of the loop() method.
virtual void finalize ()
 The method that will be called after the last periodical execution of step() ( or non periodical execution of loop() ), when the RunnableInterface is stopped.
virtual bool hasWork ()
 This method is for 'intelligent' activity implementations that wish to see if it is required to call step() (again).

Protected Attributes

base::TaskCoretaskc
 The parent or 'owner' of this ExecutionEngine, may be null.
internal::MWSRQueue
< base::DisposableInterface * > * 
mqueue
 Our Message queue.
std::vector< base::TaskCore * > children
internal::MWSRQueue
< base::ExecutableInterface * > * 
f_queue
 Stores all functions we're executing.
os::Mutex msg_lock
os::Condition msg_cond

Detailed Description

An execution engine serialises (executes one after the other) the execution of all commands, programs, state machines and incomming events for a task.

Any function executing in the same execution engine is guaranteed to be thread-safe with respect to other functions executing in the same execution engine.

The ExecutionEngine bundles a internal::CommandProcessor, scripting::ProgramProcessor, scripting::StateMachineProcessor and MessageProcessor.

Changing the Execution Policy
One can subclass this class in order to change the run-time behaviour. Use base::TaskCore::setExecutionEngine in order to install a new ExecutionEngine in a component. All Members of this class are protected and thus accessible in a subclass.

Definition at line 77 of file ExecutionEngine.hpp.


Constructor & Destructor Documentation

Create an execution engine with a internal::CommandProcessor, scripting::ProgramProcessor and StateMachineProcessor.

Parameters:
ownerThe base::TaskCore in which this execution engine executes. It may be null, in that case no base::TaskCore owns this execution engine.

Definition at line 70 of file ExecutionEngine.cpp.


Member Function Documentation

bool RTT::ExecutionEngine::breakLoop ( ) [protected, virtual]

This method is called by the framework to break out of the loop() method.

Reimplement this method to signal loop() to return and return true on success. When this method is not reimplemented by you, it will always return false, denoting that the loop can not be broken. If breakLoop() returns true, the caller will wait until loop() returns.

Returns:
true if the loop could be notified to return.

Reimplemented from RTT::base::RunnableInterface.

Definition at line 388 of file ExecutionEngine.cpp.

References RTT::base::TaskCore::breakUpdateHook(), and taskc.

os::ThreadInterface * RTT::RunnableInterface::getThread ( ) const [virtual, inherited]

Get the thread this object is run in.

Returns:
a pointer to the thread or 0 if not run by a thread.

Definition at line 78 of file CoreRunnableInterface.cpp.

References RTT::base::ActivityInterface::thread().

bool RTT::ExecutionEngine::hasWork ( ) [protected, virtual]

This method is for 'intelligent' activity implementations that wish to see if it is required to call step() (again).

By default, false is returned. You should only return true in case there is a temporary reason to (re-)run step.

Returns:
true if this object should be run.
See also:
extras::SequentialActivity implementation to see how this can be of use.

Reimplemented from RTT::base::RunnableInterface.

Definition at line 213 of file ExecutionEngine.cpp.

References RTT::internal::AtomicMWSRQueue< T >::isEmpty(), and mqueue.

void RTT::RunnableInterface::loop ( ) [virtual, inherited]

The method that will be executed once when this class is run in a non periodic thread.

The default implementation calls step() once.

Reimplemented in RTT::os::Timer.

Definition at line 60 of file CoreRunnableInterface.cpp.

References RTT::base::RunnableInterface::step().

Referenced by RTT::extras::SlaveActivity::execute(), and RTT::Activity::loop().

Queue and execute (process) a given message.

The message is executed in step() or loop() directly after all other queued ActionInterface objects. The constructor parameter queue_size limits how many messages can be queued in between step()s or loop().

Returns:
true if the message got accepted, false otherwise.
false when the MessageProcessor is not running or does not accept messages.
See also:
acceptMessages

Definition at line 240 of file ExecutionEngine.cpp.

References RTT::os::Condition::broadcast(), RTT::internal::AtomicMWSRQueue< T >::enqueue(), RTT::base::TaskCore::FatalError, RTT::base::RunnableInterface::getActivity(), mqueue, taskc, and RTT::base::ActivityInterface::trigger().

Referenced by RTT::internal::LocalOperationCallerImpl< FunctionT >::executeAndDispose(), and removeFunction().

Remove a running function added with runFunction.

This method is only required if the function is to be destroyed and is still present in the Engine.

Definition at line 163 of file ExecutionEngine.cpp.

References RTT::base::RunnableInterface::getActivity(), RTT::base::ActivityInterface::isActive(), RTT::base::ExecutableInterface::isLoaded(), process(), removeSelfFunction(), RTT::base::ExecutableInterface::unloaded(), and waitForMessages().

Referenced by RTT::scripting::ScriptingService::unloadProgram(), and RTT::scripting::StateMachine::~StateMachine().

Self-removal for a running function added with runFunction.

You must call this variant in case you want yourself to be removed. Equivalent to returning false in ExecutableInterface::execute().

Definition at line 189 of file ExecutionEngine.cpp.

References RTT::internal::AtomicMWSRQueue< T >::dequeue(), RTT::internal::AtomicMWSRQueue< T >::enqueue(), f_queue, and RTT::internal::AtomicMWSRQueue< T >::size().

Referenced by removeFunction().

Run a given function in step() or loop().

The function may only be destroyed after the ExecutionEngine is stopped or removeFunction() was invoked. The number of functions the Processor can run in parallel can be increased with setMaxFunctions().

Returns:
false if the Engine is not running or the 'pending' queue is full.
See also:
removeFunction(), setMaxFunctions()

Definition at line 133 of file ExecutionEngine.cpp.

References RTT::internal::AtomicMWSRQueue< T >::enqueue(), f_queue, RTT::base::TaskCore::FatalError, RTT::base::RunnableInterface::getActivity(), RTT::base::ExecutableInterface::loaded(), taskc, and RTT::base::ActivityInterface::trigger().

Referenced by RTT::scripting::ScriptingService::loadFunctions(), and RTT::scripting::ScriptingService::loadProgram().

void RTT::RunnableInterface::setActivity ( ActivityInterface task) [virtual, inherited]

Set the task this interface is run in.

A Zero means no task is running it.

Parameters:
taskThe ActivityInterface running this interface.

Definition at line 69 of file CoreRunnableInterface.cpp.

References RTT::base::ActivityInterface::disableRun().

Referenced by RTT::base::ActivityInterface::run().

Stops executing the updateHook of task.

This is an explicit synchronisation point, which guarantees that updateHook is no longer executed when this function returns true.

Parameters:
taskThe Task calling this function and whose updateHook should no longer be executed.
Returns:
true if it's updateHook() is no longer being executed, false otherwise.

Definition at line 398 of file ExecutionEngine.cpp.

References RTT::base::RunnableInterface::getActivity(), and RTT::base::ActivityInterface::start().

void RTT::ExecutionEngine::waitAndProcessFunctions ( boost::function< bool(void)> const &  pred) [protected]

Call this if you wish to block on a function completing in the Execution Engine and execute it.

Parameters:
predAs long as !pred() waits and processes functions. If pred() == true when entering this function, then no functions will be processed and this function returns immediately.

This function is for internal use only and is required for asynchronous function invocations.

Note:
waitAndProcessFunctions will call in turn this->processFunctions() and may as a consequence recurse if we get an asynchronous call-back.

Definition at line 302 of file ExecutionEngine.cpp.

References RTT::os::Condition::wait().

Referenced by waitForFunctions().

void RTT::ExecutionEngine::waitAndProcessMessages ( boost::function< bool(void)> const &  pred) [protected]

Call this if you wish to block on a message arriving in the Execution Engine and execute it.

Parameters:
predAs long as !pred() waits and processes messages. If pred() == true when entering this function, then no messages will be processed and this function returns immediately.

This function is for internal use only and is required for asynchronous method invocations.

Note:
waitAndProcessMessages will call in turn this->processMessages() and may as a consequence recurse if we get an asynchronous call-back.

Definition at line 284 of file ExecutionEngine.cpp.

References RTT::os::Condition::wait().

Referenced by waitForMessages().

void RTT::ExecutionEngine::waitForFunctions ( const boost::function< bool(void)> &  pred)

Call this if you wish to block on a function completing in the Execution Engine.

Each time a function completes, waitForFunctions will return when pred() returns true.

Parameters:
predAs long as !pred() blocks the calling thread. If pred() == true when entering this function, returns immediately.

This function is for internal use only and is required for asynchronous function invocations.

Definition at line 263 of file ExecutionEngine.cpp.

References RTT::base::RunnableInterface::getActivity(), waitAndProcessFunctions(), and waitForMessagesInternal().

void RTT::ExecutionEngine::waitForMessages ( const boost::function< bool(void)> &  pred)

Call this if you wish to block on a message arriving in the Execution Engine.

Each time one or more messages are processed, waitForMessages will return when pred() returns true.

Parameters:
predAs long as !pred() blocks the calling thread. If pred() == true when entering this function, returns immediately.

This function is for internal use only and is required for asynchronous method invocations.

Definition at line 254 of file ExecutionEngine.cpp.

References RTT::base::RunnableInterface::getActivity(), waitAndProcessMessages(), and waitForMessagesInternal().

Referenced by removeFunction().

void RTT::ExecutionEngine::waitForMessagesInternal ( boost::function< bool(void)> const &  pred) [protected]

Call this if you wish to block on a message arriving in the Execution Engine.

Each time one or more messages are processed, waitForMessages will return when pred() returns true.

Parameters:
predAs long as !pred() blocks the calling thread. If pred() == true when entering this function, the returns immediately.

This function is for internal use only and is required for asynchronous method invocations.

Note:
waitForMessages requires another thread to execute processMessages() and may therefor not be called from within the component's Thread. Use waitAndProcessMessages() instead.

Definition at line 272 of file ExecutionEngine.cpp.

References RTT::os::Condition::wait().

Referenced by waitForFunctions(), and waitForMessages().


The documentation for this class was generated from the following files: