summaryrefslogtreecommitdiff
path: root/TAO/tao/ZIOP/ZIOP.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/ZIOP/ZIOP.cpp')
-rw-r--r--TAO/tao/ZIOP/ZIOP.cpp226
1 files changed, 172 insertions, 54 deletions
diff --git a/TAO/tao/ZIOP/ZIOP.cpp b/TAO/tao/ZIOP/ZIOP.cpp
index 910811b7fc9..ef689281ae5 100644
--- a/TAO/tao/ZIOP/ZIOP.cpp
+++ b/TAO/tao/ZIOP/ZIOP.cpp
@@ -103,6 +103,60 @@ TAO_ZIOP_Loader::Initializer (void)
return ACE_Service_Config::process_directive (ace_svc_desc_TAO_ZIOP_Loader);
}
+const char *
+TAO_ZIOP_Loader::ziop_compressorid_name (::Compression::CompressorId st)
+{
+ switch (st)
+ {
+ case ::Compression::COMPRESSORID_NONE: return "NONE";
+ case ::Compression::COMPRESSORID_GZIP: return "GZIP";
+ case ::Compression::COMPRESSORID_PKZIP: return "PKZIP";
+ case ::Compression::COMPRESSORID_BZIP2: return "BZIP2";
+ case ::Compression::COMPRESSORID_ZLIB: return "ZLIB";
+ case ::Compression::COMPRESSORID_LZMA: return "LZMA";
+ case ::Compression::COMPRESSORID_LZO: return "LZO";
+ case ::Compression::COMPRESSORID_RZIP: return "RZIP";
+ case ::Compression::COMPRESSORID_7X: return "7X";
+ case ::Compression::COMPRESSORID_XAR: return "XAR";
+ }
+ return "Unknown";
+}
+
+void
+TAO_ZIOP_Loader::dump_msg (const char *type, const u_char *ptr,
+ size_t len, size_t original_data_length,
+ ::Compression::CompressorId compressor_id,
+ ::Compression::CompressionLevel compression_level)
+{
+ if (TAO_debug_level < 10)
+ {
+ return;
+ }
+
+ static const char digits[] = "0123456789ABCD";
+ int const byte_order = ptr[TAO_GIOP_MESSAGE_FLAGS_OFFSET] & 0x01;
+ CORBA::Double const ratio = 100 - (((CORBA::Double)len/original_data_length) *
+ (CORBA::Double) 100);
+
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) - ZIOP_Loader::dump_msg, ")
+ ACE_TEXT ("ZIOP message v%c.%c %C, %d data bytes, %s endian, ")
+ ACE_TEXT ("original_data_length = %d, ratio = %4.2f, ")
+ ACE_TEXT ("compressor = %C, compression_level = %d\n"),
+ digits[ptr[TAO_GIOP_VERSION_MAJOR_OFFSET]],
+ digits[ptr[TAO_GIOP_VERSION_MINOR_OFFSET]],
+ type,
+ len - TAO_GIOP_MESSAGE_HEADER_LEN ,
+ (byte_order == TAO_ENCAP_BYTE_ORDER) ? ACE_TEXT("my") : ACE_TEXT("other"),
+ original_data_length,
+ ratio,
+ TAO_ZIOP_Loader::ziop_compressorid_name(compressor_id),
+ compression_level));
+ ACE_HEX_DUMP ((LM_DEBUG,
+ (const char *) ptr,
+ len,
+ ACE_TEXT ("ZIOP message")));
+}
bool
TAO_ZIOP_Loader::decompress (Compression::Compressor_ptr compressor,
@@ -116,7 +170,8 @@ TAO_ZIOP_Loader::decompress (Compression::Compressor_ptr compressor,
catch (::Compression::CompressionException &e)
{
ACE_ERROR_RETURN((LM_ERROR,
- ACE_TEXT ("Decompression failed: %C\n"),
+ ACE_TEXT ("TAO (%P|%t) - TAO_ZIOP_Loader::decompress, ")
+ ACE_TEXT ("decompression failed, %C\n"),
e._info ().c_str ()),
false);
}
@@ -128,6 +183,12 @@ bool
TAO_ZIOP_Loader::decompress (ACE_Data_Block **db, TAO_Queued_Data& qd,
TAO_ORB_Core& orb_core)
{
+#if defined (TAO_HAS_ZIOP) && TAO_HAS_ZIOP == 0
+ ACE_UNUSED_ARG (db);
+ ACE_UNUSED_ARG (qd);
+ ACE_UNUSED_ARG (orb_core);
+ return true;
+#else
CORBA::Object_var compression_manager =
orb_core.resolve_compression_manager();
@@ -137,12 +198,12 @@ TAO_ZIOP_Loader::decompress (ACE_Data_Block **db, TAO_Queued_Data& qd,
if (!CORBA::is_nil(manager.in ()))
{
ZIOP::CompressedData data;
- //first set the read pointer after the header
+ // first set the read pointer after the header
size_t begin = qd.msg_block ()-> rd_ptr() - qd.msg_block ()->base ();
char * initial_rd_ptr = qd.msg_block ()-> rd_ptr();
size_t const wr = qd.msg_block ()->wr_ptr () - qd.msg_block ()->base ();
- TAO_InputCDR cdr (*db,
+ TAO_InputCDR cdr ((*db),
qd.msg_block ()->self_flags (),
begin + TAO_GIOP_MESSAGE_HEADER_LEN,
wr,
@@ -161,27 +222,37 @@ TAO_ZIOP_Loader::decompress (ACE_Data_Block **db, TAO_Queued_Data& qd,
if (decompress(compressor.in(), data.data, myout))
{
- ACE_Message_Block *mb = new ACE_Message_Block();
-
- mb->size ((size_t)(data.original_length +
- TAO_GIOP_MESSAGE_HEADER_LEN));
+ size_t new_data_length = (size_t)(data.original_length +
+ TAO_GIOP_MESSAGE_HEADER_LEN);
+ ACE_Message_Block mb (new_data_length);
qd.msg_block ()->rd_ptr (initial_rd_ptr);
-
- mb->copy(qd.msg_block ()->base () + begin,
+ mb.copy(qd.msg_block ()->base () + begin,
TAO_GIOP_MESSAGE_HEADER_LEN);
- if (mb->copy((char*)myout.get_buffer(true),
+ if (mb.copy((char*)myout.get_buffer(false),
(size_t)data.original_length) != 0)
ACE_ERROR_RETURN((LM_ERROR,
ACE_TEXT ("TAO - (%P|%t) - ")
- ACE_TEXT ("Failed to copy decompressed data : ")
+ ACE_TEXT ("TAO_ZIOP_Loader::decompress, ")
+ ACE_TEXT ("failed to copy decompressed data, ")
ACE_TEXT ("Buffer too small\n")),
false);
- //change it into a GIOP message..
- mb->base ()[0] = 0x47;
- ACE_CDR::mb_align (mb);
- *db = mb->data_block ();
+ // change it into a GIOP message..
+ mb.base ()[0] = 0x47;
+ ACE_CDR::mb_align (&mb);
+
+ if (TAO_debug_level > 9)
+ { // we're only logging ZIOP messages. Log datablock before it's
+ // replaced by it's decompressed datablock
+ this->dump_msg ("before decompression",
+ reinterpret_cast <u_char *>(qd.msg_block ()->rd_ptr ()),
+ qd.msg_block ()->length (), data.original_length,
+ data.compressorid, compressor->compression_level ());
+ }
+ //replace data block
+ *db = mb.data_block ()->duplicate ();
+ (*db)->size (new_data_length);
return true;
}
}
@@ -191,6 +262,7 @@ TAO_ZIOP_Loader::decompress (ACE_Data_Block **db, TAO_Queued_Data& qd,
}
return true;
+#endif
}
CORBA::ULong
@@ -227,7 +299,8 @@ TAO_ZIOP_Loader::compress (Compression::Compressor_ptr compressor,
catch (::Compression::CompressionException &e)
{
ACE_ERROR_RETURN((LM_ERROR,
- ACE_TEXT ("Compression failed: %C\n"),
+ ACE_TEXT ("TAO (%P|%t) - TAO_ZIOP_Loader::compress, ")
+ ACE_TEXT ("compression failed, %C\n"),
e._info ().c_str ()),
false);
}
@@ -235,17 +308,26 @@ TAO_ZIOP_Loader::compress (Compression::Compressor_ptr compressor,
return true;
}
+CORBA::ULong
+TAO_ZIOP_Loader::get_ratio (CORBA::OctetSeq& uncompressed, CORBA::OctetSeq& compressed)
+{
+ return CORBA::ULong (100 - ((CORBA::Double)compressed.length () / uncompressed.length () *
+ (CORBA::Double)100));
+}
+
bool
-TAO_ZIOP_Loader::check_min_ratio (::Compression::CompressionRatio ratio,
+TAO_ZIOP_Loader::check_min_ratio (const CORBA::ULong& this_ratio,
+ ::Compression::CompressionRatio overall_ratio,
CORBA::Long min_ratio) const
{
- bool accepted = min_ratio == 0 || ratio > min_ratio;
+ bool accepted = min_ratio == 0 ||
+ static_cast < ::Compression::CompressionRatio>(this_ratio) > min_ratio;
if (TAO_debug_level > 8)
{
ACE_ERROR ((LM_ERROR,
- ACE_TEXT ("TAO (%P|%t) - TAO_ZIOP_Loader::check_min_ratio: ")
- ACE_TEXT ("Ratio:%d Accepted:%d\n"),
- ratio, accepted));
+ ACE_TEXT ("TAO (%P|%t) - TAO_ZIOP_Loader::check_min_ratio, ")
+ ACE_TEXT ("overall_ratio = %d, this_ratio = %d, accepted = %d\n"),
+ overall_ratio, this_ratio, accepted));
}
return accepted;
}
@@ -262,13 +344,28 @@ TAO_ZIOP_Loader::get_compressor_details (
{
compressor_id = (*list)[0].compressor_id;
compression_level = (*list)[0].compression_level;
+
+ if (TAO_debug_level > 6)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) - ")
+ ACE_TEXT ("TAO_ZIOP_Loader::get_compressor_details,")
+ ACE_TEXT ("compressor policy found, compressor = %C, ")
+ ACE_TEXT ("compression_level = %d\n"),
+ TAO_ZIOP_Loader::ziop_compressorid_name (compressor_id),
+ compression_level));
+ }
+
}
else
{
- ACE_DEBUG ((LM_DEBUG,
- ACE_TEXT ("TAO (%P|%t) - ")
- ACE_TEXT ("TAO_ZIOP_Loader::get_compressor_details: ")
- ACE_TEXT ("No appropriate compressor found\n")));
+ if (TAO_debug_level > 6)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) - ")
+ ACE_TEXT ("TAO_ZIOP_Loader::get_compressor_details, ")
+ ACE_TEXT ("no appropriate compressor found\n")));
+ }
return false;
}
return true;
@@ -294,17 +391,20 @@ TAO_ZIOP_Loader::get_compression_details(
{
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("TAO (%P|%t) - ")
- ACE_TEXT ("TAO_ZIOP_Loader::get_compression_details: ")
- ACE_TEXT ("No ZIOP policy set\n")));
+ ACE_TEXT ("TAO_ZIOP_Loader::get_compression_details, ")
+ ACE_TEXT ("ZIOP enabled policy not set\n")));
}
}
}
else
{
- ACE_ERROR((LM_ERROR,
- ACE_TEXT("TAO (%P|%t) - ")
- ACE_TEXT("TAO_ZIOP_Loader::get_compression_details : ")
- ACE_TEXT("compression_enabling_policy is NIL. No ZIOP\n")));
+ if (TAO_debug_level > 6)
+ {
+ ACE_ERROR((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) - ")
+ ACE_TEXT ("TAO_ZIOP_Loader::get_compression_details, ")
+ ACE_TEXT ("compression_enabling_policy is NIL, no ZIOP\n")));
+ }
}
if (use_ziop)
@@ -320,18 +420,22 @@ TAO_ZIOP_Loader::get_compression_details(
compressor_id, compression_level);
}
}
- else
+ else
{
- ACE_ERROR((LM_ERROR,
- ACE_TEXT("TAO (%P|%t) - ")
- ACE_TEXT("TAO_ZIOP_Loader::get_compression_details : ")
- ACE_TEXT("Compression level policy not found\n")));
+ if (TAO_debug_level > 6)
+ {
+ ACE_ERROR((LM_ERROR,
+ ACE_TEXT("TAO (%P|%t) - ")
+ ACE_TEXT("TAO_ZIOP_Loader::get_compression_details, ")
+ ACE_TEXT("compressor ID/Level list policy not found\n")));
+ }
+ use_ziop = false;
}
}
return use_ziop;
}
-void
+bool
TAO_ZIOP_Loader::complete_compression (Compression::Compressor_ptr compressor,
TAO_OutputCDR &cdr,
ACE_Message_Block& mb,
@@ -343,39 +447,50 @@ TAO_ZIOP_Loader::complete_compression (Compression::Compressor_ptr compressor,
{
if (low_value > 0 && original_data_length > low_value)
{
- CORBA::OctetSeq myout;
+ CORBA::OctetSeq output;
CORBA::OctetSeq input (original_data_length, &mb);
- myout.length (original_data_length);
-
- bool compressed = this->compress (compressor, input, myout);
+ output.length (original_data_length);
- if (compressed &&
- (myout.length () < original_data_length) &&
- (this->check_min_ratio (compressor->compression_ratio(),
- min_ratio)))
+ if (!this->compress (compressor, input, output))
+ return false;
+ else if ((output.length () < original_data_length) &&
+ (this->check_min_ratio (this->get_ratio (input, output),
+ compressor->compression_ratio(),
+ min_ratio)))
{
mb.wr_ptr (mb.rd_ptr ());
cdr.current_alignment (mb.wr_ptr() - mb.base ());
ZIOP::CompressedData data;
data.compressorid = compressor_id;
data.original_length = input.length();
- data.data = myout;
+ data.data = output;
cdr << data;
mb.rd_ptr(initial_rd_ptr);
int begin = (mb.rd_ptr() - mb.base ());
mb.data_block ()->base ()[0 + begin] = 0x5A;
mb.data_block ()->base ()[TAO_GIOP_MESSAGE_SIZE_OFFSET + begin] =
cdr.length() - TAO_GIOP_MESSAGE_HEADER_LEN;
+
+ if (TAO_debug_level > 9)
+ {
+ this->dump_msg ("after compression", reinterpret_cast <u_char *>(mb.rd_ptr ()),
+ mb.length (), data.original_length,
+ data.compressorid, compressor->compression_level ());
+ }
+
}
+ else
+ return false;
}
else if (TAO_debug_level > 8)
{
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("TAO (%P|%t) - ")
- ACE_TEXT ("TAO_ZIOP_Loader::compress_data: ")
- ACE_TEXT ("No compression used")
- ACE_TEXT ("->Low Value Policy applied\n")));
+ ACE_TEXT ("TAO_ZIOP_Loader::compress_data, ")
+ ACE_TEXT ("no compression used, ")
+ ACE_TEXT ("low value policy applied\n")));
}
+ return true;
}
bool
@@ -386,6 +501,8 @@ TAO_ZIOP_Loader::compress_data (TAO_OutputCDR &cdr,
Compression::CompressorId compressor_id,
Compression::CompressionLevel compression_level)
{
+ bool compressed = true;
+
cdr.consolidate ();
ACE_Message_Block* current = const_cast <ACE_Message_Block*> (cdr.current ());
@@ -409,14 +526,14 @@ TAO_ZIOP_Loader::compress_data (TAO_OutputCDR &cdr,
Compression::Compressor_var compressor =
manager->get_compressor (compressor_id, compression_level);
- complete_compression(compressor.in (), cdr, *current,
+ compressed = complete_compression(compressor.in (), cdr, *current,
initial_rd_ptr, low_value, min_ratio,
original_data_length, compressor_id);
}
}
- //set back read pointer in case no compression was done...
+ // set back read pointer in case no compression was done...
current->rd_ptr(initial_rd_ptr);
- return true;
+ return compressed;
}
bool
@@ -428,7 +545,8 @@ TAO_ZIOP_Loader::marshal_data (TAO_OutputCDR &cdr, TAO_Stub& stub)
return true;
#else
CORBA::Boolean use_ziop = false;
- Compression::CompressorId compressor_id = Compression::COMPRESSORID_ZLIB;
+
+ Compression::CompressorId compressor_id = Compression::COMPRESSORID_NONE;
Compression::CompressionLevel compression_level = 0;
CORBA::Policy_var compression_enabling_policy =
@@ -472,7 +590,7 @@ TAO_ZIOP_Loader::marshal_data (TAO_OutputCDR& cdr, TAO_ORB_Core& orb_core)
return true;
#else
CORBA::Boolean use_ziop = false;
- Compression::CompressorId compressor_id = Compression::COMPRESSORID_ZLIB;
+ Compression::CompressorId compressor_id = Compression::COMPRESSORID_NONE;
Compression::CompressionLevel compression_level = 0;
CORBA::Policy_var compression_enabling_policy =