You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by jp...@apache.org on 2018/03/15 17:51:33 UTC

[trafficserver] branch master updated: Remove inefficient use of std::string in C++ transformation plugins.

This is an automated email from the ASF dual-hosted git repository.

jpeach pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new 13e5d22  Remove inefficient use of std::string in C++ transformation plugins.
13e5d22 is described below

commit 13e5d2294b121896a55c70c9f267971ba172d750
Author: Walt Karas <wk...@yahoo-inc.com>
AuthorDate: Thu Mar 8 23:35:18 2018 +0000

    Remove inefficient use of std::string in C++ transformation plugins.
    
    Change 'const std::string &' parameters to virtual member functions of the TranformationPlugin class to ts::string_view.  This
    allows derived classes of TranformationPlugin to avoid using std::string in some cases, resulting in less copying and dynamic
    memory allocation.
---
 .../DelayTransformationPlugin.cc                       |  4 ++--
 .../gzip_transformation/GzipTransformationPlugin.cc    |  3 ++-
 .../NullTransformationPlugin.cc                        |  4 ++--
 example/cppapi/post_buffer/PostBuffer.cc               |  5 +++--
 lib/cppapi/GzipDeflateTransformation.cc                | 11 +++++------
 lib/cppapi/GzipInflateTransformation.cc                |  9 ++++-----
 lib/cppapi/TransformationPlugin.cc                     |  8 ++++----
 .../include/atscppapi/GzipDeflateTransformation.h      |  9 +++------
 .../include/atscppapi/GzipInflateTransformation.h      | 10 +++-------
 lib/cppapi/include/atscppapi/TransformationPlugin.h    | 18 ++++++------------
 plugins/experimental/webp_transform/ImageTransform.cc  | 11 ++++-------
 11 files changed, 38 insertions(+), 54 deletions(-)

diff --git a/example/cppapi/delay_transformation_plugin/DelayTransformationPlugin.cc b/example/cppapi/delay_transformation_plugin/DelayTransformationPlugin.cc
index bd83445..b1fcca7 100644
--- a/example/cppapi/delay_transformation_plugin/DelayTransformationPlugin.cc
+++ b/example/cppapi/delay_transformation_plugin/DelayTransformationPlugin.cc
@@ -17,6 +17,7 @@
  */
 
 #include <iostream>
+#include <ts/string_view.h>
 #include <atscppapi/GlobalPlugin.h>
 #include <atscppapi/TransactionPlugin.h>
 #include <atscppapi/TransformationPlugin.h>
@@ -26,7 +27,6 @@
 #include "ts/ts.h"
 
 using namespace atscppapi;
-using std::string;
 
 /*
  * This example demonstrates how you can pause a transformation and resume it
@@ -65,7 +65,7 @@ public:
   }
 
   void
-  consume(const string &data)
+  consume(ts::string_view data)
   {
     TS_DEBUG(TAG, "Consuming...");
     produce(data);
diff --git a/example/cppapi/gzip_transformation/GzipTransformationPlugin.cc b/example/cppapi/gzip_transformation/GzipTransformationPlugin.cc
index b4babb5..e7e5940 100644
--- a/example/cppapi/gzip_transformation/GzipTransformationPlugin.cc
+++ b/example/cppapi/gzip_transformation/GzipTransformationPlugin.cc
@@ -17,6 +17,7 @@
  */
 
 #include <iostream>
+#include <ts/string_view.h>
 #include <atscppapi/GlobalPlugin.h>
 #include <atscppapi/TransactionPlugin.h>
 #include <atscppapi/TransformationPlugin.h>
@@ -103,7 +104,7 @@ public:
   }
 
   void
-  consume(const string &data) override
+  consume(ts::string_view data) override
   {
     produce(data);
   }
