Public Member Functions | Private Member Functions | Private Attributes

TAO_On_Demand_Fragmentation_Strategy Class Reference

#include <On_Demand_Fragmentation_Strategy.h>

Inheritance diagram for TAO_On_Demand_Fragmentation_Strategy:
Inheritance graph
[legend]
Collaboration diagram for TAO_On_Demand_Fragmentation_Strategy:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 TAO_On_Demand_Fragmentation_Strategy (TAO_Transport *transport, ACE_CDR::ULong max_message_size)
 Constructor.
virtual ~TAO_On_Demand_Fragmentation_Strategy (void)
virtual int fragment (TAO_OutputCDR &cdr, ACE_CDR::ULong pending_alignment, ACE_CDR::ULong pending_length)
 Fragment the (potentially partially) encoded GIOP message.

Private Member Functions

 TAO_On_Demand_Fragmentation_Strategy (TAO_On_Demand_Fragmentation_Strategy const &)
void operator= (TAO_On_Demand_Fragmentation_Strategy const &)

Private Attributes

TAO_Transport *const transport_
 Pointer to the underlying transport object.
ACE_CDR::ULong const max_message_size_
 Size of GIOP message at which fragmentation will occur.

Detailed Description

Definition at line 43 of file On_Demand_Fragmentation_Strategy.h.


Constructor & Destructor Documentation

TAO_On_Demand_Fragmentation_Strategy::TAO_On_Demand_Fragmentation_Strategy ( TAO_Transport transport,
ACE_CDR::ULong  max_message_size 
)

Constructor.

TAO_On_Demand_Fragmentation_Strategy::~TAO_On_Demand_Fragmentation_Strategy ( void   )  [virtual]

Definition at line 19 of file On_Demand_Fragmentation_Strategy.cpp.

{
}

TAO_On_Demand_Fragmentation_Strategy::TAO_On_Demand_Fragmentation_Strategy ( TAO_On_Demand_Fragmentation_Strategy const &   )  [private]

Member Function Documentation

int TAO_On_Demand_Fragmentation_Strategy::fragment ( TAO_OutputCDR cdr,
ACE_CDR::ULong  pending_alignment,
ACE_CDR::ULong  pending_length 
) [virtual]

Fragment the (potentially partially) encoded GIOP message.

Fragmentation the contents of the CDR output stream cdr into smaller chunks of data of size that fits within the configured ORB fragmentation threshold, and send each fragment "over the wire."

Note:
Fragmentation will only occur if the CDR stream length will surpass the configured fragmentation threshold when marshaling the pending set of data.
Parameters:
cdr Output CDR stream.
pending_alignment Size of alignment boundary for next data to be marshaled (e.g. 4 for a CORBA::ULong).
pending_length Size of next data to be marshaled (e.g. 2 for a CORBA::UShort).
Returns:
Zero on success.

Implements TAO_GIOP_Fragmentation_Strategy.

Definition at line 25 of file On_Demand_Fragmentation_Strategy.cpp.

{
  if (this->transport_ == 0)
    return 0;  // No transport.  Can't fragment.

  TAO_GIOP_Message_Version giop_version;

  cdr.get_version (giop_version);

  // GIOP fragments are supported in GIOP 1.1 and better, but TAO only
  // supports them in 1.2 or better since GIOP 1.1 fragments do not
  // have a fragment message header.
  if (giop_version.major == 1 && giop_version.minor < 2)
    return -1;

  // Determine increase in CDR stream length if pending data is
  // marshaled, taking into account the alignment for the given data
  // type.
  ACE_CDR::ULong const total_pending_length =
    ACE_align_binary (cdr.total_length (), pending_alignment)
    + pending_length;

  // Except for the last fragment, fragmented GIOP messages must
  // always be aligned on an 8-byte boundary.  Padding will be added
  // if necessary.
  ACE_CDR::ULong const aligned_length =
    ACE_align_binary (total_pending_length, ACE_CDR::MAX_ALIGNMENT);

  // this->max_message_size_ must be >= 24 bytes, i.e.:
  //   12 for GIOP protocol header
  //  + 4 for GIOP fragment header
  //  + 8 for payload (including padding)
  // since fragments must be aligned on an 8 byte boundary.
  if (aligned_length > this->max_message_size_)
    {
      // Pad the outgoing fragment if necessary.
      if (cdr.align_write_ptr (ACE_CDR::MAX_ALIGNMENT) != 0)
        return -1;

      // More fragments to come.
      cdr.more_fragments (true);

      if (TAO_debug_level > 0)
        ACE_DEBUG ((LM_DEBUG,
                    "TAO (%P|%t) - On_Demand_Fragmentation_Strategy::fragment, "
                    "sending fragment of size %d\n",
                    cdr.total_length ()));

      // Send the current CDR stream contents through the transport,
      // making sure to switch on the the GIOP flags "more fragments"
      // bit.
      if (this->transport_->send_message (cdr,
                                          cdr.stub (),
                                          cdr.message_semantics (),
                                          cdr.timeout ()) == -1

          // Now generate a fragment header.
          || this->transport_->messaging_object ()->generate_fragment_header (
               cdr,
               cdr.request_id ()) != 0)
        return -1;
    }

  return 0;
}

void TAO_On_Demand_Fragmentation_Strategy::operator= ( TAO_On_Demand_Fragmentation_Strategy const &   )  [private]

Member Data Documentation

Size of GIOP message at which fragmentation will occur.

Definition at line 69 of file On_Demand_Fragmentation_Strategy.h.

Pointer to the underlying transport object.

Definition at line 66 of file On_Demand_Fragmentation_Strategy.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines