source: source/ariba/utility/messages/Message.cpp

Last change on this file was 12060, checked in by hock@…, 11 years ago

Reintegrate branch: 20130111-hock-message_classes

improvements:

  • new message classes (reboost, zero-copy)
  • "fast path" for direct links (skip overlay layer)
  • link-properties accessible from the application
  • SystemQueue can call boost::bind functions
  • protlib compatibility removed (32bit overhead saved in every message)
  • addressing2
  • AddressDiscovery discoveres only addresses on which we're actually listening
  • ariba serialization usage reduced (sill used in OverlayMsg)
  • Node::connect, easier and cleaner interface to start-up ariba from the application
  • ariba configs via JSON, XML, etc (boost::property_tree)
  • keep-alive overhead greatly reduced
  • (relayed) overlay links can actually be closed now
  • lost messages are detected in most cases
  • notification to the application when link is transformed into direct-link
  • overlay routing: send message to second best hop if it would be dropped otherwise
  • SequenceNumbers (only mechanisms, so for: upward compatibility)
  • various small fixes


regressions:

  • bluetooth is not yet working again
  • bootstrap modules deactivated
  • liblog4xx is not working (use cout-logging)

This patch brings great performance and stability improvements at cost of backward compatibility.
Also bluetooth and the bootstrap modules have not been ported to the new interfaces, yet.

File size: 4.3 KB
Line 
1// [License]
2// The Ariba-Underlay Copyright
3//
4// Copyright (c) 2008-2009, Institute of Telematics, UniversitÀt Karlsruhe (TH)
5//
6// Institute of Telematics
7// UniversitÀt Karlsruhe (TH)
8// Zirkel 2, 76128 Karlsruhe
9// Germany
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// THIS SOFTWARE IS PROVIDED BY THE INSTITUTE OF TELEMATICS ``AS IS'' AND
22// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARIBA PROJECT OR
25// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32//
33// The views and conclusions contained in the software and documentation
34// are those of the authors and should not be interpreted as representing
35// official policies, either expressed or implied, of the Institute of
36// Telematics.
37// [License]
38
39#include "Message.h"
40#include "ariba/utility/serialization/Data.hpp"
41#include "ariba/utility/serialization/DataStream.hpp"
42
43#include "ariba/utility/logging/Logging.h"
44
45NAMESPACE_BEGIN
46
47vsznDefault(Message); // virtual serialization
48
49/*
50Message::Message() :
51 root(), payload(), srcAddr(NULL), destAddr(NULL), ctrlInfo(NULL) {
52}
53*/
54
55Message::~Message() {
56 dropPayload();
57// if ( srcAddr != NULL) delete srcAddr;
58// if ( destAddr != NULL) delete destAddr;
59// if ( ctrlInfo != NULL ) delete ctrlInfo;
60}
61
62/* Returns a short human-readable description of this message
63 * @return A short human-readable description of this message
64 */
65const char* Message::getDescription() const {
66 return "<DEFAULT_MESSAGE>";
67}
68
69/* Returns a return message, that can be used to send a message
70 * back to the recipient or NULL if no message can be returned.
71 * The default implementation returns NULL.
72 * @return Return message.
73 */
74Message* Message::createReturnMessage() const {
75 return NULL;
76}
77
78std::string Message::toString() const {
79 std::stringstream buffer;
80 buffer << *this;
81 return buffer.str();
82}
83
84
85reboost::message_t Message::wrap_up_for_sending()
86{
87 assert( ! wrapped_up );
88 wrapped_up = true;
89
90 //// Adapt to new message system ////
91 Data data = data_serialize(this, DEFAULT_V);
92 reboost::shared_buffer_t buf(data.getBuffer(), data.getLength() / 8);
93
94 newstyle_payload.push_front(buf);
95
96 return newstyle_payload;
97}
98
99reboost::shared_buffer_t Message::serialize_into_shared_buffer()
100{
101 assert ( newstyle_payload.length() == 0 );
102
103 //// Adapt to new message system ////
104 Data data = data_serialize(this, DEFAULT_V);
105 reboost::shared_buffer_t buf(data.getBuffer(), data.getLength() / 8);
106
107 return buf;
108}
109
110
111reboost::shared_buffer_t Message::deserialize_from_shared_buffer(reboost::shared_buffer_t buff)
112{
113 // NOTE: legacy payload is not allowed when using shared buffers
114 this->legacy_payload_disabled = true;
115
116 assert( buff.size() > 0 );
117
118 // const_cast is necessary here, but without legacy payload we should be save here (more or less)
119 Data dat(const_cast<uint8_t*>(buff.data()), buff.size() * 8);
120
121 size_t len = this->SERIALIZATION_METHOD_NAME(DESERIALIZE, dat) / 8;
122
123 // return remaining sub-buffer
124 return buff(len);
125}
126
127
128
129NAMESPACE_END
130
131std::ostream& operator<<(std::ostream& stream, const ariba::utility::Message& msg ) {
132 using_serialization;
133 stream << "msg(type=" << typeid(msg).name() << ",";
134 stream << "len=" << (data_length(&msg)/8) << ",";
135 Data data = data_serialize(&msg);
136 stream << "data=" << data;
137 data.release();
138 stream << ")";
139 return stream;
140}
Note: See TracBrowser for help on using the repository browser.