diff --git a/example/cppapi/null_transformation_plugin/NullTransformationPlugin.cc b/example/cppapi/null_transformation_plugin/NullTransformationPlugin.cc
index d85732e..0fa649c 100644
--- a/example/cppapi/null_transformation_plugin/NullTransformationPlugin.cc
+++ b/example/cppapi/null_transformation_plugin/NullTransformationPlugin.cc
@@ -17,6 +17,7 @@
  */
 
 #include <iostream>
+#include <ts/string_view.h>
 #include <atscppapi/GlobalPlugin.h>
 #include <atscppapi/TransactionPlugin.h>
 #include <atscppapi/TransformationPlugin.h>
@@ -24,7 +25,6 @@
 #include <atscppapi/Logger.h>
 
 using namespace atscppapi;
-using std::string;
 
 namespace
 {
@@ -57,7 +57,7 @@ public:
   }
 
   void
-  consume(const string &data) override
+  consume(ts::string_view data) override
   {
     produce(data);
   }
diff --git a/example/cppapi/post_buffer/PostBuffer.cc b/example/cppapi/post_buffer/PostBuffer.cc
index 941de6b..feda07a 100644
--- a/example/cppapi/post_buffer/PostBuffer.cc
+++ b/example/cppapi/post_buffer/PostBuffer.cc
@@ -17,6 +17,7 @@
  */
 
 #include <iostream>
+#include <ts/string_view.h>
 #include <atscppapi/GlobalPlugin.h>
 #include <atscppapi/TransactionPlugin.h>
 #include <atscppapi/TransformationPlugin.h>
@@ -43,9 +44,9 @@ public:
   }
 
   void
-  consume(const string &data) override
+  consume(ts::string_view data) override
   {
-    buffer_.append(data);
+    buffer_.append(data.data(), data.length());
   }
 
   void
diff --git a/lib/cppapi/GzipDeflateTransformation.cc b/lib/cppapi/GzipDeflateTransformation.cc
index 43aa71c..0695489 100644
--- a/lib/cppapi/GzipDeflateTransformation.cc
+++ b/lib/cppapi/GzipDeflateTransformation.cc
@@ -19,17 +19,16 @@
  * @file GzipDeflateTransformation.cc
  */
 
-#include <string>
 #include <cstring>
 #include <vector>
 #include <zlib.h>
 #include <cinttypes>
+#include <ts/string_view.h>
 #include "atscppapi/TransformationPlugin.h"
 #include "atscppapi/GzipDeflateTransformation.h"
 #include "logging_internal.h"
 
 using namespace atscppapi::transformations;
-using std::string;
 using std::vector;
 
 namespace
@@ -81,7 +80,7 @@ GzipDeflateTransformation::~GzipDeflateTransformation()
 }
 
 void
