diff --git a/ACE/ace/SSL/SSL_Asynch_Stream.cpp b/ACE/ace/SSL/SSL_Asynch_Stream.cpp index ed5a1e1f440bf..bd5fe0b3909f0 100644 --- a/ACE/ace/SSL/SSL_Asynch_Stream.cpp +++ b/ACE/ace/SSL/SSL_Asynch_Stream.cpp @@ -95,8 +95,6 @@ ACE_SSL_Asynch_Stream::ACE_SSL_Asynch_Stream ( : type_ (s_type), proactor_ (0), ext_handler_ (0), - ext_read_result_ (0), - ext_write_result_(0), flags_ (0), ssl_ (0), handshake_complete_(false), @@ -150,6 +148,15 @@ ACE_SSL_Asynch_Stream::~ACE_SSL_Asynch_Stream () // leave that to the application developer? We do not reference // count reactors (for example) and following some simple rules // seems to work fine! + + while (!ext_read_result_queue_.empty()) { + delete ext_read_result_queue_.front(); + ext_read_result_queue_.pop_front(); + } + while (!ext_write_result_queue_.empty()) { + delete ext_write_result_queue_.front(); + ext_write_result_queue_.pop_front(); + } } // ************************************************************ @@ -330,14 +337,9 @@ ACE_SSL_Asynch_Stream::read (ACE_Message_Block & message_block, if (this->flags_ & SF_REQ_SHUTDOWN) return -1; - // only one read operation is allowed now - // later it will be possible to make a queue - - if (this->ext_read_result_ != 0) - return -1; - + ACE_SSL_Asynch_Read_Stream_Result* result = 0; // create result for future notification - ACE_NEW_RETURN (this->ext_read_result_, + ACE_NEW_RETURN (result, ACE_SSL_Asynch_Read_Stream_Result ( *this->ext_handler_, this->handle (), @@ -349,6 +351,8 @@ ACE_SSL_Asynch_Stream::read (ACE_Message_Block & message_block, signal_number), -1); + ext_read_result_queue_.push_back(result); + this->do_SSL_state_machine (); // ignore return code return 0; @@ -373,14 +377,9 @@ ACE_SSL_Asynch_Stream::write (ACE_Message_Block & message_block, if (this->flags_ & SF_REQ_SHUTDOWN) return -1; - // only one read operation is allowed now - // later it will be possible to make a queue - - if (this->ext_write_result_ != 0) - return -1; - + ACE_SSL_Asynch_Write_Stream_Result* result = 0; // create result for future notification - ACE_NEW_RETURN (this->ext_write_result_, + ACE_NEW_RETURN (result, ACE_SSL_Asynch_Write_Stream_Result ( *this->ext_handler_, this->handle (), @@ -392,6 +391,9 @@ ACE_SSL_Asynch_Stream::write (ACE_Message_Block & message_block, signal_number), -1); + + ext_write_result_queue_.push_back(result); + this->do_SSL_state_machine (); return 0; @@ -561,7 +563,7 @@ ACE_SSL_Asynch_Stream::post_handshake_check () int ACE_SSL_Asynch_Stream::do_SSL_read () { - if (this->ext_read_result_ == 0) // nothing to do + if (this->ext_read_result_queue_.empty()) // nothing to do { return 0; } @@ -572,8 +574,8 @@ ACE_SSL_Asynch_Stream::do_SSL_read () return -1; } - ACE_Message_Block & mb = this->ext_read_result_->message_block (); - size_t bytes_req = this->ext_read_result_->bytes_to_read (); + ACE_Message_Block & mb = this->ext_read_result_queue_.front()->message_block (); + size_t bytes_req = this->ext_read_result_queue_.front()->bytes_to_read (); ERR_clear_error (); @@ -623,7 +625,7 @@ ACE_SSL_Asynch_Stream::do_SSL_read () int ACE_SSL_Asynch_Stream::do_SSL_write () { - if (this->ext_write_result_ == 0) // nothing to do + if (ext_write_result_queue_.empty()) // nothing to do { return 0; } @@ -634,8 +636,8 @@ ACE_SSL_Asynch_Stream::do_SSL_write () return -1; } - ACE_Message_Block & mb = this->ext_write_result_->message_block (); - size_t bytes_req = this->ext_write_result_->bytes_to_write (); + ACE_Message_Block & mb = ext_write_result_queue_.front()->message_block (); + size_t bytes_req = ext_write_result_queue_.front()->bytes_to_write (); ERR_clear_error (); @@ -725,18 +727,18 @@ int ACE_SSL_Asynch_Stream::notify_read (int bytes_transferred, int error) { - if (ext_read_result_ == 0) //nothing to notify + if (ext_read_result_queue_.empty()) //nothing to notify return 1; - this->ext_read_result_->set_bytes_transferred (bytes_transferred); - this->ext_read_result_->set_error (error); + this->ext_read_result_queue_.front()->set_bytes_transferred (bytes_transferred); + this->ext_read_result_queue_.front()->set_error (error); int retval = - this->ext_read_result_->post_completion (proactor_->implementation ()); + this->ext_read_result_queue_.front()->post_completion (proactor_->implementation ()); if (retval == 0) { - this->ext_read_result_ = 0; + this->ext_read_result_queue_.pop_front(); return 0; // success } @@ -755,19 +757,19 @@ int ACE_SSL_Asynch_Stream::notify_write (int bytes_transferred, int error) { - if (this->ext_write_result_ == 0) //nothing to notify + if (this->ext_write_result_queue_.empty()) //nothing to notify return 1; - this->ext_write_result_->set_bytes_transferred (bytes_transferred); - this->ext_write_result_->set_error (error); + this->ext_write_result_queue_.front()->set_bytes_transferred (bytes_transferred); + this->ext_write_result_queue_.front()->set_error (error); int retval = - this->ext_write_result_->post_completion ( + this->ext_write_result_queue_.front()->post_completion ( this->proactor_->implementation ()); if (retval == 0) { - this->ext_write_result_ = 0; + this->ext_write_result_queue_.pop_front(); return 0; // success } diff --git a/ACE/ace/SSL/SSL_Asynch_Stream.h b/ACE/ace/SSL/SSL_Asynch_Stream.h index db86bf1f9f816..7eb472c608ff7 100644 --- a/ACE/ace/SSL/SSL_Asynch_Stream.h +++ b/ACE/ace/SSL/SSL_Asynch_Stream.h @@ -13,6 +13,7 @@ #include /**/ "ace/pre.h" #include "SSL_Context.h" +#include #if !defined (ACE_LACKS_PRAGMA_ONCE) #pragma once @@ -379,12 +380,13 @@ class ACE_SSL_Export ACE_SSL_Asynch_Stream /// External,i.e user handler ACE_Handler * ext_handler_; +private: /// External, i.e. read result faked for user - ACE_SSL_Asynch_Read_Stream_Result * ext_read_result_ ; + std::list ext_read_result_queue_; /// External, i.e. write result faked for user - ACE_SSL_Asynch_Write_Stream_Result * ext_write_result_ ; - + std::list ext_write_result_queue_; +protected: /// Stream state/flags enum Stream_Flag {