what's new in sobjectizer 5.5.9

17
What’s new in SObjectizer-5.5.9 SObjectizer Team, Oct 2015 A Short Overview

Upload: yauheni-akhotnikau

Post on 06-Jan-2017

213 views

Category:

Software


3 download

TRANSCRIPT

Page 1: What's new in SObjectizer 5.5.9

What’s new in SObjectizer-5.5.9

SObjectizer Team, Oct 2015

A Short Overview

Page 2: What's new in SObjectizer 5.5.9

There are several new features in SObjectizer v.5.5.9.

Three of them could be seen as important additions to SObjectizer’s capabilities:

● an ability to use an arbitrary user type as a message type;● new class wrapped_env_t;● an ability to trace message delivery process.

There are also several improvements for existing features.

This presentation briefly describes all of them.

SObjectizer Team, Oct 2015

Page 3: What's new in SObjectizer 5.5.9

Arbitrary user type as message type

SObjectizer Team, Oct 2015

Page 4: What's new in SObjectizer 5.5.9

Until v.5.5.9 all messages must have been derived from so_5::rt::message_t.

Even if an agent had to send just one int-value to another agent that int-value had to be a member of dedicated C++ class/struct:// Definition of message-related stuff.enum class engine_action { turn_on, speed_up, slow_down, turn_off };struct msg_engine_action : public so_5::rt::message_t { engine_action m_action; msg_engine_action( engine_action action ) : m_action{ action } {}};// Message sending...so_5::send_to_agent< msg_engine_action >( engine_agent, engine_action::turn_on );// Message processing...void engine_agent::evt_engine_action( const msg_engine_action & msg ) { switch( msg.m_action ) {...}}

SObjectizer Team, Oct 2015

Page 5: What's new in SObjectizer 5.5.9

Since v.5.5.9 it is possible to use arbitrary user-defined types as types of messages.

Inheritance from so_5::rt::message_t is not mandatory anymore:

// Definition of message-related stuff.enum class engine_action { turn_on, speed_up, slow_down, turn_off };

// Message sending...so_5::send_to_agent< engine_action >( engine_agent, engine_action::turn_on );// Message processing...void engine_agent::evt_engine_action( const engine_action & action ) { switch( action ) {...}}

SObjectizer Team, Oct 2015

Page 6: What's new in SObjectizer 5.5.9

The only requirement for such types is very simple: a type T can be used as type of message if T is MoveConstructible.

It is because SObjectizer creates an instance of an envelope of special type so_5::rt::user_type_message_t<T> and temporary object of type T is used to initialize payload field inside that envelope:

template< typename T >struct user_type_message_t : public message_t { const T m_payload;

template< typename... ARGS > user_type_message_t( ARGS &&... args ) : m_payload( T{ std::forward< ARGS >( args )... } ) {}};

SObjectizer Team, Oct 2015

Page 7: What's new in SObjectizer 5.5.9

The messages of arbitrary user types are first-class citizens in SObjectizer v.5.5.9.

They can be used in asynchronous and synchronous interactions.

Delivery filters and message limits can be specified for user-type messages.

But signals must still be present as structs/classesderived from so_5::rt::signal_t.

SObjectizer Team, Oct 2015

Page 10: What's new in SObjectizer 5.5.9

A traditional way of launching SObjectizer Environment via so_5::launch() is simple and useful.

But only if an application is built on top of SObjectizer only.

Usage of so_5::launch() could be not very convenient in other cases.

For example if an application uses some form of message loop for handling GUI events.

An attempt to use so_5::launch() in such cases could look like...

SObjectizer Team, Oct 2015

Page 11: What's new in SObjectizer 5.5.9

A possible way of using so_5::launch() with classical message loop:

int main(){ so_5::rt::environment_t * env_ptr = nullptr; // To be set inside launch(); so_5::launch( [&]( so_5::rt::environment_t & env ) { env_ptr = &env; ... // Some SO Environment initialization code. } );

... // Some application-specific initialization code.

while(!GetMessage(...)) ProcessMessage(...);

env_ptr->stop(); // Stopping SO Environment. // NOTE: there is no way to wait for a complete finish of SO Environment work! ... // Some application-specific deinitialization code.}

SObjectizer Team, Oct 2015

Page 12: What's new in SObjectizer 5.5.9

It is easy to see that this scenario is not simple and straightforward.

It is just an opposite: fragile and error prone.

So to simplify usage of SObjectizer with other frameworks and events/messages handling loops in one application a new class has been introduced in v.5.5.9: so_5::wrapped_env_t.

SObjectizer Team, Oct 2015

Page 13: What's new in SObjectizer 5.5.9

A possible way of using so_5::wrapped_env_t with classical message loop:

int main(){ so_5::wrapped_env_t env; // Empty SO Environment will be started here. env.environment().introduce_coop( []( so_5::rt::coop_t & coop ) { ... // Some SO Environment initialization code. } );

... // Some application-specific initialization code.

while(!GetMessage(...)) ProcessMessage(...);

env.stop_then_join(); // Stopping SO Environment and wait for complete finish. ... // Some application-specific deinitialization code.}

SObjectizer Team, Oct 2015

Page 14: What's new in SObjectizer 5.5.9

More information about so_5::wrapped_env_t and details of its work can be found in the corresponding Wiki-section.

SObjectizer Team, Oct 2015

Page 15: What's new in SObjectizer 5.5.9

Message Delivery Tracing

SObjectizer Team, Oct 2015

Page 16: What's new in SObjectizer 5.5.9

A new mechanism for simplification of debugging SObjectizer’s application has been added in v.5.5.9: message delivery tracing.

This mechanism can be activated on the start of SObjectizer Environment. After activation of message delivery tracing a full log of messages delivery will be formed.

This log will contain traces of all important stages of message processing: pushing of a message to event queues of subscribers, rejection of a message by a delivery filter, searching of an event handler for a message, overlimit reactions...

SObjectizer Team, Oct 2015

Page 17: What's new in SObjectizer 5.5.9

A new example has been added to the SObjectizer distributive: chstate_with_tracing. This example shows how message traces could look (under GCC v.5.2.0):

[tid=3][mbox_id=4] deliver_message.push_to_queue [msg_type=N17a_state_swither_t16greeting_messageE][envelope_ptr=0x5565a0] ↳ [payload_ptr=0x5565b0][overlimit_deep=1][agent_ptr=0x556320][tid=2][agent_ptr=0x556320] demand_handler_on_message.find_handler [mbox_id=4] ↳ [msg_type=N17a_state_swither_t16greeting_messageE][envelope_ptr=0x5565a0][payload_ptr=0x5565b0] ↳ [state=<DEFAULT>][evt_handler=0x55ab38]*** 0) greeting: Hello, World!, ptr: 0x5565b0[tid=3][mbox_id=4] deliver_message.push_to_queue [msg_type=N17a_state_swither_t19change_state_signalE][signal] ↳ [overlimit_deep=1][agent_ptr=0x556320][tid=2][agent_ptr=0x556320] demand_handler_on_message.find_handler [mbox_id=4] ↳ [msg_type=N17a_state_swither_t19change_state_signalE][signal][state=<DEFAULT>][evt_handler=0x55aaf8][tid=3][mbox_id=4] deliver_message.push_to_queue [msg_type=N17a_state_swither_t16greeting_messageE][envelope_ptr=0x5565a0] ↳ [payload_ptr=0x5565b0][overlimit_deep=1][agent_ptr=0x556320][tid=2][agent_ptr=0x556320] demand_handler_on_message.find_handler [mbox_id=4] ↳ [msg_type=N17a_state_swither_t16greeting_messageE][envelope_ptr=0x5565a0] ↳ [payload_ptr=0x5565b0][state=state_1][evt_handler=NONE]

SObjectizer Team, Oct 2015