-GzipDeflateTransformation::consume(const string &data)
+GzipDeflateTransformation::consume(ts::string_view data)
 {
   if (data.size() == 0) {
     return;
@@ -94,7 +93,7 @@ GzipDeflateTransformation::consume(const string &data)
 
   int iteration               = 0;
   state_->z_stream_.data_type = Z_ASCII;
-  state_->z_stream_.next_in   = reinterpret_cast<unsigned char *>(const_cast<char *>(data.c_str()));
+  state_->z_stream_.next_in   = reinterpret_cast<unsigned char *>(const_cast<char *>(data.data()));
   state_->z_stream_.avail_in  = data.length();
 
   // For small payloads the size can actually be greater than the original input
@@ -119,7 +118,7 @@ GzipDeflateTransformation::consume(const string &data)
 
     LOG_DEBUG("Iteration %d: Deflate compressed %ld bytes to %d bytes, producing output...", iteration, data.size(),
               bytes_to_write);
-    produce(string(reinterpret_cast<char *>(&buffer[0]), static_cast<size_t>(bytes_to_write)));
+    produce(ts::string_view(reinterpret_cast<char *>(&buffer[0]), static_cast<size_t>(bytes_to_write)));
   } while (state_->z_stream_.avail_out == 0);
 
   state_->z_stream_.next_out = nullptr;
@@ -153,7 +152,7 @@ GzipDeflateTransformation::handleInputComplete()
     if (status == Z_OK || status == Z_STREAM_END) {
       LOG_DEBUG("Iteration %d: Gzip deflate finalize had an extra %d bytes to process, status '%d'. Producing output...", iteration,
                 bytes_to_write, status);
-      produce(string(reinterpret_cast<char *>(buffer), static_cast<size_t>(bytes_to_write)));
+      produce(ts::string_view(reinterpret_cast<char *>(buffer), static_cast<size_t>(bytes_to_write)));
     } else if (status != Z_STREAM_END) {
       LOG_ERROR("Iteration %d: Gzip deflinate finalize produced an error '%d'", iteration, status);
     }
diff --git a/lib/cppapi/GzipInflateTransformation.cc b/lib/cppapi/GzipInflateTransformation.cc
index bd73b3f..e0c8f12 100644
--- a/lib/cppapi/GzipInflateTransformation.cc
+++ b/lib/cppapi/GzipInflateTransformation.cc
@@ -20,17 +20,16 @@
  * @file GzipInflateTransformation.cc
  */
 
-#include <string>
 #include <cstring>
 #include <vector>
 #include <zlib.h>
 #include <cinttypes>
+#include <ts/string_view.h>
 #include "atscppapi/TransformationPlugin.h"
 #include "atscppapi/GzipInflateTransformation.h"
 #include "logging_internal.h"
 
 using namespace atscppapi::transformations;
-using std::string;
 using std::vector;
 
 namespace
@@ -84,7 +83,7 @@ GzipInflateTransformation::~GzipInflateTransformation()
 }
 
 void
-GzipInflateTransformation::consume(const string &data)
+GzipInflateTransformation::consume(ts::string_view data)
 {
   if (data.size() == 0) {
     return;
@@ -101,7 +100,7 @@ GzipInflateTransformation::consume(const string &data)
   vector<char> buffer(inflate_block_size);
 
   // Setup the compressed input
-  state_->z_stream_.next_in  = reinterpret_cast<unsigned char *>(const_cast<char *>(data.c_str()));
+  state_->z_stream_.next_in  = reinterpret_cast<unsigned char *>(const_cast<char *>(data.data()));
   state_->z_stream_.avail_in = data.length();
 
   // Loop while we have more data to inflate
@@ -123,7 +122,7 @@ GzipInflateTransformation::consume(const string &data)
 
     LOG_DEBUG("Iteration %d: Gzip inflated a total of %d bytes, producingOutput...", iteration,
               (inflate_block_size - state_->z_stream_.avail_out));
-    produce(string(&buffer[0], (inflate_block_size - state_->z_stream_.avail_out)));
+    produce(ts::string_view(&buffer[0], (inflate_block_size - state_->z_stream_.avail_out)));
     state_->bytes_produced_ += (inflate_block_size - state_->z_stream_.avail_out);
   }
   state_->z_stream_.next_out = nullptr;
diff --git a/lib/cppapi/TransformationPlugin.cc b/lib/cppapi/TransformationPlugin.cc
index fa9c6b9..2746d7c 100644
--- a/lib/cppapi/TransformationPlugin.cc
+++ b/lib/cppapi/TransformationPlugin.cc
@@ -302,7 +302,7 @@ TransformationPlugin::resumeCallback(TSCont cont, TSEvent event, void *edata)
 }
 
 size_t
-TransformationPlugin::doProduce(const std::string &data)
+TransformationPlugin::doProduce(ts::string_view data)
 {
   LOG_DEBUG("TransformationPlugin=%p tshttptxn=%p producing output with length=%ld", this, state_->txn_, data.length());
   int64_t write_length = static_cast<int64_t>(data.length());
@@ -331,7 +331,7 @@ TransformationPlugin::doProduce(const std::string &data)
   }
 
   // Finally we can copy this data into the output_buffer
-  int64_t bytes_written = TSIOBufferWrite(state_->output_buffer_, data.c_str(), write_length);
+  int64_t bytes_written = TSIOBufferWrite(state_->output_buffer_, data.data(), write_length);
   state_->bytes_written_ += bytes_written; // So we can set BytesDone on outputComplete().
   LOG_DEBUG("TransformationPlugin=%p tshttptxn=%p write to TSIOBuffer %" PRId64 " bytes total bytes written %" PRId64, this,
             state_->txn_, bytes_written, state_->bytes_written_);
@@ -358,10 +358,10 @@ TransformationPlugin::doProduce(const std::string &data)
 }
 
 size_t
-TransformationPlugin::produce(const std::string &data)
+TransformationPlugin::produce(ts::string_view data)
 {
   if (state_->type_ == REQUEST_TRANSFORMATION) {
-    state_->request_xform_output_.append(data);
+    state_->request_xform_output_.append(data.data(), data.length());
     return data.size();
   } else if (state_->type_ == SINK_TRANSFORMATION) {
     LOG_DEBUG("produce TransformationPlugin=%p tshttptxn=%p : This is a sink transform. Not producing any output", this,
diff --git a/lib/cppapi/include/atscppapi/GzipDeflateTransformation.h b/lib/cppapi/include/atscppapi/GzipDeflateTransformation.h
index f25b009..dd23561 100644
--- a/lib/cppapi/include/atscppapi/GzipDeflateTransformation.h
+++ b/lib/cppapi/include/atscppapi/GzipDeflateTransformation.h
@@ -22,10 +22,9 @@
  */
 
 #pragma once
-#ifndef ATSCPPAPI_GZIPDEFLATETRANSFORMATION_H_
-#define ATSCPPAPI_GZIPDEFLATETRANSFORMATION_H_
 
 #include <string>
+#include <ts/string_view.h>
 #include "atscppapi/TransformationPlugin.h"
 
 namespace atscppapi
@@ -71,13 +70,13 @@ namespace transformations
      *
      * @param data the input data to compress
      */
-    void consume(const std::string &data);
+    void consume(ts::string_view data) override;
 
     /**
      * Any TransformationPlugin must implement handleInputComplete(), this method will
      * finalize the gzip compression and flush any remaining data and the epilouge.
      */
-    void handleInputComplete();
+    void handleInputComplete() override;
 
     virtual ~GzipDeflateTransformation();
 
@@ -86,5 +85,3 @@ namespace transformations
   };
 }
 }
-
-#endif /* ATSCPPAPI_GZIPDEFLATETRANSFORMATION_H_ */
diff --git a/lib/cppapi/include/atscppapi/GzipInflateTransformation.h b/lib/cppapi/include/atscppapi/GzipInflateTransformation.h
index d0e4713..425d1ed 100644
--- a/lib/cppapi/include/atscppapi/GzipInflateTransformation.h
+++ b/lib/cppapi/include/atscppapi/GzipInflateTransformation.h
@@ -22,10 +22,8 @@
  */
 
 #pragma once
-#ifndef ATSCPPAPI_GZIPINFLATETRANSFORMATION_H_
-#define ATSCPPAPI_GZIPINFLATETRANSFORMATION_H_
 
-#include <string>
+#include <ts/string_view.h>
 #include "atscppapi/TransformationPlugin.h"
 
 namespace atscppapi
@@ -73,13 +71,13 @@ namespace transformations
      *
      * @param data the input data to decompress
      */
-    void consume(const std::string &);
+    void consume(ts::string_view) override;
 
     /**
      * Any TransformationPlugin must implement handleInputComplete(), this method will
      * finalize the gzip decompression.
      */
-    void handleInputComplete();
+    void handleInputComplete() override;
 
     virtual ~GzipInflateTransformation();
 
@@ -90,5 +88,3 @@ namespace transformations
 } /* transformations */
 
 } /* atscppapi */
-
-#endif /* ATSCPPAPI_GZIPINFLATETRANSFORMATION_H_ */
diff --git a/lib/cppapi/include/atscppapi/TransformationPlugin.h b/lib/cppapi/include/atscppapi/TransformationPlugin.h
index 714d8e2..7c640fc 100644
--- a/lib/cppapi/include/atscppapi/TransformationPlugin.h
+++ b/lib/cppapi/include/atscppapi/TransformationPlugin.h
@@ -21,10 +21,8 @@
  */
 
 #pragma once
-#ifndef ATSCPPAPI_TRANSFORMATIONPLUGIN_H_
-#define ATSCPPAPI_TRANSFORMATIONPLUGIN_H_
 
-#include <string>
+#include <ts/string_view.h>
 #include <atscppapi/Transaction.h>
 #include <atscppapi/TransactionPlugin.h>
 
@@ -64,7 +62,7 @@ struct TransformationPluginState;
  *     transaction.getClientResponse().getHeaders().set("X-Content-Transformed", "1");
  *     transaction.resume();
  *   }
- *   void consume(const string &data) {
+ *   void consume(ts::string_view data) {
  *     produce(data);
  *   }
  *   void handleInputComplete() {
@@ -95,7 +93,7 @@ public:
    * A method that you must implement when writing a TransformationPlugin, this method will be
    * fired whenever an upstream TransformationPlugin has produced output.
    */
-  virtual void consume(const std::string &data) = 0;
+  virtual void consume(ts::string_view data) = 0;
 
   /**
   * Call this method if you wish to pause the transformation.
@@ -117,11 +115,9 @@ public:
 protected:
   /**
    * This method is how a TransformationPlugin will produce output for the downstream
-   * transformation plugin, if you need to produce binary data this can still be
-   * done with strings by a call to string::assign() or by constructing a string
-   * with string::string(char *, size_t).
+   * transformation plugin.
    */
-  size_t produce(const std::string &);
+  size_t produce(ts::string_view);
 
   /**
    * This is the method that you must call when you're done producing output for
@@ -134,10 +130,8 @@ protected:
 
 private:
   TransformationPluginState *state_; /** Internal state for a TransformationPlugin */
-  size_t doProduce(const std::string &);
+  size_t doProduce(ts::string_view);
   static int resumeCallback(TSCont cont, TSEvent event, void *edata); /** Resume callback*/
 };
 
 } /* atscppapi */
-
-#endif /* ATSCPPAPI_TRANSFORMATIONPLUGIN_H_ */
diff --git a/plugins/experimental/webp_transform/ImageTransform.cc b/plugins/experimental/webp_transform/ImageTransform.cc
index fe37f8c..967b4db 100644
--- a/plugins/experimental/webp_transform/ImageTransform.cc
+++ b/plugins/experimental/webp_transform/ImageTransform.cc
@@ -18,6 +18,7 @@
 
 #include <sstream>
 #include <iostream>
+#include <ts/string_view.h>
 #include <atscppapi/PluginInit.h>
 #include <atscppapi/GlobalPlugin.h>
 #include <atscppapi/TransformationPlugin.h>
@@ -29,10 +30,7 @@ using std::string;
 using namespace Magick;
 using namespace atscppapi;
 
-namespace
-{
 #define TAG "webp_transform"
-}
 
 class ImageTransform : public TransformationPlugin
 {
@@ -53,9 +51,9 @@ public:
   }
 
   void
-  consume(const string &data) override
+  consume(ts::string_view data) override
   {
-    _img.write(data.data(), data.size());
+    _img.write(data.data(), data.length());
   }
 
   void
@@ -69,8 +67,7 @@ public:
     Blob output_blob;
     image.magick("WEBP");
     image.write(&output_blob);
-    string output_data(reinterpret_cast<const char *>(output_blob.data()), output_blob.length());
-    produce(output_data);
+    produce(ts::string_view(reinterpret_cast<const char *>(output_blob.data()), output_blob.length()));
 
     setOutputComplete();
   }

-- 
To stop receiving notification emails like this one, please contact
jpeach@apache.org.