diff options
author | nobody <nobody@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2006-03-05 17:14:45 +0000 |
---|---|---|
committer | nobody <nobody@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2006-03-05 17:14:45 +0000 |
commit | 58033491c6d0bac82315c1fdb1ec9b39be58093f (patch) | |
tree | c69c3aa67ec66758066e959bd0d533ea336ec236 /protocols | |
parent | 2efc882384a34f61311a24fc641d1b5fd5776356 (diff) | |
download | ATCD-TAO-1_5.tar.gz |
This commit was manufactured by cvs2svn to create tag 'TAO-1_5'.TAO-1_5
Diffstat (limited to 'protocols')
98 files changed, 0 insertions, 11519 deletions
diff --git a/protocols/Makefile.am b/protocols/Makefile.am deleted file mode 100644 index 31372aa4797..00000000000 --- a/protocols/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ -## Process this file with automake to create Makefile.in -## -## $Id$ -## -## This file was generated by MPC. Any changes made directly to -## this file will be lost the next time it is generated. -## -## MPC Command: -## /acebuilds/ACE_wrappers-repository/bin/mwc.pl -include /acebuilds/MPC/config -include /acebuilds/MPC/templates -feature_file /acebuilds/ACE_wrappers-repository/local.features -noreldefs -type automake -exclude build,Kokyu - -SUBDIRS = \ - ace \ - examples diff --git a/protocols/ace/HTBP/ACE_HTBP.pc.in b/protocols/ace/HTBP/ACE_HTBP.pc.in deleted file mode 100644 index 0ac5c75b8cf..00000000000 --- a/protocols/ace/HTBP/ACE_HTBP.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: ACE_HTBP -Description: ACE HTTP Tunneling, Bidirectional, Protocol -Requires: ACE -Version: @VERSION@ -Libs: -L${libdir} -lACE_HTBP -Cflags: -I${includedir} diff --git a/protocols/ace/HTBP/HTBP.mpc b/protocols/ace/HTBP/HTBP.mpc deleted file mode 100644 index ada3fc8530d..00000000000 --- a/protocols/ace/HTBP/HTBP.mpc +++ /dev/null @@ -1,12 +0,0 @@ -// -*- MPC -*- -// $Id$ - -project(HTBP) : acelib, core { - avoids += ace_for_tao - sharedname = ACE_HTBP - dynamicflags = HTBP_BUILD_DLL - - Pkgconfig_Files { - ACE_HTBP.pc.in - } -} diff --git a/protocols/ace/HTBP/HTBP_Addr.cpp b/protocols/ace/HTBP/HTBP_Addr.cpp deleted file mode 100644 index aff894e80dc..00000000000 --- a/protocols/ace/HTBP/HTBP_Addr.cpp +++ /dev/null @@ -1,93 +0,0 @@ -// $Id$ - -#include "HTBP_Addr.h" -#include "ace/OS_NS_string.h" - -ACE_RCSID (HTBP, - ACE_HTBP_Addr, - "$Id$") - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -// Constructor -ACE::HTBP::Addr::Addr () -{ -} - -// Creates a ACE_INET_Addr from a PORT_NUMBER and the remote -// HOST_NAME. - -ACE::HTBP::Addr::Addr (u_short port_number, - const char host_name[], - int address_family) - : ACE_INET_Addr (port_number, host_name, address_family), - htid_ () -{ -} - -ACE::HTBP::Addr::Addr (const char *htid) - : htid_(htid) -{ -} - -ACE::HTBP::Addr::Addr (const ACE::HTBP::Addr &other) - : ACE_INET_Addr (other), - htid_(other.htid_) -{ - -} - -// Destructor -ACE::HTBP::Addr::~Addr () -{ -} - -int -ACE::HTBP::Addr::set (u_short port, - const char host[], - const char *htid) -{ - if (htid != 0 && ACE_OS::strlen (htid) != 0) - return this->set_htid (htid); - return this->ACE_INET_Addr::set(port,host); -} - -int -ACE::HTBP::Addr::set_htid (const char *htid) -{ - this->htid_ = htid; - this->set_port_number (0); - return 0; -} - -const char * -ACE::HTBP::Addr::get_htid (void) const -{ - return this->htid_.c_str(); -} - -int -ACE::HTBP::Addr::addr_to_string (ACE_TCHAR buffer[], - size_t size, - int ipaddr_format) const -{ - if (this->htid_.length() == 0) - return this->ACE_INET_Addr::addr_to_string(buffer,size,ipaddr_format); - if (size < htid_.length()) - return -1; - ACE_OS::strncpy (buffer, - ACE_TEXT_CHAR_TO_TCHAR(htid_.c_str()), - size); - return 0; -} - -int -ACE::HTBP::Addr::string_to_addr (const char address[]) -{ - // if (ACE_OS::strchr (address,':')) - return this->ACE_INET_Addr::string_to_addr(address); - // this->htid_ = address; - // return 0; -} - -ACE_END_VERSIONED_NAMESPACE_DECL diff --git a/protocols/ace/HTBP/HTBP_Addr.h b/protocols/ace/HTBP/HTBP_Addr.h deleted file mode 100644 index 14241b3c3b6..00000000000 --- a/protocols/ace/HTBP/HTBP_Addr.h +++ /dev/null @@ -1,91 +0,0 @@ -// -*- C++ -*- - -//============================================================================= -/** - * @file HTBP_Addr.h - * - * $Id$ - * - * @author Phil Mesnier - */ -//============================================================================= - -#ifndef ACE_HTBP_ADDR_H -#define ACE_HTBP_ADDR_H -#include /**/ "ace/pre.h" - -#include "HTBP_Export.h" - -#if !defined (ACE_LACKS_PRAGMA_ONCE) -# pragma once -#endif /* ACE_LACKS_PRAGMA_ONCE */ - -#include "ace/INET_Addr.h" -#include "ace/Synch.h" -#include "ace/SString.h" - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -namespace ACE -{ - namespace HTBP - { - - /** - * @class Addr - * - * @brief Defines the member functions of the pure virtual class - * Addr - * - * This class derives from ACE_INET_Addr. It is the base class for - * the Inside, Proxy and Outside classes - */ - class HTBP_Export Addr : public ACE_INET_Addr - { - public: - /// Constructor - Addr (); - - Addr (const Addr &other); - - /// Create an Addr suitable for use on the inside of a firewall this - /// take a string used to populate the htid_ member. With this address, - /// the IP addr form is ignored. - Addr (const char *htid); - - /// Initialize an Addr for the outside of a firewall. In this form, - /// the htid_ is an empty string and the arguments are passed to the - /// base address type. - Addr (u_short port_number, - const char host_name[], - int address_family = AF_UNSPEC); - - /// Destructor - virtual ~Addr (); - - int set (u_short port, - const char host [], - const char *htid); - - /// Methods to help convert the OutSide_Addr to a String - /// and vice versa - int addr_to_string (ACE_TCHAR buffer[], - size_t size, - int ipaddr_format = 1) const; - int string_to_addr (const char address[]); - - int set_htid(const char *htid); - const char *get_htid (void) const; - - private: - /// HTID - web-obtained unique-identifier - ACE_CString htid_; - }; - - } -} - -ACE_END_VERSIONED_NAMESPACE_DECL - -#include /**/ "ace/post.h" -#endif /* ACE_HTBP_ADDR_H */ diff --git a/protocols/ace/HTBP/HTBP_Channel.cpp b/protocols/ace/HTBP/HTBP_Channel.cpp deleted file mode 100644 index 064312377ba..00000000000 --- a/protocols/ace/HTBP/HTBP_Channel.cpp +++ /dev/null @@ -1,537 +0,0 @@ -/* -*- C++ -*- */ - -//============================================================================= -/** - * @file HTBP_Channel.cpp - * - * $Id$ - * - * @author Phil Mesnier, Priyanka Gontla - */ -//============================================================================= -#include "HTBP_Channel.h" - -#if !defined (__ACE_INLINE__) -#include "HTBP_Channel.inl" -#endif - -#include "HTBP_Session.h" -#include "HTBP_Filter_Factory.h" - -#include "ace/Message_Block.h" -#include "ace/Reactor.h" - - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -// Initialization and termination methods. -/// Constructor. -ACE::HTBP::Channel::Channel (ACE::HTBP::Session *s) - : filter_ (0), - session_ (s), - ace_stream_ (), - notifier_ (0), - leftovers_ (1000), - data_len_ (0), - data_consumed_ (0), - state_ (Init), - error_buffer_ (0) -{ - ACE_NEW (this->notifier_,ACE::HTBP::Notifier(this)); - this->filter_ = get_filter (); - this->request_count_ = static_cast<unsigned long> (ACE_OS::time()); -} - -/// Constructor, takes ownership of the supplied stream -ACE::HTBP::Channel::Channel (ACE_SOCK_Stream &s) - : filter_ (0), - session_ (0), - ace_stream_ (s.get_handle()), - notifier_ (0), - leftovers_ (1000), - data_len_ (0), - data_consumed_ (0), - state_ (Init), - error_buffer_ (0) - -{ - filter_ = get_filter (); - this->request_count_ = static_cast<unsigned long> (ACE_OS::time()); -} - -ACE::HTBP::Channel::Channel (ACE_HANDLE h) - : filter_ (0), - session_ (0), - ace_stream_ (h), - notifier_ (0), - leftovers_ (1000), - data_len_ (0), - data_consumed_ (0), - state_ (Init), - error_buffer_ (0) -{ - filter_ = get_filter (); - this->request_count_ = static_cast<unsigned long> (ACE_OS::time()); -} - -/// Destructor. -ACE::HTBP::Channel::~Channel (void) -{ - delete this->filter_; - delete this->notifier_; -} - - /// Dump the state of an object. -void -ACE::HTBP::Channel::dump (void) const -{ -} - -unsigned long -ACE::HTBP::Channel::request_count (void) -{ - return this->request_count_++; -} - -void -ACE::HTBP::Channel::register_notifier (ACE_Reactor *r) -{ - if (r == 0) - return; - if (this->notifier_ == 0) - { - ACE_NEW (this->notifier_,ACE::HTBP::Notifier(this)); - } - else - { - if (notifier_->get_handle() == ACE_INVALID_HANDLE) - { - delete this->notifier_; - ACE_NEW (this->notifier_,ACE::HTBP::Notifier(this)); - } - } - - r->register_handler(notifier_,ACE_Event_Handler::READ_MASK); -} - -ACE::HTBP::Notifier * -ACE::HTBP::Channel::notifier (void) -{ - return this->notifier_; -} - -ACE_HANDLE -ACE::HTBP::Channel::get_handle (void) const -{ - return this->ace_stream_.get_handle (); -} - -void -ACE::HTBP::Channel::data_consumed (size_t n) -{ - this->data_consumed_ += n; - if (this->data_consumed_ == this->data_len_) - { - this->filter_->recv_data_trailer(this); - this->filter_->send_ack(this); - } -} - -int -ACE::HTBP::Channel::load_buffer (void) -{ - this->leftovers_.crunch(); - if (this->state() == Detached || - this->state() == Ack_Sent) - { - this->data_len_ = 0; - this->data_consumed_ = 0; - } - - ssize_t nread = 0; - errno = 0; -#if 0 - if (this->session_ && - (this->session_->sock_flags() & ACE_NONBLOCK == ACE_NONBLOCK)) -#endif - { - nread = - ACE::handle_read_ready (this->ace_stream().get_handle(), - &ACE_Time_Value::zero); - if (nread == -1 && errno == ETIME) - errno = EWOULDBLOCK; - } - if (nread != -1) - nread = this->ace_stream().recv (this->leftovers_.wr_ptr(), - this->leftovers_.space()); - if (nread < 1) - { - if (nread == 0 || (errno != EWOULDBLOCK && errno != EAGAIN)) - { - this->state_ = Closed; -#if 0 - ACE_ERROR ((LM_ERROR, - "load_buffer[%d] %p\n", - this->ace_stream_.get_handle(),"recv")); -#endif - } - return nread; - } - this->leftovers_.wr_ptr(nread); - *this->leftovers_.wr_ptr() = '\0'; -#if 0 - ACE_DEBUG ((LM_DEBUG,"load_buffer[%d] received %d \n", - this->ace_stream_.get_handle(),leftovers_.length())); - ACE_HEX_DUMP ((LM_DEBUG,leftovers_.rd_ptr(),leftovers_.length())); -#endif - return nread; -} - -int -ACE::HTBP::Channel::flush_buffer (void) -{ - if (this->session_) - return this->session_->flush_outbound_queue(); - return 0; -} - -int -ACE::HTBP::Channel::send_ack (void) -{ - return this->filter_->send_ack(this); -} - -int -ACE::HTBP::Channel::recv_ack (void) -{ - if (load_buffer() == -1) - return -1; - return this->filter_->recv_ack(this); -} - -void -ACE::HTBP::Channel::state (ACE::HTBP::Channel::State s) -{ - if (s == Detached) - { - this->session_->detach(this); - this->session_ = 0; - } - this->state_ = s; -} - -int -ACE::HTBP::Channel::consume_error (void) -{ - if (error_buffer_ == 0) - { - ACE_NEW_RETURN (error_buffer_, - ACE_Message_Block (this->data_len_ + 1), - 0); - } - - ssize_t result = 0; - size_t n = error_buffer_->size(); - char *buf = error_buffer_->wr_ptr(); - - if (this->leftovers_.length() > 0) - { - result = ACE_MIN (n,this->leftovers_.length()); - ACE_OS::memcpy (buf,this->leftovers_.rd_ptr(), result); - this->leftovers_.rd_ptr(result); - buf += result; - } - - if (result < (ssize_t)n && - result < (ssize_t)data_len_) - { - n -= result; - result += this->ace_stream_.recv(buf, n); - } - if (result > 0) - { - this->error_buffer_->wr_ptr(result); - this->data_consumed_ += result; - if (this->data_consumed_ == this->data_len_) - { - *this->error_buffer_->wr_ptr() = '\0'; - ACE_DEBUG ((LM_DEBUG,"Received entire error buffer: \n%s\n", - this->error_buffer_->rd_ptr())); - delete error_buffer_; - error_buffer_ = 0; - - return 1; - } - } - return 0; -} - -//--------------------------------------------------------------------------- -// = I/O functions. - -/// The ACE::HTBP::Channel is a sibling of the ACE_SOCK_IO class, rather than a -/// decendant. This is due to the requirement to wrap all messages with -/// an HTTP request or reply wrapper, and to send application data in only -/// one direction on one stream. - -int -ACE::HTBP::Channel::pre_recv(void) -{ - if (this->state_ == Init || - this->state_ == Detached || - this->state_ == Header_Pending || - this->state_ == Ack_Sent) - { - if (this->load_buffer() == -1 && this->leftovers_.length() == 0) - { - if (errno != EWOULDBLOCK) - this->state_ = Closed; - ACE_DEBUG ((LM_DEBUG,"pre_recv returning -1, state = %d\n",state_)); - return -1; - } - if (this->filter_->recv_data_header(this) == -1) - ACE_DEBUG ((LM_DEBUG,"recv_data_header failed, %p\n","pre_recv")); - } - switch (this->state_) - { - case Data_Queued: - case Ack_Sent: - case Ready: - return 0; - case Header_Pending: - errno = EWOULDBLOCK; - return -1; - default: - ACE_DEBUG ((LM_DEBUG,"channel[%d] state = %d, %p\n", - this->get_handle(), - this->state_,"pre_recv")); - } - return -1; -} - -/// Recv an <n> byte buffer from the connected socket. -ssize_t -ACE::HTBP::Channel::recv (void *buf, - size_t n, - int flags, - const ACE_Time_Value *timeout) -{ - ssize_t result = 0; - if (this->pre_recv() == -1 && this->leftovers_.length() == 0) - return -1; - - if (this->leftovers_.length() > 0) - { - result = ACE_MIN (n,this->leftovers_.length()); - ACE_OS::memcpy (buf,this->leftovers_.rd_ptr(), result); - this->leftovers_.rd_ptr(result); - buf = (char *)buf + result; - } - - if (result < (ssize_t)n && - result < (ssize_t)data_len_) - { - n -= result; - result += this->ace_stream_.recv(buf, n, flags, timeout); - } - if (result > 0) - data_consumed((size_t)result); - return result; -} - - /// Recv an <n> byte buffer from the connected socket. -ssize_t -ACE::HTBP::Channel::recv (void *buf, - size_t n, - const ACE_Time_Value *timeout) -{ - ssize_t result = 0; - if (this->pre_recv() == -1) - return -1; - - result = 0; - if (this->leftovers_.length() > 0) - { - result = ACE_MIN (n,this->leftovers_.length()); - ACE_OS::memcpy (buf,this->leftovers_.rd_ptr(), result); - this->leftovers_.rd_ptr(result); - buf = (char *)buf + result; - } - - if ((size_t)result < n && (size_t)result < this->data_len()) - { - n -= result; - result += this->ace_stream_.recv(buf, n, timeout); - } - - if (result > 0) - this->data_consumed((size_t)result); - return result; -} - - /// Recv an <iovec> of size <n> from the connected socket. -ssize_t -ACE::HTBP::Channel::recvv (iovec iov[], - int iovcnt, - const ACE_Time_Value *timeout) -{ - ssize_t result = 0; - if (this->pre_recv() == -1) - return -1; - - if (this->leftovers_.length()) - { - int ndx = 0; - iovec *iov2 = new iovec[iovcnt]; - for (int i = 0; i < iovcnt; i++) - { - size_t n = ACE_MIN ((size_t) iov[i].iov_len , - (size_t) this->leftovers_.length()); - if (n > 0) - { - ACE_OS::memcpy (iov[i].iov_base,this->leftovers_.rd_ptr(), n); - this->leftovers_.rd_ptr(n); - result += n; - } - if (n < (size_t) iov[i].iov_len) - { - iov2[ndx].iov_len = iov[i].iov_len - n; - iov2[ndx].iov_base = (char *)iov[i].iov_base + n; - ndx++; - } - } - if (ndx > 0) - result += this->ace_stream_.recvv(iov2,ndx,timeout); - delete [] iov2; - } - else - result = this->ace_stream_.recvv(iov,iovcnt,timeout); - - if (result > 0) - this->data_consumed((size_t)result); - return result; -} - -ssize_t -ACE::HTBP::Channel::recvv (iovec *io_vec, - const ACE_Time_Value *timeout) -{ - ssize_t result = 0; - if (this->pre_recv() == -1) - return -1; - - ACE_DEBUG ((LM_DEBUG,"recvv, leftover len = %d\n", - this->leftovers_.length())); - if (this->leftovers_.length()) - { - io_vec->iov_base = 0; - io_vec->iov_len = 0; - ACE_NEW_RETURN (io_vec->iov_base, - char[this->leftovers_.length()],-1); - io_vec->iov_len = this->leftovers_.length(); - ACE_OS::memcpy (io_vec->iov_base, - this->leftovers_.rd_ptr(), - io_vec->iov_len); - result = io_vec->iov_len; - this->leftovers_.length(0); - } - else - result = this->ace_stream_.recvv(io_vec,timeout); - - if (result > 0) - this->data_consumed((size_t)result); - return result; -} - -ssize_t -ACE::HTBP::Channel::send (const void *buf, - size_t n, - int flags, - const ACE_Time_Value *timeout) -{ - ssize_t result = 0; - if (this->filter_->send_data_header(n,this) == -1) - return -1; - result = this->ace_stream_.send(buf,n,flags,timeout); - if (result == -1) - return -1; - if (this->filter_->send_data_trailer(this) == -1) - return -1; - return result; -} - -ssize_t -ACE::HTBP::Channel::send (const void *buf, - size_t n, - const ACE_Time_Value *timeout) -{ - ssize_t result = 0; - if (this->filter_ == 0) - ACE_ERROR_RETURN ((LM_DEBUG, "ACE::HTBP::Channel::send: filter is null\n"),-1); - if (this->filter_->send_data_header(n,this) == -1) - return -1; - result = this->ace_stream_.send (buf,n,timeout); - if (result == -1) - return -1; - if (this->filter_->send_data_trailer(this) == -1) - return -1; - return result; -} - -ssize_t -ACE::HTBP::Channel::sendv (const iovec iov[], - int iovcnt, - const ACE_Time_Value *timeout) -{ - if (this->ace_stream_.get_handle() == ACE_INVALID_HANDLE) - this->session_->inbound(); - - ssize_t result = 0; - size_t n = 0; - for (int i = 0; i < iovcnt; n += iov[i++].iov_len); - - if (this->filter_->send_data_header(n,this) == -1) - ACE_ERROR_RETURN ((LM_ERROR,"sendv, %p\n","send_data_header"),-1); - - result = this->ace_stream_.sendv (iov,iovcnt,timeout); - - if (result == -1) - ACE_ERROR_RETURN ((LM_ERROR,"sendv, %p\n","ace_stream_.sendv"),-1); - - if (this->filter_->send_data_trailer(this) == -1) - ACE_ERROR_RETURN ((LM_ERROR,"sendv, %p\n","send_data_trailer\n"),-1); - - return result; -} - -int -ACE::HTBP::Channel::enable (int value) const -{ - this->ace_stream_.enable(value); - - return 0; //this->ace_stream_.enable(value); -} - -int -ACE::HTBP::Channel::disable (int value) const -{ - this->ace_stream_.disable(value); - - return 0;//this->ace_stream_.disable(value); -} - -ACE::HTBP::Filter * -ACE::HTBP::Channel::get_filter () -{ - ACE::HTBP::Filter_Factory *factory = 0; - - // @todo Should I be throwing an exception here if - // memory is not allocated right ? - ACE_NEW_RETURN (factory, - ACE::HTBP::Filter_Factory, - 0); - int inside = (this->session_ != 0); - return factory->get_filter (inside); -} - -ACE_END_VERSIONED_NAMESPACE_DECL diff --git a/protocols/ace/HTBP/HTBP_Channel.h b/protocols/ace/HTBP/HTBP_Channel.h deleted file mode 100644 index b33d446e40b..00000000000 --- a/protocols/ace/HTBP/HTBP_Channel.h +++ /dev/null @@ -1,280 +0,0 @@ -/* -*- C++ -*- */ - -//============================================================================= -/** - * @file HTBP_Channel.h - * - * $Id$ - * - * @author Phil Mesnier, Priyanka Gontla - */ -//============================================================================= - -#ifndef ACE_HTBP_CHANNEL_H -#define ACE_HTBP_CHANNEL_H -#include /**/ "ace/pre.h" - -#include "ace/SOCK_Stream.h" -#include "ace/Message_Block.h" - -#if !defined (ACE_LACKS_PRAGMA_ONCE) -# pragma once -#endif /* ACE_LACKS_PRAGMA_ONCE */ - -#include "HTBP_Export.h" -#include "HTBP_Addr.h" -#include "HTBP_Filter.h" -#include "HTBP_Notifier.h" - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -namespace ACE -{ - namespace HTBP - { - // Forward declarations. - class Session; - - /** - * @class ACE::HTBP::Channel - * - * @brief Defines the methods in the <Ht_Channel> abstraction. - * - * This adds additional wrapper methods atop the <IO> - * class. - * - * <buf> is the buffer to write from or receive into. - * <len> is the number of bytes to transfer. - * The <timeout> parameter in the following methods indicates how - * long to blocking trying to transfer data. If <timeout> == 0, - * then the call behaves as a normal send/recv call, i.e., for - * blocking sockets, the call will block until action is possible; - * for non-blocking sockets, EWOULDBLOCK will be returned if no - * action is immediately possible. - * If <timeout> != 0, the call will wait for data to arrive no longer - * than the relative time specified in *<timeout>. - * The "_n()" I/O methods keep looping until all the data has been - * transferred. These methods also work for sockets in non-blocking - * mode i.e., they keep looping on EWOULDBLOCK. <timeout> is used - * to make sure we keep making progress, i.e., the same timeout - * value is used for every I/O operation in the loop and the timeout - * is not counted down. - * The return values for the "*_n()" methods match the return values - * from the non "_n()" methods and are specified as follows: - * - On complete transfer, the number of bytes transferred is returned. - * - On timeout, -1 is returned, errno == ETIME. - * - On error, -1 is returned, errno is set to appropriate error. - * - On EOF, 0 is returned, errno is irrelevant. - * - * On partial transfers, i.e., if any data is transferred before - * timeout/error/EOF, <bytes_transferred> will contain the number of - * bytes transferred. - * Methods with <iovec> parameter are I/O vector variants of the I/O - * operations. - * Methods with the extra <flags> argument will always result in - * <send> getting called. Methods without the extra <flags> argument - * will result in <send> getting called on Win32 platforms, and - * <write> getting called on non-Win32 platforms. - */ - class HTBP_Export Channel - { - public: - friend class Notifier; - // Initialization and termination methods. - /// Constructor. - Channel (Session *s = 0); - - Channel (ACE_SOCK_Stream &s); - Channel (ACE_HANDLE h); - - /// Destructor. - ~Channel (void); - - enum State { - Init, - Ready, - Data_Queued, - Ack_Sent, - Header_Sent, - Closed, - Send_Ack, - Detached, - Wait_For_Ack, - Header_Pending - }; - - // = I/O functions. - - /// The Channel is a sibling of the ACE_SOCK_IO class, rather than a - /// decendant. This is due to the requirement to wrap all messages with - /// an HTTP request or reply wrapper, and to send application data in only - /// one direction on one stream. - - /// Recv an <n> byte buffer from the connected socket. - ssize_t recv (void *buf, - size_t n, - int flags, - const ACE_Time_Value *timeout = 0); - - /// Recv an <n> byte buffer from the connected socket. - ssize_t recv (void *buf, - size_t n, - const ACE_Time_Value *timeout = 0); - - /// Recv an <iovec> of size <n> from the connected socket. - ssize_t recvv (iovec iov[], - int n, - const ACE_Time_Value *timeout = 0); - - /// Same as above. Deprecated. - ssize_t recv (iovec iov[], - size_t n, - const ACE_Time_Value *timeout = 0); - - /** - * Allows a client to read from a socket without having to provide a - * buffer to read. This method determines how much data is in the - * socket, allocates a buffer of this size, reads in the data, and - * returns the number of bytes read. The caller is responsible for - * deleting the member in the <iov_base> field of <io_vec> using - * delete [] io_vec->iov_base. - */ - ssize_t recvv (iovec *io_vec, - const ACE_Time_Value *timeout = 0); - - /// Send an <n> byte buffer to the connected socket. - ssize_t send (const void *buf, - size_t n, - int flags, - const ACE_Time_Value *timeout = 0); - - /// Send an <n> byte buffer to the connected socket. - ssize_t send (const void *buf, - size_t n, - const ACE_Time_Value *timeout = 0); - - /// Send an <iovec> of size <n> to the connected socket. - ssize_t sendv (const iovec iov[], - int n, - const ACE_Time_Value *timeout = 0); - - // = Selectively close endpoints. - /// Close down the reader. - int close_reader (void); - - /// Close down the writer. - int close_writer (void); - - /** - * Close down the socket (we need this to make things work correctly - * on Win32, which requires use to do a <close_writer> before doing - * the close to avoid losing data). - */ - int close (void); - - // = Meta-type info - typedef ACE_INET_Addr PEER_ADDR; - - /// Dump the state of an object. - void dump (void) const; - - /// Declare the dynamic allocation hooks. - ACE_ALLOC_HOOK_DECLARE; - - public: - Session *session (void) const; - void session (Session *); - - Notifier *notifier (void); - - void register_notifier (ACE_Reactor *r); - - ACE_HANDLE get_handle (void) const; - - const ACE_SOCK_Stream &ace_stream (void) const; - ACE_SOCK_Stream &ace_stream (void); - - ///@notes Added the following methods to continue with - /// current compilation of HTIOP. Might not be needed in - /// future. - Priyanka - /// {@ - void set_handle (ACE_HANDLE h); - - /** - * Enable asynchronous I/O (ACE_SIGIO), urgent data (ACE_SIGURG), - * non-blocking I/O (ACE_NONBLOCK), or close-on-exec (ACE_CLOEXEC), - * which is passed as the <value>. - */ - int enable (int value) const; - - /** - * Disable asynchronous I/O (ACE_SIGIO), urgent data (ACE_SIGURG), - * non-blocking I/O (ACE_NONBLOCK), or close-on-exec (ACE_CLOEXEC), - * which is passed as the <value>. - */ - int disable (int value) const; - //@} - - // buffer related methods. - ACE_Message_Block &leftovers (void); - size_t data_len (void) const; - void data_len (size_t n); - size_t data_consumed (void) const; - void data_consumed (size_t n); - int load_buffer (void); - int flush_buffer (void); - int recv_ack (void); - int send_ack (void); - unsigned long request_count(); - Filter *filter (void) const; - void filter (Filter *); - State state (void) const; - void state (Channel::State s); - int pre_recv(void); - int consume_error (void); - - private: - - /// Get the filter from the Filter_Factory - Filter * get_filter (); - - /// The filter_ is a pluggable component used to manage the - /// wrapping of data in a way suitable for the proxy to - /// manage. The actual filter instance is owned by the - /// session. Different filters may be required depending on - /// which side of the proxy we are on, and the direction of data - /// flow. - Filter *filter_; - - /// The session_ is a reference to the persistent session this - /// stream is associated with. On the inside, sessions are - /// created by the Connector, which then create streams on - /// demand. - Session *session_; - - /// Since this stream implements its own send and recv methods, - /// the filter cannot simply call the send and recv methods of - /// this class. Therefore an ACE_SOCK_Stream wrapper around the - /// same socket instance is necessary to avoid recursion. - ACE_SOCK_Stream ace_stream_; - - Notifier *notifier_; - - ACE_Message_Block leftovers_; - size_t data_len_; - size_t data_consumed_; - State state_; - ACE_Message_Block *error_buffer_; - unsigned long request_count_; - }; - } -} - -ACE_END_VERSIONED_NAMESPACE_DECL - -#if defined (__ACE_INLINE__) -#include "HTBP_Channel.inl" -#endif - -#include /**/ "ace/post.h" -#endif /* ACE_HTBP_CHANNEL_H */ diff --git a/protocols/ace/HTBP/HTBP_Channel.inl b/protocols/ace/HTBP/HTBP_Channel.inl deleted file mode 100644 index 7df1ba8f16e..00000000000 --- a/protocols/ace/HTBP/HTBP_Channel.inl +++ /dev/null @@ -1,124 +0,0 @@ -// -*- C++ -*- -// -// $Id$ - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -ACE_INLINE -ACE::HTBP::Session * -ACE::HTBP::Channel::session (void) const -{ - return this->session_; -} - -// session assignment only occurs when the stream is transferred to another -// session. Do *not* delete the old session object. -ACE_INLINE -void -ACE::HTBP::Channel::session (ACE::HTBP::Session *s) -{ - this->session_ = s; -} - -// I'm not sure of the proper use case for getting the filter reference. The -// problem is that the filter is not reference counted, so the returned value -// should not be stored. -ACE_INLINE -ACE::HTBP::Filter * -ACE::HTBP::Channel::filter (void) const -{ - return this->filter_; -} - -// Filters are owned by the channel. If a new filter is applied, the old one -// must be deleted. -ACE_INLINE -void -ACE::HTBP::Channel::filter (ACE::HTBP::Filter *f) -{ - if (this->filter_) - delete this->filter_; - this->filter_ = f; -} - -ACE_INLINE -int -ACE::HTBP::Channel::close_reader (void) -{ - return this->ace_stream_.close_reader(); -} - -ACE_INLINE -int -ACE::HTBP::Channel::close_writer (void) -{ - return this->ace_stream_.close_writer(); -} - -ACE_INLINE -int -ACE::HTBP::Channel::close (void) -{ - return this->ace_stream_.close(); -} - -ACE_INLINE -ACE::HTBP::Channel::State -ACE::HTBP::Channel::state (void) const -{ - return this->state_; -} - -ACE_INLINE -ACE_Message_Block & -ACE::HTBP::Channel::leftovers (void) -{ - return this->leftovers_; -} - -ACE_INLINE -size_t -ACE::HTBP::Channel::data_len(void) const -{ - return this->data_len_; -} - -ACE_INLINE -void -ACE::HTBP::Channel::data_len(size_t n) -{ - this->data_len_ = n; -} - -ACE_INLINE -size_t -ACE::HTBP::Channel::data_consumed(void) const -{ - return this->data_consumed_; -} - - -ACE_INLINE -const ACE_SOCK_Stream& -ACE::HTBP::Channel::ace_stream (void) const -{ - return this->ace_stream_; -} - -ACE_INLINE -ACE_SOCK_Stream& -ACE::HTBP::Channel::ace_stream (void) -{ - return this->ace_stream_; -} - -ACE_INLINE -void -ACE::HTBP::Channel::set_handle (ACE_HANDLE h) -{ - if (h == 0) - return; - this->ace_stream_.set_handle (h); -} - -ACE_END_VERSIONED_NAMESPACE_DECL diff --git a/protocols/ace/HTBP/HTBP_Environment.cpp b/protocols/ace/HTBP/HTBP_Environment.cpp deleted file mode 100644 index bd14abcce3d..00000000000 --- a/protocols/ace/HTBP/HTBP_Environment.cpp +++ /dev/null @@ -1,201 +0,0 @@ -// $Id$ - -#include "HTBP_Environment.h" - -ACE_RCSID (HTBP, - ACE_HTBP_Environment, - "$Id$") - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -ACE::HTBP::Environment::Environment (ACE_Configuration *config, - int using_registry, - const ACE_TCHAR *persistent_file) - : config_ (config), - imp_exp_ (0), - own_config_ (config != 0) -{ - initialize (using_registry, - persistent_file); -} - -ACE::HTBP::Environment::~Environment () -{ - if (!own_config_) - this->clear(); - else - delete this->config_; - - delete this->imp_exp_; -} - -void -ACE::HTBP::Environment::clear () -{ - if (this->config_) - this->config_->remove_section (config_->root_section (), - ACE_TEXT("htbp"), - 1); -} - -int -ACE::HTBP::Environment::initialize (int use_registry, - const ACE_TCHAR *persistent_file) -{ - if (this->config_ == 0) - { - int result = -1; - if (use_registry) - result = this->open_registry_config(); - if (result == -1) - result = this->open_persistent_config (persistent_file); - if (result != 0) - { - ACE_ERROR_RETURN ((LM_ERROR, - ACE_TEXT("ACE::HTBP::Environment::initialize (): ") - ACE_TEXT("Open Config failed")), - -1); - } - } - - - ACE_NEW_RETURN (this->imp_exp_, - ACE_Ini_ImpExp (*this->config_), - -1); - - if (this->config_->open_section (config_->root_section (), - ACE_TEXT("htbp"), 1, - this->htbp_key_) != 0) - ACE_ERROR_RETURN ((LM_ERROR, - ACE_TEXT("ACE::HTBP::Environment::initialize (). ") - ACE_TEXT("Open HTBP Section failed")), - -1); - return 0; -} - -int -ACE::HTBP::Environment::open_registry_config () -{ -#if defined (ACE_WIN32) - HKEY root = - ACE_Configuration_Win32Registry::resolve_key - (HKEY_LOCAL_MACHINE,ACE_TEXT("Software\\HTBP\\Environment")); - - ACE_NEW_RETURN (this->config_, - ACE_Configuration_Win32Registry (root), - -1); - return 0; -#else - errno = ENOTSUP; - return -1; -#endif /* ACE_WIN32 */ -} - -int -ACE::HTBP::Environment::open_persistent_config (const ACE_TCHAR *persistent_file) -{ - ACE_Configuration_Heap *heap; - ACE_NEW_RETURN (heap, - ACE_Configuration_Heap, - -1); - // do this before trying to open so it isn't leaked if the open fails. - this->config_ = heap; - if (persistent_file == 0) - heap->open(); - else - if (heap->open (persistent_file) != 0) - ACE_ERROR_RETURN (( LM_ERROR, - ACE_TEXT ("ACE::HTBP::Environment::open_config: %p\n"), - persistent_file), - -1 ); - return 0; -} - -int -ACE::HTBP::Environment::get_htid_url (ACE_TString &htid_url) const -{ - return this->config_->get_string_value (this->htbp_key_, - ACE_TEXT("htid_url"), - htid_url); -} - -int -ACE::HTBP::Environment::set_htid_url (const ACE_TCHAR *htid_generator_url) -{ - return this->config_->set_string_value (this->htbp_key_, - ACE_TEXT("htid_url"), - htid_generator_url); -} - - -int -ACE::HTBP::Environment::get_htid_via_proxy (int &via_proxy) const -{ - return this->config_->get_integer_value (this->htbp_key_, - ACE_TEXT("htid_via_proxy"), - (u_int &)via_proxy); -} - -int -ACE::HTBP::Environment::set_htid_via_proxy (int via_proxy) -{ - return this->config_->set_integer_value (this->htbp_key_, - ACE_TEXT("htid_via_proxy"), - (u_int)via_proxy); -} - -int -ACE::HTBP::Environment::get_proxy_host (ACE_TString &proxy_host) const -{ - return this->config_->get_string_value (this->htbp_key_, - ACE_TEXT("proxy_host"), - proxy_host); -} - -int -ACE::HTBP::Environment::set_proxy_host (const ACE_TCHAR *proxy_host) -{ - return this->config_->set_string_value (this->htbp_key_, - ACE_TEXT("proxy_host"), - proxy_host); -} - -int -ACE::HTBP::Environment::get_proxy_port (unsigned int &proxy_port) const -{ - int result = this->config_->get_integer_value (this->htbp_key_, - ACE_TEXT("proxy_port"), - proxy_port); - if (result != 0) - { - ACE_TString port_str; - result = this->config_->get_string_value (this->htbp_key_, - ACE_TEXT("proxy_port"), - port_str); - if (result == 0) - proxy_port = ACE_OS::strtol(port_str.c_str(),0,10); - } - return result; -} - -int -ACE::HTBP::Environment::set_proxy_port (unsigned int proxy_port) -{ - return this->config_->set_integer_value (this->htbp_key_, - ACE_TEXT("proxy_port"), - proxy_port); -} - -int -ACE::HTBP::Environment::import_config (const ACE_TCHAR *filename) -{ - return this->imp_exp_->import_config (filename); -} - -int -ACE::HTBP::Environment::export_config (const ACE_TCHAR *filename) -{ - return this->imp_exp_->export_config (filename); -} - -ACE_END_VERSIONED_NAMESPACE_DECL diff --git a/protocols/ace/HTBP/HTBP_Environment.h b/protocols/ace/HTBP/HTBP_Environment.h deleted file mode 100644 index 894a376457a..00000000000 --- a/protocols/ace/HTBP/HTBP_Environment.h +++ /dev/null @@ -1,110 +0,0 @@ -// -*- C++ -*- -// $Id$ - -#ifndef ACE_HTBP_ENVIRONMENT_H -#define ACE_HTBP_ENVIRONMENT_H -#include /**/ "ace/pre.h" - -#include "HTBP_Export.h" - -#if !defined (ACE_LACKS_PRAGMA_ONCE) -# pragma once -#endif /* ACE_LACKS_PRAGMA_ONCE */ - -#include "ace/Configuration.h" -#include "ace/Configuration_Import_Export.h" -#include "ace/Singleton.h" - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -namespace ACE -{ - namespace HTBP - { - - /** - * @class Environment - * - * @brief - * - * This class manages the storage of configuration data, either in a - * flat file for Unix systems, or in the Windows registry - */ - class HTBP_Export Environment - { - public: - - /// Constructor - Environment (ACE_Configuration *config = 0, - int using_registry = 0, - const ACE_TCHAR *persistent_file = 0); - - /// Destructor - ~Environment (); - - /// removes all htbp related values from the configuration - void clear (void); - - /// Accessors to HTID URL - /// Returns 0 on success - /// {@ - int get_htid_url (ACE_TString &htid_url) const; - int set_htid_url (const ACE_TCHAR *htid_generator_url); - /// @} - - /// Accessors to HTID via proxy - If value is true, HTID request goes - /// through configured proxy otherwise it uses a direct connection. - /// Returns 0 on success - /// {@ - int get_htid_via_proxy (int &htid_via_proxy) const; - int set_htid_via_proxy (int htid_via_proxy); - /// @} - - /// Accessors to Proxy Address - /// Returns 0 on success - /// {@ - int get_proxy_host (ACE_TString &proxy_host) const; - int set_proxy_host (const ACE_TCHAR *proxy_host); - /// @} - - /// Returns 0 on success - /// {@ - int get_proxy_port (unsigned int &proxy_port) const; - int set_proxy_port (unsigned int proxy_port); - /// @} - - /// Import the configuration from the filename - int import_config (const ACE_TCHAR *filename); - - /// Export the configuration to the filename - int export_config (const ACE_TCHAR *filename); - - private: - /// Open config, set sections etc - int initialize (int use_registry, - const ACE_TCHAR *persistent_file); - - /// Open an ACE_Configuration of the appropriate type. - int open_registry_config (); - int open_persistent_config (const ACE_TCHAR *persistent_file); - - /// Our Proxy and HTID generator URL database - ACE_Configuration *config_; - - /// Flat section of HTBP related items - ACE_Configuration_Section_Key htbp_key_; - - /// the wrapper used to import or export initialization values - ACE_Ini_ImpExp *imp_exp_; - - /// We created the config instance, so we must clean it up - int own_config_; - - }; - } -} - -ACE_END_VERSIONED_NAMESPACE_DECL - -#include /**/ "ace/post.h" -#endif /* ACE_HTBP_ENVIRONMENT_H */ diff --git a/protocols/ace/HTBP/HTBP_Export.h b/protocols/ace/HTBP/HTBP_Export.h deleted file mode 100644 index 19ce8a89547..00000000000 --- a/protocols/ace/HTBP/HTBP_Export.h +++ /dev/null @@ -1,53 +0,0 @@ -// -*- C++ -*- -// $Id$ -// Definition for Win32 Export directives. -// This file is generated automatically by generate_export_file.pl -d -s HTBP -// ------------------------------ -#ifndef HTBP_EXPORT_H -#define HTBP_EXPORT_H - -#include "ace/config-all.h" - -#if defined (ACE_AS_STATIC_LIBS) && !defined (HTBP_HAS_DLL) -# define HTBP_HAS_DLL 0 -#endif /* ACE_AS_STATIC_LIBS && HTBP_HAS_DLL */ - -#if !defined (HTBP_HAS_DLL) -# define HTBP_HAS_DLL 1 -#endif /* ! HTBP_HAS_DLL */ - -#if defined (HTBP_HAS_DLL) && (HTBP_HAS_DLL == 1) -# if defined (HTBP_BUILD_DLL) -# define HTBP_Export ACE_Proper_Export_Flag -# define HTBP_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T) -# define HTBP_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) -# else /* HTBP_BUILD_DLL */ -# define HTBP_Export ACE_Proper_Import_Flag -# define HTBP_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T) -# define HTBP_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) -# endif /* HTBP_BUILD_DLL */ -#else /* HTBP_HAS_DLL == 1 */ -# define HTBP_Export -# define HTBP_SINGLETON_DECLARATION(T) -# define HTBP_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) -#endif /* HTBP_HAS_DLL == 1 */ - -// Set HTBP_NTRACE = 0 to turn on library specific tracing even if -// tracing is turned off for ACE. -#if !defined (HTBP_NTRACE) -# if (ACE_NTRACE == 1) -# define HTBP_NTRACE 1 -# else /* (ACE_NTRACE == 1) */ -# define HTBP_NTRACE 0 -# endif /* (ACE_NTRACE == 1) */ -#endif /* !HTBP_NTRACE */ - -#if (HTBP_NTRACE == 1) -# define HTBP_TRACE(X) -#else /* (HTBP_NTRACE == 1) */ -# define HTBP_TRACE(X) ACE_TRACE_IMPL(X) -#endif /* (HTBP_NTRACE == 1) */ - -#endif /* HTBP_EXPORT_H */ - -// End of auto generated file. diff --git a/protocols/ace/HTBP/HTBP_Filter.cpp b/protocols/ace/HTBP/HTBP_Filter.cpp deleted file mode 100644 index 2ac714b8904..00000000000 --- a/protocols/ace/HTBP/HTBP_Filter.cpp +++ /dev/null @@ -1,57 +0,0 @@ -// $Id$ - -#include "ace/Log_Msg.h" - -#include "HTBP_Session.h" -#include "HTBP_Filter.h" - -#if !defined (__ACE_INLINE__) -#include "HTBP_Filter.inl" -#endif - -ACE_RCSID(HTBP,ACE_HTBP_Filter,"$Id$") - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -ACE::HTBP::Filter::Filter (void) - :http_code_ (0) -{ -} - -ACE::HTBP::Filter::~Filter (void) -{ -} - -char * -ACE::HTBP::Filter::header_complete (ACE::HTBP::Channel *ch) -{ - if (ch->leftovers().length() == 0) - { - return 0; - } - if (ch->leftovers().space() > 0) - *ch->leftovers().wr_ptr() = '\0'; - char *start = ch->leftovers().rd_ptr(); - char *nl = ACE_OS::strchr (start,'\n'); - if (this->http_code_ == 0) - { - char *code = ACE_OS::strstr (start,"HTTP/1."); - if (code && code < nl) - { - code += 9; // skip past "HTTP/1.1 " - this->http_code_ = strtol(code,0,10); - } - } - - while (nl) - { - if ((nl == start) || - (nl == start +1 && *start == '\r')) - return nl + 1; - start = nl + 1; - nl = ACE_OS::strchr (start,'\n'); - } - return 0; -} - -ACE_END_VERSIONED_NAMESPACE_DECL diff --git a/protocols/ace/HTBP/HTBP_Filter.h b/protocols/ace/HTBP/HTBP_Filter.h deleted file mode 100644 index ebc9ebb895f..00000000000 --- a/protocols/ace/HTBP/HTBP_Filter.h +++ /dev/null @@ -1,104 +0,0 @@ -// -*- C++ -*- - -//============================================================================= -/** - * @file HTBP_Filter.h - * - * $Id$ - * - * @author Phil Mesnier - */ -//============================================================================= - -#ifndef ACE_HTBP_FILTER_H -#define ACE_HTBP_FILTER_H -#include /**/ "ace/pre.h" - -#include "ace/OS.h" -#if !defined (ACE_LACKS_PRAGMA_ONCE) -# pragma once -#endif /* ACE_LACKS_PRAGMA_ONCE */ - -#include "HTBP_Export.h" - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -namespace ACE -{ - namespace HTBP - { - - // Forward declarations. - class Channel; - - /** - * @class ACE_HTBP_Filter - * - * @brief Defines the methods in the <ACE_HTBP_Filter> abstraction. - * - * A filter is responsible for wrapping / unwrapping messages - * depending on direction of flow on each stream. There will be 4 - * filters participating in a session, inside-send, inside-recv, - * outside-send, ouside-recv. It is anticipated that specialized - * filters will be implemented that tune the filter behavior based - * on proxy particulars. That, or there will be a matrix - * configuration parameters that may be tweeked to match the - * configuration. It remains to be seen which is easier to - * manage. - */ - class HTBP_Export Filter - { - public: - Filter (void); - - virtual ~Filter (void); - - /// Inside and outside Send filters need to supply a data header that - /// sets the stage before sending the data body, and then (maybe) send a - /// data trailer that closes the message. The data header may be formatted - /// differently on the first message, to send optional context information. - virtual ssize_t send_data_header (ssize_t data_len, Channel *ch); - virtual ssize_t send_data_trailer (Channel *ch); - - /// Upon receiving data, the Channel is obliged to send an ack. This is - /// either an empty document if this is the in-to-out stream, or a new - /// long-duration document request if this is the out-to-in stream. - virtual int send_ack (Channel *ch); - virtual int recv_ack (Channel *ch); - - /// receiving data must compliment sending. In the case of an in-to-out - /// stream. It is possible that the stream identity is not known until the - /// first request is received. In this case the filter will have to look - /// lookup the received session ID and either create a new instance or - /// reassign itself to an existing sesion. In that case, the associated - /// stream will have to be reassigned as well. - /// - virtual ssize_t recv_data_header (Channel *ch); - virtual ssize_t recv_data_trailer(Channel *ch); - - /// reset the http_code_ in anticipation of a new message. - void reset_http_code (void); - - /// get the value of the most recent http result code - int http_code (void); - - protected: - char *header_complete (Channel *ch); - - private: - /// Store the most recent HTTP result code. Typically it will be 200, - /// but it could be a 4xx or 5xx code if the proxy reports an error. - int http_code_; - - }; - } -} - -ACE_END_VERSIONED_NAMESPACE_DECL - -#if defined (__ACE_INLINE__) -#include "HTBP_Filter.inl" -#endif - -#include /**/ "ace/post.h" -#endif /* ACE_HTBP_FILTER_H */ diff --git a/protocols/ace/HTBP/HTBP_Filter.inl b/protocols/ace/HTBP/HTBP_Filter.inl deleted file mode 100644 index c648393daa4..00000000000 --- a/protocols/ace/HTBP/HTBP_Filter.inl +++ /dev/null @@ -1,63 +0,0 @@ -// -*- C++ -*- -// -// $Id$ - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -ACE_INLINE -ssize_t -ACE::HTBP::Filter::send_data_header (ssize_t, ACE::HTBP::Channel * ) -{ - return 0; -} - -ACE_INLINE -ssize_t -ACE::HTBP::Filter::send_data_trailer (ACE::HTBP::Channel *) -{ - return 0; -} - -ACE_INLINE -int -ACE::HTBP::Filter::send_ack (ACE::HTBP::Channel *) -{ - return 0; -} - -ACE_INLINE -int -ACE::HTBP::Filter::recv_ack (ACE::HTBP::Channel *) -{ - return 0; -} - -ACE_INLINE -ssize_t -ACE::HTBP::Filter::recv_data_header (ACE::HTBP::Channel *) -{ - return 0; -} - -ACE_INLINE -ssize_t -ACE::HTBP::Filter::recv_data_trailer(ACE::HTBP::Channel *) -{ - return 0; -} - -ACE_INLINE -void -ACE::HTBP::Filter::reset_http_code (void) -{ - this->http_code_ = 0; -} - -ACE_INLINE -int -ACE::HTBP::Filter::http_code (void) -{ - return this->http_code_; -} - -ACE_END_VERSIONED_NAMESPACE_DECL diff --git a/protocols/ace/HTBP/HTBP_Filter_Factory.cpp b/protocols/ace/HTBP/HTBP_Filter_Factory.cpp deleted file mode 100644 index 07b16ea9669..00000000000 --- a/protocols/ace/HTBP/HTBP_Filter_Factory.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// $Id$ - -#include "HTBP_Filter_Factory.h" -#include "HTBP_Inside_Squid_Filter.h" -#include "HTBP_Outside_Squid_Filter.h" - -#include "HTBP_Stream.h" -#include "ace/Service_Object.h" -#include "ace/Dynamic_Service.h" -#include "ace/Log_Msg.h" - -ACE_RCSID (ACE_HTBP_Filter_Factory, HTBP, "$Id$") - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -ACE::HTBP::Filter_Factory::Filter_Factory () -{ -} - -ACE::HTBP::Filter_Factory::~Filter_Factory () -{ -} - -ACE::HTBP::Filter * -ACE::HTBP::Filter_Factory::get_filter (int inside) -{ - ACE::HTBP::Filter *filter = 0; - if (inside) - ACE_NEW_RETURN (filter, - ACE::HTBP::Inside_Squid_Filter (),0); - else - ACE_NEW_RETURN (filter, - ACE::HTBP::Outside_Squid_Filter (),0); - return filter; -} - -int -ACE::HTBP::Filter_Factory::init (int /* argc */, - ACE_TCHAR * /* argv */ []) -{ - return 0; -} - -ACE_END_VERSIONED_NAMESPACE_DECL - -ACE_STATIC_SVC_DEFINE (ACE_HTBP_Filter_Factory, - ACE_TEXT ("Filter_Factory"), - ACE_SVC_OBJ_T, - &ACE_SVC_NAME (ACE_HTBP_Filter_Factory), - ACE_Service_Type::DELETE_THIS | - ACE_Service_Type::DELETE_OBJ, - 0) - -ACE_FACTORY_NAMESPACE_DEFINE (HTBP, ACE_HTBP_Filter_Factory, - ACE::HTBP::Filter_Factory) - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_Dynamic_Service<ACE::HTBP::Filter_Factory>; -#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) -#pragma instantiate ACE_Dynamic_Service<ACE::HTBP::Filter_Factory> -#endif - diff --git a/protocols/ace/HTBP/HTBP_Filter_Factory.h b/protocols/ace/HTBP/HTBP_Filter_Factory.h deleted file mode 100644 index 0681055b679..00000000000 --- a/protocols/ace/HTBP/HTBP_Filter_Factory.h +++ /dev/null @@ -1,70 +0,0 @@ -// -*- C++ -*- -// $Id$ - -//============================================================================= -/** - * @file HTBP_Filter_Factory.h - * - * $Id$ - * - * @author Priyanka Gontla - */ -//============================================================================= - -#ifndef ACE_HTBP_FILTER_FACTORY -#define ACE_HTBP_FILTER_FACTORY -#include /**/ "ace/pre.h" - -#include "HTBP_Export.h" -#include "HTBP_Filter.h" -#include "ace/Service_Config.h" -#include "ace/Service_Object.h" - -#if !defined (ACE_LACKS_PRAGMA_ONCE) -# pragma once -#endif /* ACE_LACKS_PRAGMA_ONCE */ - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -namespace ACE -{ - namespace HTBP - { - class Stream; - - /** - * @class Filter_Factory - * - * @brief Factory to get the Filters - * - * The Filter Factory is to be used for getting filters based on the - * mode requested. This class is a ACE_Service_Object and should be - * loadable with the help of the service configurator framework. - */ - class HTBP_Export Filter_Factory : public ACE_Service_Object - { - public: - - /// Constructor - Filter_Factory (); - - ~Filter_Factory (); - - /// Initialization hook. - virtual int init (int argc, ACE_TCHAR *argv[]); - - // - Filter *get_filter (int inside); - }; - } -} - -ACE_END_VERSIONED_NAMESPACE_DECL - -ACE_STATIC_SVC_DECLARE_EXPORT (HTBP, ACE_HTBP_Filter_Factory) -ACE_FACTORY_DECLARE (HTBP, ACE_HTBP_Filter_Factory) - - - -#include /**/ "ace/post.h" -#endif /* ACE_HTBP_FILTER_FACTORY */ diff --git a/protocols/ace/HTBP/HTBP_ID_Requestor.cpp b/protocols/ace/HTBP/HTBP_ID_Requestor.cpp deleted file mode 100644 index 66d3ef7cd93..00000000000 --- a/protocols/ace/HTBP/HTBP_ID_Requestor.cpp +++ /dev/null @@ -1,139 +0,0 @@ -// $Id$ - -#include "HTBP_ID_Requestor.h" -#include "HTBP_Environment.h" - -#include "ace/OS_NS_stdio.h" -#include "ace/OS_NS_string.h" -#include "ace/SOCK_Stream.h" -#include "ace/SOCK_Connector.h" -#include "ace/UUID.h" - -ACE_RCSID(HTBP, - ACE_HTBP_ID_Requestor, - "$Id$") - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -ACE_TString ACE::HTBP::ID_Requestor::htid_; -ACE_SYNCH_MUTEX ACE::HTBP::ID_Requestor::htid_lock_; - -ACE::HTBP::ID_Requestor::ID_Requestor (ACE::HTBP::Environment *env) - : port_ (0), - host_ (), - url_() -{ - if (env) - { - env->get_htid_url(url_); - int via_proxy = 0; - env->get_htid_via_proxy (via_proxy); - if (via_proxy && env->get_proxy_host (host_) == 0) - env->get_proxy_port (port_); - } -} - -int -ACE::HTBP::ID_Requestor::connect_to_server (ACE_SOCK_Stream *cli_stream) -{ - if (port_ == 0 || host_.length() == 0) - { - int host_start = url_.find (ACE_TEXT("http://")) + 7; - int port_sep = 0; - int sep = 0; - if (host_start == -1) - ACE_ERROR_RETURN ((LM_ERROR, - ACE_TEXT("ACE::HTBP::ID_Requestor::") - ACE_TEXT("connect_to_server: ") - ACE_TEXT("invalid URL: \"%s\"\n"), - url_.c_str()), - -1); - port_sep = url_.find (ACE_TEXT(":"),(size_t)host_start); - sep = url_.find (ACE_TEXT("/"),(size_t)host_start); - if (sep == -1 || sep == host_start +1) - ACE_ERROR_RETURN ((LM_ERROR, - ACE_TEXT("ACE::HTBP::ID_Requestor::") - ACE_TEXT("connect_to_server: ") - ACE_TEXT("invalid URL: \"%s\"\n"), - url_.c_str()), - -1); - if (port_sep == -1) - { - port_sep = sep; - port_ = 80; // should be a default? - } - host_ = url_.substr(host_start,port_sep - host_start); - } - - ACE_INET_Addr remote_addr (port_, host_.c_str()); - ACE_SOCK_Connector con; - if (con.connect (*cli_stream, - remote_addr) == -1) - ACE_ERROR_RETURN ((LM_ERROR, - ACE_TEXT("ACE::HTBP::ID_Requestor::connect_to_server: ") - ACE_TEXT("%p\n"), - ACE_TEXT("socket connect")), - -1); - return 0; -} - -int -ACE::HTBP::ID_Requestor::send_request (ACE_SOCK_Stream *cli_stream) -{ - char *buffer; - ACE_NEW_RETURN (buffer, char[this->url_.length()+16],-1); - ACE_OS::sprintf (buffer,"GET %s HTTP/1.0\n\n", - ACE_TEXT_ALWAYS_CHAR(url_.c_str())); - int result = cli_stream->send_n (buffer,ACE_OS::strlen(buffer)); - delete [] buffer; - if (result == -1) - ACE_ERROR_RETURN ((LM_ERROR, - ACE_TEXT("ACE::HTBP::ID_Requestor::send_request %p\n"), - ACE_TEXT("socket send")), -1); - return 0; -} - -ACE_TCHAR * -ACE::HTBP::ID_Requestor::get_HTID () -{ - if (ACE::HTBP::ID_Requestor::htid_.length() != 0) - return ACE::HTBP::ID_Requestor::htid_.rep(); - - ACE_Guard<ACE_SYNCH_MUTEX> guard (ACE::HTBP::ID_Requestor::htid_lock_); - - if (ACE::HTBP::ID_Requestor::htid_.length() != 0) - return ACE::HTBP::ID_Requestor::htid_.rep(); - - ACE_SOCK_Stream cli_stream; - ACE_TCHAR * htid = 0; - - if (this->url_.length() == 0 || - this->connect_to_server (&cli_stream) == -1 || - this->send_request (&cli_stream) == -1) - { - ACE_Utils::UUID_Generator gen; - ACE_Utils::UUID *uuid = gen.generateUUID (); - const ACE_CString *uuidstr = uuid->to_string(); - ACE::HTBP::ID_Requestor::htid_ = ACE_TEXT_CHAR_TO_TCHAR (uuidstr->c_str()); - delete uuid; - return ACE::HTBP::ID_Requestor::htid_.rep(); - } - iovec recv_buf; - ssize_t result = cli_stream.recvv (&recv_buf); - cli_stream.close(); - - if (result > 0) - { - ACE_CString answer ((char *)recv_buf.iov_base,recv_buf.iov_len); - ssize_t start = answer.rfind (ACE_TEXT('\n')); - if (start == ACE_CString::npos) - start = 0; - else - start++; - ACE::HTBP::ID_Requestor::htid_ = ACE_TEXT_CHAR_TO_TCHAR(answer.substr (start).c_str()); - htid = ACE::HTBP::ID_Requestor::htid_.rep(); - } - return htid; -} - -ACE_END_VERSIONED_NAMESPACE_DECL diff --git a/protocols/ace/HTBP/HTBP_ID_Requestor.h b/protocols/ace/HTBP/HTBP_ID_Requestor.h deleted file mode 100644 index b885f07cae5..00000000000 --- a/protocols/ace/HTBP/HTBP_ID_Requestor.h +++ /dev/null @@ -1,63 +0,0 @@ -// -*- C++ -*- -// $Id$ - -#ifndef HTID_REQUESTOR_H -#define HTID_REQUESTOR_H -#include /**/ "ace/pre.h" - -#include "HTBP_Export.h" -#include "ace/SString.h" -#include "ace/Synch.h" - -#if !defined (ACE_LACKS_PRAGMA_ONCE) -# pragma once -#endif /* ACE_LACKS_PRAGMA_ONCE */ - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -// Forward declarations -class ACE_SOCK_Stream; - -namespace ACE -{ - namespace HTBP - { - // Forward declarations - class Environment; - - /** - * ACE_HTBP_ID_Requestor - * - * @brief This singleton class is to be used to get a HTID - */ - class HTBP_Export ID_Requestor - { - public: - /// Constructor. - ID_Requestor (Environment * = 0); - - /// Accessor to HTID - ACE_TCHAR *get_HTID (); - - private: - /// Connects to the remote host - int connect_to_server (ACE_SOCK_Stream *cli_stream); - - /// Send HTTP GET request to the server. - int send_request (ACE_SOCK_Stream *cli_stream); - - unsigned port_; - ACE_TString host_; - ACE_TString url_; - - static ACE_TString htid_; - static ACE_SYNCH_MUTEX htid_lock_; - }; - - } -} - -ACE_END_VERSIONED_NAMESPACE_DECL - -#include /**/ "ace/post.h" -#endif /* HTID_REQUESTOR_H */ diff --git a/protocols/ace/HTBP/HTBP_Inside_Squid_Filter.cpp b/protocols/ace/HTBP/HTBP_Inside_Squid_Filter.cpp deleted file mode 100644 index acb019ce2bb..00000000000 --- a/protocols/ace/HTBP/HTBP_Inside_Squid_Filter.cpp +++ /dev/null @@ -1,236 +0,0 @@ -// ACE_HTBP_Filter.cpp -// $Id$ - -#include "ace/Log_Msg.h" - -//#include <sstream> - -#include "HTBP_Session.h" -#include "HTBP_Inside_Squid_Filter.h" - -#if !defined (__ACE_INLINE__) -#include "HTBP_Inside_Squid_Filter.inl" -#endif - -ACE_RCSID(HTBP,ACE_HTBP_Inside_Squid_Filter,"$Id$") - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -ssize_t -ACE::HTBP::Inside_Squid_Filter::send_data_trailer (ACE::HTBP::Channel *ch) -{ - ch->state(ACE::HTBP::Channel::Wait_For_Ack); - return 0; -} - -int -ACE::HTBP::Inside_Squid_Filter::make_request_header (ACE::HTBP::Channel *ch, - const char *cmd, - char *buffer, - size_t buffer_size) -{ - // the string is formatted as: - // command http://host:port/htid/sessionId/request<requestId>.html HTTP/1.1\n - // host:port is the remote host and port from the channel, - // htid is the local endpoint identifier - // sessionId is the discreet session counter between these peers - // requestId is the discreet request sent for this session. - - ACE::HTBP::Session *session = ch->session(); - - const char * format = "%shttp://%s:%d/%s/%d/request%d.html HTTP/1.1\n"; - char remote_host[ACE_MAX_FULLY_QUALIFIED_NAME_LEN + 1]; - unsigned remote_port = session->peer_addr().get_port_number(); - const char *local_htid = session->local_addr().get_htid(); - - ACE_UINT32 tempId = session->session_id().id_; - size_t sid_size = 1; - size_t rid_size = 1; - while (tempId /= 10) sid_size++; - tempId = ch->request_count(); - while (tempId /= 10) rid_size++; - - // This test was originally get_host_name() == -1, but this is - // problematic if the address doesn't resolve to a name. I think - // that it should be configurable, or maybe the hostname needs to - // be carried independent of the address to work with hosts that may - // have dynamic IP addresses. For now that isn't a problem. - if (session->peer_addr().get_host_addr(remote_host, - sizeof remote_host) == 0) - ACE_ERROR_RETURN ((LM_ERROR, - ACE_TEXT("HTBP::Inside_Squid_Filter:could not get ") - ACE_TEXT("peer_addr hostname\n")), - -1); - - - size_t size = - ACE_OS::strlen(format) - - 12 // subtract out the size of the format specifiers - + ACE_OS::strlen (cmd) - + ACE_OS::strlen (remote_host) - + 5 // maximum size for a the remote port number - + ACE_OS::strlen (local_htid) - + sid_size // size of session id - + rid_size; // size of request id - - if (size > buffer_size) - ACE_ERROR_RETURN ((LM_ERROR, - ACE_TEXT("HTBP::Inside_Squid_Filter: insufficient ") - ACE_TEXT("buffer space for request header, need %d ") - ACE_TEXT("got %d\n"), - size, buffer_size), - -1); - - ACE_OS::sprintf (buffer,format, - cmd,remote_host,remote_port, - local_htid, session->session_id().id_, - ch->request_count()); - - return ACE_OS::strlen(buffer); -} - -ssize_t -ACE::HTBP::Inside_Squid_Filter::send_data_header (ssize_t data_len, - ACE::HTBP::Channel *ch) -{ - char *buffer = new char[BUFSIZ]; - ssize_t result = -1; - if (this->make_request_header (ch,"POST ",buffer,BUFSIZ) != -1) - { - ACE_CString header (buffer); - header += "Content-Type: application/octet-stream\nContent-Length: "; - char datalenstr[20]; - ACE_OS::itoa (data_len,datalenstr,10); - header += datalenstr; - header += "\n\n"; - result = ch->ace_stream().send(header.c_str(),header.length()); - } - ch->state(result == -1 ? ACE::HTBP::Channel::Closed : - ACE::HTBP::Channel::Header_Sent); - this->reset_http_code(); - return 1; -} - -ssize_t -ACE::HTBP::Inside_Squid_Filter::recv_data_header (ACE::HTBP::Channel *ch) -{ - if (this->http_code() != 200 && this->http_code() != 0) - { - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT("Inside_Squid_Filter::recv_data_header, ") - ACE_TEXT("non-OK result code %d recvd\n"), - this->http_code())); - - errno = ch->consume_error () ? EINVAL : EWOULDBLOCK; - return 0; - } - char *header_end = this->header_complete(ch); - if (header_end == 0) - { - if (ch->state() != ACE::HTBP::Channel::Closed) - { - ch->state (ACE::HTBP::Channel::Header_Pending); - errno = EWOULDBLOCK; - } - ACE_ERROR_RETURN ((LM_ERROR, - ACE_TEXT("Inside_Squid_Filter::recv_data_header, ") - ACE_TEXT("header not complete\n")), - 0); - } - char *start = ch->leftovers().rd_ptr(); - ACE_CString token = "Content-Length: "; - char *tpos = ACE_OS::strstr(start,token.c_str()); - char *nl = ACE_OS::strchr (start,'\n'); - if (tpos != 0) - { - tpos += token.length(); - *nl = 0; - ch->data_len (strtol(tpos,0,10)); - start = nl+1; - } - - ch->leftovers().rd_ptr(header_end); - if (this->http_code() != 200) - { - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT("Inside_Squid_Filter::recv_data_header, ") - ACE_TEXT("non-OK result code %d recvd\n"), - this->http_code())); - - errno = ch->consume_error () ? EINVAL : EWOULDBLOCK; - return 0; - } - - ch->state(ACE::HTBP::Channel::Data_Queued); - return 1; -} - -ssize_t -ACE::HTBP::Inside_Squid_Filter::recv_data_trailer (ACE::HTBP::Channel *ch) -{ - ch->state(ACE::HTBP::Channel::Send_Ack); - return 0; -} - -int -ACE::HTBP::Inside_Squid_Filter::send_ack (ACE::HTBP::Channel *ch) -{ - char *buffer = new char[BUFSIZ]; - ssize_t result = -1; - if (ch->state() == ACE::HTBP::Channel::Ack_Sent) - { - ACE_ERROR_RETURN ((LM_ERROR, - ACE_TEXT("Inside Filter::send_ack: ") - ACE_TEXT("state is already ACK_SENT\n")), - 1); - } - if (this->make_request_header (ch,"GET ",buffer,BUFSIZ) != -1) - { - ACE_CString header (buffer); - header += "\n"; - result = ch->ace_stream().send(header.c_str(),header.length()); - } - ch->state(result == -1 ? - ACE::HTBP::Channel::Closed : ACE::HTBP::Channel::Ack_Sent); - this->reset_http_code(); - return 1; -} - -int -ACE::HTBP::Inside_Squid_Filter::recv_ack (ACE::HTBP::Channel *ch) -{ - - char *header_end = this->header_complete(ch); - if (header_end == 0) - { - if (ch->state() != ACE::HTBP::Channel::Closed) - errno = EWOULDBLOCK; - ACE_ERROR_RETURN ((LM_ERROR, - ACE_TEXT("Inside_Squid_Filter::recv_data_header, ") - ACE_TEXT("header not complete\n")),0); - } - if (this->http_code() == 200) - { - ch->leftovers().length(0); - ch->state(ACE::HTBP::Channel::Ready); - return 1; - } - - char *start = ch->leftovers().rd_ptr(); - ACE_CString token = "Content-Length: "; - char *tpos = ACE_OS::strstr(start,token.c_str()); - char *nl = ACE_OS::strchr (start,'\n'); - if (tpos != 0) - { - tpos += token.length(); - *nl = 0; - ch->data_len (strtol(tpos,0,10)); - start = nl+1; - } - - ch->leftovers().rd_ptr(header_end); - errno = ch->consume_error () ? EINVAL : EWOULDBLOCK; - return 0; -} - -ACE_END_VERSIONED_NAMESPACE_DECL diff --git a/protocols/ace/HTBP/HTBP_Inside_Squid_Filter.h b/protocols/ace/HTBP/HTBP_Inside_Squid_Filter.h deleted file mode 100644 index e60a682d81f..00000000000 --- a/protocols/ace/HTBP/HTBP_Inside_Squid_Filter.h +++ /dev/null @@ -1,91 +0,0 @@ -// -*- C++ -*- - -//============================================================================= -/** - * @file HTBP_Inside_Squid_Filter.h - * - * $Id$ - * - * @author Phil Mesnier - */ -//============================================================================= - -#ifndef ACE_HTBP_INSIDE_SQUID_FILTER_H -#define ACE_HTBP_INSIDE_SQUID_FILTER_H -#include /**/ "ace/pre.h" - -#if !defined (ACE_LACKS_PRAGMA_ONCE) -# pragma once -#endif /* ACE_LACKS_PRAGMA_ONCE */ - -#include "HTBP_Export.h" -#include "HTBP_Filter.h" - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -namespace ACE -{ - namespace HTBP - { - - /** - * @class Inside_Squid_Filter - * - * @brief Defines the methods in the <Filter> abstraction. - * - * A filter is responsible for wrapping / unwrapping messages - * depending on direction of flow on each stream. There will be 4 - * filters participating in a session, inside-send, inside-recv, - * outside-send, ouside-recv. It is anticipated that specialized - * filters will be implemented that tune the filter behavior based - * on proxy particulars. That, or there will be a matrix - * configuration parameters that may be tweeked to match the - * configuration. It remains to be seen which is easier to - * manage. - */ - class HTBP_Export Inside_Squid_Filter : public Filter - { - public: - /// Destructor. - virtual ~Inside_Squid_Filter (void); - - /// Inside and outside Send filters need to supply a data header - /// that sets the stage before sending the data body, and then - /// (maybe) send a data trailer that closes the message. The - /// data header may be formatted differently on the first - /// message, to send optional context information. - virtual ssize_t send_data_header (ssize_t data_len, Channel *); - virtual ssize_t send_data_trailer (Channel *); - - /// Upon receiving data, the Channel is obliged to send an - /// ack. This is either an empty document if this is the - /// in-to-out stream, or a new long-duration document request if - /// this is the out-to-in stream. - virtual int send_ack (Channel *); - virtual int recv_ack (Channel *); - - /// receiving data must compliment sending. In the case of an - /// in-to-out stream. It is possible that the stream identity is - /// not known until the first request is received. In this case - /// the filter will have to look lookup the received session ID - /// and either create a new instance or reassign itself to an - /// existing sesion. In that case, the associated stream will - /// have to be reassigned as well. - /// - virtual ssize_t recv_data_header (Channel *); - virtual ssize_t recv_data_trailer(Channel *); - private: - int make_request_header (Channel *, const char *, char *, size_t ); - - }; - } -} - -ACE_END_VERSIONED_NAMESPACE_DECL - -#if defined (__ACE_INLINE__) -#include "HTBP_Inside_Squid_Filter.inl" -#endif - -#include /**/ "ace/post.h" -#endif /* ACE_HTBP_FILTER_H */ diff --git a/protocols/ace/HTBP/HTBP_Inside_Squid_Filter.inl b/protocols/ace/HTBP/HTBP_Inside_Squid_Filter.inl deleted file mode 100644 index e8b08950ce6..00000000000 --- a/protocols/ace/HTBP/HTBP_Inside_Squid_Filter.inl +++ /dev/null @@ -1,12 +0,0 @@ -// -*- C++ -*- -// -// $Id$ - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -ACE_INLINE -ACE::HTBP::Inside_Squid_Filter::~Inside_Squid_Filter (void) -{ -} - -ACE_END_VERSIONED_NAMESPACE_DECL diff --git a/protocols/ace/HTBP/HTBP_Macros.h b/protocols/ace/HTBP/HTBP_Macros.h deleted file mode 100644 index 0cb1300cc1d..00000000000 --- a/protocols/ace/HTBP/HTBP_Macros.h +++ /dev/null @@ -1,10 +0,0 @@ -// $Id$ - -#ifndef ACE_HTBP_MACROS_H -#define ACE_HTBP_MACROS_H - -#if !defined (ACE_HTBP_ENVIRONMENT_CONFIG_FILE) -#define ACE_HTBP_ENVIRONMENT_CONFIG_FILE "HT_Config.conf" -#endif /* ACE_HTBP_ENVIRONMENT_CONFIG_FILE */ - -#endif /* ACE_HTBP_MACROS_H */ diff --git a/protocols/ace/HTBP/HTBP_Notifier.cpp b/protocols/ace/HTBP/HTBP_Notifier.cpp deleted file mode 100644 index 70a6df54023..00000000000 --- a/protocols/ace/HTBP/HTBP_Notifier.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* -*- C++ -*- */ - -//============================================================================= -/** - * @file HTBP_Notifier.cpp - * - * $Id$ - * - * @author Phil Mesnier, Priyanka Gontla - */ -//============================================================================= -#include "HTBP_Notifier.h" -#include "HTBP_Channel.h" -#include "HTBP_Session.h" -#include "ace/Reactor.h" - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -ACE::HTBP::Notifier::Notifier (ACE::HTBP::Channel *s) - : channel_(s) -{ -} - -int -ACE::HTBP::Notifier::handle_input(ACE_HANDLE ) -{ - switch (this->channel_->state()) - { - case ACE::HTBP::Channel::Detached: - this->channel_->pre_recv(); - break; - case ACE::HTBP::Channel::Wait_For_Ack: - this->channel_->recv_ack(); - break; - default: - this->channel_->load_buffer(); - } - - if (this->channel_->state() == ACE::HTBP::Channel::Closed) - { - this->unregister(); - return 0; - } - - if (this->channel_->session_) - { - if (this->channel_ == this->channel_->session_->inbound()) - { - ACE_Event_Handler *h = this->channel_->session_->handler(); - if (h && this->reactor()) - this->reactor()->notify(h, - ACE_Event_Handler::READ_MASK); - else - ACE_DEBUG ((LM_DEBUG,"Notifier cannot notify, session has no handler (%x), or reactor (%x)\n",h,this->reactor())); - } - else - this->channel_->flush_buffer(); - } - else - ACE_DEBUG ((LM_DEBUG,"Notifier has no session to notify!\n")); - return 0; -} - -int -ACE::HTBP::Notifier::handle_output (ACE_HANDLE ) -{ - return -1; - -} - -void -ACE::HTBP::Notifier::unregister (void) -{ - if (this->reactor()) - this->reactor()->remove_handler(this, - ACE_Event_Handler::READ_MASK | - ACE_Event_Handler::DONT_CALL); -} - -ACE_HANDLE -ACE::HTBP::Notifier::get_handle(void) const -{ - return this->channel_->ace_stream().get_handle(); -} - -ACE_END_VERSIONED_NAMESPACE_DECL diff --git a/protocols/ace/HTBP/HTBP_Notifier.h b/protocols/ace/HTBP/HTBP_Notifier.h deleted file mode 100644 index 0c9dcffa2ed..00000000000 --- a/protocols/ace/HTBP/HTBP_Notifier.h +++ /dev/null @@ -1,54 +0,0 @@ -// -*- C++ -*- - -//============================================================================= -/** - * @file HTBP_Notifier.h - * - * $Id$ - * - * @author Phil Mesnier, Priyanka Gontla - */ -//============================================================================= - -#ifndef ACE_HTBP_NOTIFIER_H -#define ACE_HTBP_NOTIFIER_H -#include /**/ "ace/pre.h" - -#include "ace/Event_Handler.h" - -#if !defined (ACE_LACKS_PRAGMA_ONCE) -# pragma once -#endif /* ACE_LACKS_PRAGMA_ONCE */ - -#include "HTBP_Export.h" - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -namespace ACE -{ - namespace HTBP - { - // Forward declarations. - class Channel; - - class HTBP_Export Notifier : public ACE_Event_Handler - { - public: - Notifier (Channel *ch); - int handle_input(ACE_HANDLE ); - int handle_output(ACE_HANDLE ); - - void unregister (void); - - ACE_HANDLE get_handle (void) const; - - private: - Channel *channel_; - }; - } -} - -ACE_END_VERSIONED_NAMESPACE_DECL - -#include /**/ "ace/post.h" -#endif /* ACE_HTBP_NOTIFIER_H */ diff --git a/protocols/ace/HTBP/HTBP_Outside_Squid_Filter.cpp b/protocols/ace/HTBP/HTBP_Outside_Squid_Filter.cpp deleted file mode 100644 index 05e79083794..00000000000 --- a/protocols/ace/HTBP/HTBP_Outside_Squid_Filter.cpp +++ /dev/null @@ -1,196 +0,0 @@ -// ACE_HTBP_Outside_Squid_Filter.cpp -// $Id$ - -#include "ace/Log_Msg.h" - -#include "HTBP_Session.h" -#include "HTBP_Outside_Squid_Filter.h" - -#if !defined (__ACE_INLINE__) -#include "HTBP_Outside_Squid_Filter.inl" -#endif - -ACE_RCSID(HTBP, - ACE_HTBP_Outside_Squid_Filter, - "$Id$") - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -ssize_t -ACE::HTBP::Outside_Squid_Filter::recv_data_header (ACE::HTBP::Channel *ch) -{ - // on the outside of the firewall, this method must do the details - // necessary to call replace_session or whatever to migrate the sock - // stream to the appropriate ACE::HTBP::Channel, then to finally - // assign the right filter to that stream. That filter will an - // ACE::HTBP::Outside_[Send|Recv]_Filter. - - // in the case of an ACE::HTBP::Outside_Recv_Filter, the assigned - // filter must be a null filter first, with a replacement. - - // recv header details - char *header_end = this->header_complete(ch); - if (header_end == 0) - { - if (ch->state() != ACE::HTBP::Channel::Closed) - { - ch->state(ACE::HTBP::Channel::Header_Pending); - errno = EWOULDBLOCK; - } - return 0; - } - - char *start = ch->leftovers().rd_ptr(); - - int is_inbound = 0; - ACE_CString token ("POST "); - if (ACE_OS::strncmp (start,token.c_str(),token.length()) == 0) - is_inbound = 1; - else - { - token = "GET "; - if (ACE_OS::strncmp (start, - token.c_str(), - token.length()) != 0) - { - ch->leftovers().length(0); - errno = EINVAL; - ACE_ERROR_RETURN ((LM_ERROR, - "ACE::HTBP::Outside_Squid_Filter::recv_data_header " - "bad request header\n"),0); - } - } - start += token.length(); - // "http://" is stripped by squid, leaving only "/" - start += (ACE_OS::strncmp (start,"http://",7) == 0) ? 7 : 1; - - // set up the actual session and stream - ACE::HTBP::Session_Id_t session_id; - char * slash = ACE_OS::strchr(start,'/'); - char * nl = ACE_OS::strchr (start,'\n'); - if (slash == 0) - { - ch->leftovers().length(0); - errno = EINVAL; - ACE_ERROR_RETURN ((LM_ERROR, - "ACE::HTBP::Outside_Squid_Filter::recv_data_header " - "missing sender key\n"),0); - } - *slash = 0; - session_id.local_.string_to_addr (start); - start = slash+1; - - slash = ACE_OS::strchr(start,'/'); - if (slash == 0) - { - ch->leftovers().length(0); - errno = EINVAL; - ACE_ERROR_RETURN ((LM_ERROR, - "ACE::HTBP::Outside_Squid_Filter::recv_data_header " - "missing sender key\n"),0); - } - *slash = 0; - session_id.peer_.string_to_addr (start); - start = slash + 1; - - slash = ACE_OS::strchr(start,' '); - if (slash == 0) - { - ch->leftovers().length (0); - errno = EINVAL; - ACE_ERROR_RETURN ((LM_ERROR, - "ACE::HTBP::Outside_Squid_Filter::recv_data_header " - "missing sender key"),0); - } - *slash = 0; - session_id.id_ = strtol(start,0,10); - start = slash + 1; - - if (is_inbound) - { - token = "Content-Length: "; - char *tpos = ACE_OS::strstr(start,token.c_str()); - if (tpos != 0) - { - nl = ACE_OS::strchr(tpos,'\n'); - tpos += token.length(); - *nl = 0; - ch->data_len(strtol(tpos,0,10)); - start = nl+1; - } - } - ch->leftovers().rd_ptr(header_end); - - ACE::HTBP::Session *session = 0; - if (ACE::HTBP::Session::find_session (session_id, session) == -1) - { - ACE_NEW_RETURN (session, ACE::HTBP::Session (session_id), 0); - if (ACE::HTBP::Session::add_session (session) == -1) - ACE_ERROR_RETURN ((LM_ERROR, - "ACE::HTBP::Outside_Squid_Filter::" - "recv_data_header %p", - "add_session"),0); - } - ch->session(session); - - if (is_inbound) - { - ch->state(ACE::HTBP::Channel::Data_Queued); - session->inbound (ch); - } - else - { - ch->state(ACE::HTBP::Channel::Ready); - session->outbound (ch); - } - return 1; -} - -ssize_t -ACE::HTBP::Outside_Squid_Filter::recv_data_trailer (ACE::HTBP::Channel *ch) -{ - ch->state(ACE::HTBP::Channel::Send_Ack); - return 1; -} - -int -ACE::HTBP::Outside_Squid_Filter::send_ack (ACE::HTBP::Channel *ch) -{ - this->send_data_header (0,ch); - if (ch->state() == ACE::HTBP::Channel::Header_Sent) - ch->state(ACE::HTBP::Channel::Detached); - return 1; -} - -ssize_t -ACE::HTBP::Outside_Squid_Filter::send_data_header (ssize_t data_len, - ACE::HTBP::Channel *ch) -{ - ACE_CString header ("HTTP/1.1 200 OK\n" - "Content-Type: application/octet-stream\n" - "Content-Length: "); - char datalenstr[20]; - ACE_OS::itoa (data_len,datalenstr,10); - header += datalenstr; - header += "\n\n"; - ssize_t result = ch->ace_stream().send(header.c_str(),header.length()); - ch->state(result == -1 ? - ACE::HTBP::Channel::Closed : ACE::HTBP::Channel::Header_Sent); - this->reset_http_code(); - return 1; -} - -ssize_t -ACE::HTBP::Outside_Squid_Filter::send_data_trailer (ACE::HTBP::Channel *ch) -{ - ch->state(ACE::HTBP::Channel::Detached); - return 1; -} - -int -ACE::HTBP::Outside_Squid_Filter::recv_ack (ACE::HTBP::Channel *) -{ - return 1; -} - -ACE_END_VERSIONED_NAMESPACE_DECL diff --git a/protocols/ace/HTBP/HTBP_Outside_Squid_Filter.h b/protocols/ace/HTBP/HTBP_Outside_Squid_Filter.h deleted file mode 100644 index 92008c3a8b6..00000000000 --- a/protocols/ace/HTBP/HTBP_Outside_Squid_Filter.h +++ /dev/null @@ -1,86 +0,0 @@ -/* -*- C++ -*- */ - -//============================================================================= -/** - * @file HTBP_Outside_Squid_Filter.h - * - * $Id$ - * - * @author Phil Mesnier - */ -//============================================================================= - -#ifndef ACE_HTBP_OUTSIDE_SQUID_FILTER_H -#define ACE_HTBP_OUTSIDE_SQUID_FILTER_H -#include /**/ "ace/pre.h" - -#if !defined (ACE_LACKS_PRAGMA_ONCE) -# pragma once -#endif /* ACE_LACKS_PRAGMA_ONCE */ - -#include "HTBP_Export.h" -#include "HTBP_Filter.h" - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -namespace ACE -{ - namespace HTBP - { - // Forward declarations - class Channel; - - /** - * @class Outside_Squid_Filter - * - * @brief Defines the methods in the <Filter> abstraction. - * - * A filter is responsible for wrapping / unwrapping messages depending on - * direction of flow on each stream. There will be 4 filters participating in - * a session, outside-send, outside-recv, outside-send, ouside-recv. It is - * anticipated that specialized filters will be implemented that tune the - * filter behavior based on proxy particulars. That, or there will be a matrix - * configuration parameters that may be tweeked to match the configuration. - * It remains to be seen which is easier to manage. - */ - class HTBP_Export Outside_Squid_Filter : public Filter - { - public: - /// Destructor. - virtual ~Outside_Squid_Filter (void); - - /// Outside and outside Send filters need to supply a data header that - /// sets the stage before sending the data body, and then (maybe) send a - /// data trailer that closes the message. The data header may be formatted - /// differently on the first message, to send optional context information. - virtual ssize_t send_data_header (ssize_t data_len, Channel *); - virtual ssize_t send_data_trailer (Channel *); - - /// Upon receiving data, the Channel is obliged to send an ack. This is - /// either an empty document if this is the in-to-out stream, or a new - /// long-duration document request if this is the out-to-in stream. - virtual int send_ack (Channel *); - virtual int recv_ack (Channel *); - - /// receiving data must compliment sending. In the case of an in-to-out - /// stream. It is possible that the stream identity is not known until the - /// first request is received. In this case the filter will have to look - /// lookup the received session ID and either create a new instance or - /// reassign itself to an existing sesion. In that case, the associated - /// stream will have to be reassigned as well. - /// - virtual ssize_t recv_data_header (Channel *); - virtual ssize_t recv_data_trailer(Channel *); - }; - - } -} - -ACE_END_VERSIONED_NAMESPACE_DECL - -#if defined (__ACE_INLINE__) -#include "HTBP_Outside_Squid_Filter.inl" -#endif - -#include /**/ "ace/post.h" -#endif /* ACE_HTBP_OUTSIDE_FILTER_H */ diff --git a/protocols/ace/HTBP/HTBP_Outside_Squid_Filter.inl b/protocols/ace/HTBP/HTBP_Outside_Squid_Filter.inl deleted file mode 100644 index e0659ae5e13..00000000000 --- a/protocols/ace/HTBP/HTBP_Outside_Squid_Filter.inl +++ /dev/null @@ -1,12 +0,0 @@ -// -*- C++ -*- -// -// $Id$ - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -ACE_INLINE -ACE::HTBP::Outside_Squid_Filter::~Outside_Squid_Filter (void) -{ -} - -ACE_END_VERSIONED_NAMESPACE_DECL diff --git a/protocols/ace/HTBP/HTBP_Session.cpp b/protocols/ace/HTBP/HTBP_Session.cpp deleted file mode 100644 index 3ebd7da937e..00000000000 --- a/protocols/ace/HTBP/HTBP_Session.cpp +++ /dev/null @@ -1,305 +0,0 @@ -// SOCK_Stream.cpp -// $Id$ - -#include "ace/Log_Msg.h" - -#include "HTBP_Session.h" -#include "ace/SOCK_Connector.h" -#include "ace/Event_Handler.h" -#include "HTBP_Filter.h" -#include "HTBP_ID_Requestor.h" - -#if !defined (__ACE_INLINE__) -#include "HTBP_Session.inl" -#endif - -ACE_RCSID(HTBP,HTBP_Session,"$Id$") - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -ACE::HTBP::Session::Session_Map ACE::HTBP::Session::session_map_; -ACE_UINT32 ACE::HTBP::Session::last_session_id_ = 0; -ACE_SYNCH_MUTEX ACE::HTBP::Session::session_id_lock_; - -/// Static method definitions -ACE_UINT32 -ACE::HTBP::Session::next_session_id () -{ - ACE_Guard<ACE_SYNCH_MUTEX> g(ACE::HTBP::Session::session_id_lock_); - return ++last_session_id_; -} - -int -ACE::HTBP::Session::add_session (ACE::HTBP::Session *s) -{ - return session_map_.bind (s->session_id(),s); -} - -int -ACE::HTBP::Session::remove_session (ACE::HTBP::Session *s) -{ - if (session_map_.current_size() > 0) - return session_map_.unbind(s->session_id()); - return 0; -} - -int -ACE::HTBP::Session::find_session (const ACE::HTBP::Session_Id_t &sid, ACE::HTBP::Session *&out) -{ - ACE::HTBP::Session::Map_Entry *e = 0; - if (session_map_.find (sid,e) == -1) - { - out = 0; - return -1; - } - out = e->int_id_; - return 0; -} - -//---------------------------------------------------------------------------- -ACE::HTBP::Session::Session (void) - : proxy_addr_ (0), - destroy_proxy_addr_ (0), - inbound_ (0), - outbound_ (0), - closed_ (0), - handler_ (0), - reactor_(0), - stream_ (0), - sock_flags_(0) -{ - ACE::HTBP::ID_Requestor req; - ACE_TCHAR * htid = req.get_HTID(); - session_id_.local_ = ACE_TEXT_ALWAYS_CHAR(htid); - delete[] htid; - session_id_.id_ = ACE::HTBP::Session::next_session_id(); - ACE_NEW (inbound_, ACE::HTBP::Channel (this)); - ACE_NEW (outbound_, ACE::HTBP::Channel (this)); -} - -ACE::HTBP::Session::Session (const ACE::HTBP::Addr &peer, - const ACE::HTBP::Addr &local, - ACE_UINT32 sid, - ACE_INET_Addr *proxy, - int take_proxy) - : proxy_addr_ (proxy), - destroy_proxy_addr_ (take_proxy), - inbound_ (0), - outbound_ (0), - closed_ (0), - handler_ (0), - reactor_(0), - stream_ (0), - sock_flags_(0) -{ - session_id_.peer_ = peer; - session_id_.local_ = local; - session_id_.id_ = (sid == 0) ? - ACE::HTBP::Session::next_session_id() : sid; - - ACE_NEW (inbound_,ACE::HTBP::Channel (this)); - ACE_NEW (outbound_,ACE::HTBP::Channel (this)); -} - -ACE::HTBP::Session::Session (const ACE::HTBP::Session_Id_t &id, - ACE_INET_Addr *proxy, - int take_proxy) - : proxy_addr_ (proxy), - destroy_proxy_addr_ (take_proxy), - session_id_(id), - inbound_ (0), - outbound_ (0), - closed_ (0), - handler_ (0), - reactor_ (0), - stream_ (0), - sock_flags_(0) -{ - ACE_NEW (inbound_, ACE::HTBP::Channel (this)); - ACE_NEW (outbound_, ACE::HTBP::Channel (this)); -} - -ACE::HTBP::Session::Session (const ACE::HTBP::Session &other) -{ - this->operator=(other); -} - -ACE::HTBP::Session& -ACE::HTBP::Session::operator= (const ACE::HTBP::Session &) -{ - ACE_ASSERT (this == 0); - return *this; -} - -ACE::HTBP::Session::~Session (void) -{ - if (destroy_proxy_addr_) - delete proxy_addr_; -} - -int -ACE::HTBP::Session::close (void) -{ - if (this->inbound_) - this->inbound_->close(); - if (this->outbound_) - this->outbound_->close(); - this->closed_= 1; - return ACE::HTBP::Session::remove_session (this); -} - - -ACE::HTBP::Channel * -ACE::HTBP::Session::outbound (void) const -{ - if (!this->closed_ && this->proxy_addr_) - const_cast<ACE::HTBP::Session *> (this)->reconnect(); - if ( this->outbound_ == 0) - return 0; - ACE::HTBP::Channel::State s =this->outbound_->state(); - return s == ACE::HTBP::Channel::Init || s == ACE::HTBP::Channel::Ready ? this->outbound_ : 0; -} - -void -ACE::HTBP::Session::reconnect_i (ACE::HTBP::Channel *s) -{ - ACE_SOCK_Connector conn; - char host[100]; - this->proxy_addr_->get_host_name(host,100); - if (conn.connect (s->ace_stream(),*this->proxy_addr_) == -1) - { - ACE_TCHAR buffer[128]; - this->proxy_addr_->addr_to_string(buffer,128, 0); - ACE_ERROR ((LM_ERROR, - ACE_TEXT("ACE::HTBP::Session::reconnect failed to %s, %p\n"), - buffer, s == this->inbound_ ? - ACE_TEXT("inbound") : ACE_TEXT ("outbound"))); - } - s->register_notifier(this->reactor_); - if (s == this->inbound_) - s->send_ack(); -} - -ACE_Event_Handler * -ACE::HTBP::Session::handler (void) -{ - return this->handler_; -} - -void -ACE::HTBP::Session::handler (ACE_Event_Handler * h) -{ - this->handler_ = h; -} - -void -ACE::HTBP::Session::detach (ACE::HTBP::Channel *ch) -{ - if (this->inbound_ == ch) - this->inbound_ = 0; - else if (this->outbound_ == ch) - this->outbound_ = 0; - else - ACE_ERROR ((LM_ERROR, "ACE::HTBP::Session::detach called with unknown channel\n")); -} - -void -ACE::HTBP::Session::reactor (ACE_Reactor *r) -{ - this->reactor_ = r; - this->inbound_->register_notifier(r); - this->outbound_->register_notifier(r); -} - -int -ACE::HTBP::Session::enqueue (ACE_Message_Block *msg) -{ - this->outbound_queue_.enqueue_tail(msg); - return msg->length(); -} - -int -ACE::HTBP::Session::flush_outbound_queue (void) -{ - int result = 0; - if (this->outbound_queue_.message_count() > 0) - { - ACE_Message_Block *msg = 0; - iovec *iov = 0; - ACE_NEW_RETURN (iov, - iovec[this->outbound_queue_.message_count()], - -1); - this->outbound_queue_.peek_dequeue_head (msg); - for (size_t i = 0; i < this->outbound_queue_.message_count(); i++) - { - iov[i].iov_base = msg->rd_ptr(); - iov[i].iov_len = msg->length(); - msg = msg->next(); - } - result = this->outbound_->sendv (iov,this->outbound_queue_.message_count(),0); - delete [] iov; - while (this->outbound_queue_.dequeue_head(msg)) - msg->release(); - } - return result; -} - -int -ACE::HTBP::Session::close_inbound (void) const -{ - return this->inbound_ ? this->inbound_->close() : 0; -} - -int -ACE::HTBP::Session::close_outbound (void) const -{ - return this->outbound_ ? this->outbound_->close() : 0; -} - -int -ACE::HTBP::Session::enable (int flags) -{ - this->sock_flags_ |= flags; - int result = this->inbound_ ? this->inbound_->enable(flags) : 0; - result |= this->outbound_ ? this->outbound_->enable (flags) : 0; - return result; -} - -int -ACE::HTBP::Session::disable (int flags) -{ - this->sock_flags_ &= ~flags; - int result = this->inbound_ ? this->inbound_->disable(flags) : 0; - result |= this->outbound_ ? this->outbound_->disable (flags) : 0; - return result; -} - -ACE::HTBP::Stream * -ACE::HTBP::Session::stream (void)const -{ - return this->stream_; -} - -void -ACE::HTBP::Session::stream (ACE::HTBP::Stream *s) -{ - this->stream_ = s; -} - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_Hash_Map_Manager_Ex<ACE::HTBP::Session_Id_t, ACE::HTBP::Session*, ACE_Hash<ACE::HTBP::Session_Id_t>,ACE_Equal_To<ACE::HTBP::Session_Id_t>,ACE_SYNCH_MUTEX>; -template class ACE_Hash_Map_Manager<ACE::HTBP::Session_Id_t, ACE::HTBP::Session*, ACE_SYNCH_MUTEX>; -template class ACE_Hash_Map_Entry<ACE::HTBP::Session_Id_t, ACE::HTBP::Session*>; -template class ACE_Hash<ACE::HTBP::Session_Id_t>; -template class ACE_Equal_To<ACE::HTBP::Session_Id_t>; - -#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) -#pragma instantiate ACE_Hash_Map_Manager_Ex<ACE::HTBP::Session_Id_t, ACE::HTBP::Session*, ACE_Hash<ACE::HTBP::Session_Id_t>,ACE_Equal_To<ACE::HTBP::Session_Id_t>,ACE_SYNCH_MUTEX> -#pragma instantiate ACE_Hash_Map_Manager <ACE::HTBP::Session_Id_t, ACE::HTBP::Session*, ACE_SYNCH_MUTEX> -#pragma instantiate ACE_Hash_Map_Entry <ACE::HTBP::Session_Id_t, ACE::HTBP::Session*> -#pragma instantiate ACE_Hash<ACE::HTBP::Session_Id_t>; - -#pragma instantiate ACE_Equal_To<ACE::HTBP::Session_Id_t> -#endif - -ACE_END_VERSIONED_NAMESPACE_DECL diff --git a/protocols/ace/HTBP/HTBP_Session.h b/protocols/ace/HTBP/HTBP_Session.h deleted file mode 100644 index 5b46c6e86b3..00000000000 --- a/protocols/ace/HTBP/HTBP_Session.h +++ /dev/null @@ -1,198 +0,0 @@ -// -*- C++ -*- - -//============================================================================= -/** - * @file HTBP_Session.h - * - * $Id$ - * - * @author Phil Mesnier - */ -//============================================================================= - -#ifndef ACE_HTBP_SESSION_H -#define ACE_HTBP_SESSION_H -#include /**/ "ace/pre.h" - -#include "ace/SOCK_IO.h" -#include "ace/Hash_Map_Manager.h" -#include "ace/Synch.h" -#include "ace/Message_Queue.h" - -#if !defined (ACE_LACKS_PRAGMA_ONCE) -# pragma once -#endif /* ACE_LACKS_PRAGMA_ONCE */ - -#include "HTBP_Addr.h" -#include "HTBP_Export.h" -#include "HTBP_Channel.h" - -#include "HTBP_Stream.h" - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -// Forward declarations. -class ACE_HTBP_Filter; -class ACE_Event_Handler; - -namespace ACE -{ - namespace HTBP - { - - class Session_Id_t - { - public: - ACE_UINT32 id_; - Addr local_; - Addr peer_; - - u_long hash () const; - bool operator ==(const Session_Id_t &other) const; - }; - - /** - * @class Session - * - * @brief Defines the methods in the <Session> abstraction. - * - * A session is an entity that combines two Ht_Channels that connect directly - * to a proxy to manage communication with a remote peer. The Session may - * persist longer than either stream, assuming that the proxy is libel to - * close a connection at any time. - * - * This means that the session needs to be able to reconnect to the remote - * peer. This also means that the session needs to be aware of its location - * If it is outside the proxy and looses a stream, oh well. If it is inside, - * then the next time a stream is required, then it must reconnect before - * returning the stream. - * - * The session does not queue outbound messages. That is going to be the - * responsibility of the application, or a higher level protocol wrapper. - */ - class HTBP_Export Session - { - public: - // Initialization and termination methods. - /// Constructor. - Session (void); - - /// Constructor (sets the underlying session id with <sid>). - Session (const Addr& peer, - const Addr& local, - ACE_UINT32 sid = 0, - ACE_INET_Addr *proxy = 0, - int take_proxy = 0); - Session (const Session_Id_t &id, - ACE_INET_Addr *proxy = 0, - int take_proxy = 0); - - Session (const Session &other); - Session& operator= (const Session &other); - - /// Destructor. - ~Session (void); - - /// The following methods are specific to the Session - static ACE_UINT32 next_session_id (); - - static int add_session (Session *); - static int remove_session (Session *); - static int find_session (const Session_Id_t&, - Session *&out); - - Stream *stream (void) const; - void stream (Stream *); - - int enqueue (ACE_Message_Block *msg); - int flush_outbound_queue (void); - - int close_inbound (void) const; - int close_outbound (void) const; - - /// get references to the actual streams based on the direction - /// of data flow if this session is on the inside of the proxy - /// ie, has a non-null proxy addr, then the inbound stream is - /// the out_to_in stream, otherwise it is the in_to_out - /// stream. The outbound is the opposite of the inbound. - /// Whenever an application wishes to send data, whether that is - /// request or reply data, it uses the outbound stream, and it - /// should associate an event handler with the inbound stream - /// for receiving data. - Channel *inbound (void) const; - Channel *outbound (void) const; - void inbound (Channel *); - void outbound (Channel *); - - int enable (int value); - int disable (int value); - - const Session_Id_t& session_id(void) const; - void session_id (ACE_UINT32 ); - - const ACE_INET_Addr *proxy_addr (void) const; - void proxy_addr (ACE_INET_Addr *, int destroy = 0); - - const Addr &peer_addr (void) const; - const Addr &local_addr (void) const; - - void peer_addr (const Addr &); - void local_addr (const Addr &); - - /// invoke close on both streams, then remove self from session map - int close (void); - - ACE_Event_Handler *handler (void); - void handler (ACE_Event_Handler *); - void reactor (ACE_Reactor *); - void detach (Channel *); - - int sock_flags(void) const; - - private: - /// Connected Stream ensures that the particular stream is - /// connected to the proxy, if possible. The result is same as - /// the reference passed in, so that it may be used inline for - /// the inboundor outbound methods - - void reconnect (); - void reconnect_i (Channel *); - - typedef ACE_Hash_Map_Manager<Session_Id_t, Session*, - ACE_SYNCH_MUTEX> Session_Map; - typedef ACE_Hash_Map_Entry <Session_Id_t, Session*> Map_Entry; - static Session_Map session_map_; - static ACE_UINT32 last_session_id_; - static ACE_SYNCH_MUTEX session_id_lock_; - - ACE_INET_Addr *proxy_addr_; - int destroy_proxy_addr_; - - Session_Id_t session_id_; - - Channel *inbound_; - Channel *outbound_; - - Filter *inbound_filter_; - Filter *outbound_filter_; - - int closed_; - - ACE_Event_Handler *handler_; - ACE_Reactor *reactor_; - - ACE_Message_Queue<ACE_SYNCH> outbound_queue_; - Stream * stream_; - int sock_flags_; - }; - } -} - -ACE_END_VERSIONED_NAMESPACE_DECL - -#if defined (__ACE_INLINE__) -#include "HTBP_Session.inl" -#endif - -#include /**/ "ace/post.h" -#endif /* ACE_HTBP_SESSION_H */ diff --git a/protocols/ace/HTBP/HTBP_Session.inl b/protocols/ace/HTBP/HTBP_Session.inl deleted file mode 100644 index 06c510650c9..00000000000 --- a/protocols/ace/HTBP/HTBP_Session.inl +++ /dev/null @@ -1,114 +0,0 @@ -// -*- C++ -*- -// -// $Id$ - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -ACE_INLINE -void -ACE::HTBP::Session::reconnect () -{ - if (!this->closed_ && this->proxy_addr_) - { - if (inbound_ && - inbound_->ace_stream().get_handle() == ACE_INVALID_HANDLE) - reconnect_i (inbound_); - if (outbound_ && - outbound_->ace_stream().get_handle() == ACE_INVALID_HANDLE) - reconnect_i (outbound_); - } -} - -ACE_INLINE -void -ACE::HTBP::Session::inbound (ACE::HTBP::Channel *s) -{ - this->inbound_ = s; -} - - -ACE_INLINE -void -ACE::HTBP::Session::outbound (ACE::HTBP::Channel *s) -{ - this->outbound_ = s; -} - -ACE_INLINE -ACE::HTBP::Channel * -ACE::HTBP::Session::inbound (void) const -{ - return this->inbound_; -} - -ACE_INLINE -const ACE::HTBP::Session_Id_t& -ACE::HTBP::Session::session_id(void) const -{ - return this->session_id_; -} - -// I'm wondering if this should be coupled with a map update...? -ACE_INLINE -void -ACE::HTBP::Session::session_id (ACE_UINT32 id) -{ - this->session_id_.id_ = id; -} - -ACE_INLINE -const ACE_INET_Addr * -ACE::HTBP::Session::proxy_addr (void) const -{ - return this->proxy_addr_; -} - -ACE_INLINE -const ACE::HTBP::Addr & -ACE::HTBP::Session::peer_addr (void) const -{ - return this->session_id_.peer_; -} - -ACE_INLINE -const ACE::HTBP::Addr & -ACE::HTBP::Session::local_addr (void) const -{ - return this->session_id_.local_; -} - -ACE_INLINE -void -ACE::HTBP::Session::proxy_addr (ACE_INET_Addr *pa, int destroy) -{ - if (this->destroy_proxy_addr_) - delete this->proxy_addr_; - this->proxy_addr_ = pa; - this->destroy_proxy_addr_ = destroy; -} - -ACE_INLINE -int -ACE::HTBP::Session::sock_flags (void) const -{ - return this->sock_flags_; -} - -//--------------------------------------------------------------------------- -ACE_INLINE -u_long -ACE::HTBP::Session_Id_t::hash () const -{ - return id_; // + local.hash() + peer.hash(); -} - -ACE_INLINE -bool -ACE::HTBP::Session_Id_t::operator ==(const ACE::HTBP::Session_Id_t &other) const -{ - return ((this->id_ == other.id_) && - (this->local_ == other.local_) && - (this->peer_ == other.peer_)); -} - -ACE_END_VERSIONED_NAMESPACE_DECL diff --git a/protocols/ace/HTBP/HTBP_Stream.cpp b/protocols/ace/HTBP/HTBP_Stream.cpp deleted file mode 100644 index c0913569af0..00000000000 --- a/protocols/ace/HTBP/HTBP_Stream.cpp +++ /dev/null @@ -1,328 +0,0 @@ -/* -*- C++ -*- */ - -//============================================================================= -/** - * @file HTBP_Stream.cpp - * - * $Id$ - * - * @author Phil Mesnier, Priyanka Gontla - */ -//============================================================================= -#include "HTBP_Stream.h" - -#include "HTBP_Session.h" -#include "HTBP_Filter_Factory.h" - -#include "ace/Message_Block.h" - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -// Initialization and termination methods. -/// Constructor. -ACE::HTBP::Stream::Stream (ACE::HTBP::Session *s) - : session_ (s) -{ - if (s == 0) - // create a temporary session to be replaced on first recv. - ACE_NEW (session_, ACE::HTBP::Session); - session_->stream (this); -} - -/// Destructor. -ACE::HTBP::Stream::~Stream (void) -{ -} - - /// Dump the state of an object. -void -ACE::HTBP::Stream::dump (void) const -{ -} - - - -//--------------------------------------------------------------------------- -// = I/O functions. - -/// Recv an <n> byte buffer from the connected socket. -ssize_t -ACE::HTBP::Stream::recv (void *buf, - size_t n, - int flags, - const ACE_Time_Value *timeout) const -{ - if (this->session_->inbound() == 0) - { - errno = EWOULDBLOCK; - ACE_ERROR_RETURN ((LM_ERROR,"recv(buf,n,flags) called, but no " - "inbound channel connected to stream\n"),-1); - } - return this->session_->inbound()->recv(buf,n,flags,timeout); -} - - /// Recv an <n> byte buffer from the connected socket. -ssize_t -ACE::HTBP::Stream::recv (void *buf, - size_t n, - const ACE_Time_Value *timeout) const -{ - if (this->session_->inbound() == 0) - { - errno = EWOULDBLOCK; - ACE_ERROR_RETURN ((LM_ERROR,"recv(buf,n) called, but no " - "inbound channel connected to stream\n"),-1); - } - return this->session_->inbound()->recv(buf,n,timeout); -} - - /// Recv an <iovec> of size <n> from the connected socket. -ssize_t -ACE::HTBP::Stream::recvv (iovec iov[], - int iovcnt, - const ACE_Time_Value *timeout) const -{ - if (this->session_->inbound() == 0) - { - errno = EWOULDBLOCK; - ACE_ERROR_RETURN ((LM_ERROR,"recv(iov,iovcnt) called, but no " - "inbound channel connected to stream\n"),-1); - } - return this->session_->inbound()->recvv(iov,iovcnt,timeout); -} - -ssize_t -ACE::HTBP::Stream::recvv (iovec *io_vec, - const ACE_Time_Value *timeout) const -{ - if (this->session_->inbound() == 0) - { - errno = EWOULDBLOCK; - ACE_ERROR_RETURN ((LM_ERROR,"recv(io_vec) called, but no " - "inbound channel connected to stream\n"),-1); - } - return this->session_->inbound()->recvv(io_vec,timeout); -} - -ssize_t -ACE::HTBP::Stream::recv (void *, - size_t, - ACE_OVERLAPPED *) const -{ - errno = ENOTSUP; - ACE_ERROR_RETURN ((LM_ERROR, "ACE::HTBP::Stream: Asynch recv not supported\n"),-1); -} - -ssize_t -ACE::HTBP::Stream::send (const void *buf, - size_t n, - int flags, - const ACE_Time_Value *timeout) const -{ - if (this->session_->outbound() == 0) - { - ACE_Message_Block *msg = 0; - ACE_NEW_RETURN (msg,ACE_Message_Block(n),-1); - msg->copy ((const char *)buf,n); - // probably ought to separately enqueue the flags and put the data buf - // in a continuation message - // Also, the timeout poses another interesting problem. - return this->session_->enqueue(msg); - } - return this->session_->outbound()->send(buf,n,flags,timeout); -} - -ssize_t -ACE::HTBP::Stream::send (const void *buf, - size_t n, - const ACE_Time_Value *timeout) const -{ - if (this->session_->outbound() == 0) - { - ACE_Message_Block *msg = 0; - ACE_NEW_RETURN (msg,ACE_Message_Block(n),-1); - msg->copy ((const char *)buf,n); - return this->session_->enqueue(msg); - } - return this->session_->outbound()->send(buf,n,timeout); -} - -ssize_t -ACE::HTBP::Stream::sendv (const iovec iov[], - int iovcnt, - const ACE_Time_Value *timeout) const -{ - if (this->session_->outbound() == 0) - { - ACE_Message_Block *msg = 0; - size_t total = 0; - int i = 0; - for (; i < iovcnt; i++) - total += iov[i].iov_len; - ACE_NEW_RETURN (msg,ACE_Message_Block(total),-1); - for (i = 0; i < iovcnt; i++) - msg->copy ((const char *)iov[i].iov_base,iov[i].iov_len); - return this->session_->enqueue(msg); - } - return this->session_->outbound()->sendv(iov,iovcnt,timeout); -} - -ssize_t -ACE::HTBP::Stream::send (const void *, - size_t , - ACE_OVERLAPPED *) const -{ - errno = ENOTSUP; - ACE_ERROR_RETURN ((LM_ERROR, "ACE::HTBP::Stream: Asynch send not supported\n"),-1); -} - -ssize_t -ACE::HTBP::Stream::recv_n (void *, - size_t , - int , - const ACE_Time_Value *, - size_t *) const -{ - errno = ENOTSUP; - ACE_ERROR_RETURN ((LM_ERROR, "ACE::HTBP::Stream: recv_n not supported\n"),-1); -} - - /// Try to recv exactly <len> bytes into <buf> from the connected socket. -ssize_t -ACE::HTBP::Stream::recv_n (void *, - size_t , - const ACE_Time_Value *, - size_t *) const -{ - errno = ENOTSUP; - ACE_ERROR_RETURN ((LM_ERROR, "ACE::HTBP::Stream: recv_n not supported\n"),-1); -} - - /// Receive an <iovec> of size <iovcnt> from the connected socket. -ssize_t -ACE::HTBP::Stream::recvv_n (iovec [], - int , - const ACE_Time_Value *, - size_t *) const -{ - errno = ENOTSUP; - ACE_ERROR_RETURN ((LM_ERROR, "ACE::HTBP::Stream: recvv_n not supported\n"),-1); -} - - /// Try to send exactly <len> bytes from <buf> to the connection socket. -ssize_t -ACE::HTBP::Stream::send_n (const void *, - size_t , - int , - const ACE_Time_Value *, - size_t *) const -{ - errno = ENOTSUP; - ACE_ERROR_RETURN ((LM_ERROR, "ACE::HTBP::Stream: send_n not supported\n"),-1); -} - - /// Try to send exactly <len> bytes from <buf> to the connected socket. -ssize_t -ACE::HTBP::Stream::send_n (const void *, - size_t , - const ACE_Time_Value *, - size_t *) const -{ - errno = ENOTSUP; - ACE_ERROR_RETURN ((LM_ERROR, "ACE::HTBP::Stream: send_n not supported\n"),-1); -} - - /// Send all the <message_block>s chained through their <next> and - /// <cont> pointers. This call uses the underlying OS gather-write - /// operation to reduce the domain-crossing penalty. -ssize_t -ACE::HTBP::Stream::send_n (const ACE_Message_Block *, - const ACE_Time_Value *, - size_t *) const -{ - errno = ENOTSUP; - ACE_ERROR_RETURN ((LM_ERROR, "ACE::HTBP::Stream: send_n not supported\n"),-1); -} - - /// Send an <iovec> of size <iovcnt> to the connected socket. -ssize_t -ACE::HTBP::Stream::sendv_n (const iovec [], - int, - const ACE_Time_Value *, - size_t *) const -{ - errno = ENOTSUP; - ACE_ERROR_RETURN ((LM_ERROR, "ACE::HTBP::Stream: sendv_n not supported\n"),-1); -} - -int -ACE::HTBP::Stream::close_reader (void) -{ - return this->session_->close_inbound(); -} - -int -ACE::HTBP::Stream::close_writer (void) -{ - return this->session_->close_outbound(); -} - -int -ACE::HTBP::Stream::close (void) -{ - return this->session_->close(); -} - -int -ACE::HTBP::Stream::enable (int value) const -{ - return this->session_->enable(value); -} - -int -ACE::HTBP::Stream::disable (int value) const -{ - return this->session_->disable(value); -} - -int -ACE::HTBP::Stream::get_local_addr (ACE::HTBP::Addr &local_addr) const -{ - local_addr = this->session_->local_addr (); - return 0; -} - -int -ACE::HTBP::Stream::get_remote_addr (ACE::HTBP::Addr &peer_addr) const -{ - peer_addr = this->session_->peer_addr(); - return 0; -} - -ACE::HTBP::Session * -ACE::HTBP::Stream::session (void) const -{ - return this->session_; -} - -void -ACE::HTBP::Stream::session (ACE::HTBP::Session *s) -{ - delete this->session_; - this->session_ = s; - s->stream (this); -} - - -ACE_HANDLE -ACE::HTBP::Stream::get_handle (void) const -{ - return ACE_INVALID_HANDLE; -} - -void -ACE::HTBP::Stream::set_handle (ACE_HANDLE ) -{ -} - -ACE_END_VERSIONED_NAMESPACE_DECL diff --git a/protocols/ace/HTBP/HTBP_Stream.h b/protocols/ace/HTBP/HTBP_Stream.h deleted file mode 100644 index 0527ab06632..00000000000 --- a/protocols/ace/HTBP/HTBP_Stream.h +++ /dev/null @@ -1,291 +0,0 @@ -// -*- C++ -*- - -//============================================================================= -/** - * @file HTBP_Stream.h - * - * $Id$ - * - * @author Phil Mesnier, Priyanka Gontla - */ -//============================================================================= - -#ifndef ACE_HTBP_STREAM_H -#define ACE_HTBP_STREAM_H -#include /**/ "ace/pre.h" - -#include "ace/SOCK_Stream.h" -#include "ace/Message_Block.h" - -#if !defined (ACE_LACKS_PRAGMA_ONCE) -# pragma once -#endif /* ACE_LACKS_PRAGMA_ONCE */ - -#include "HTBP_Export.h" -#include "HTBP_Addr.h" -#include "HTBP_Filter.h" -#include "HTBP_Notifier.h" - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -namespace ACE -{ - namespace HTBP - { - // Forward declarations. - class Session; - - /** - * @class Stream - * - * @brief A stream facade for the HTTP Tunneling Bidirectional Protocol - * - * This adds provides the common interface for applications to do - * I/O that ultimately is wrapped in HTTP for tunneling through - * firewalls. - * - * This class is modelled after the ACE_SOCK_Stream class, and - * provides all of the I/O methods available in that class. Since - * this is a facade, it does not derive from ACE_SOCK_Stream. It - * also does not provide the same performance as ACE_SOCK_Stream, - * as some data may have to be stored by the HTBP classes prior to - * transmission. - * - * <buf> is the buffer to write from or receive into. - * <len> is the number of bytes to transfer. - * The <timeout> parameter in the following methods indicates how - * long to blocking trying to transfer data. If <timeout> == 0, - * then the call behaves as a normal send/recv call, i.e., for - * blocking sockets, the call will block until action is possible; - * for non-blocking sockets, EWOULDBLOCK will be returned if no - * action is immediately possible. - * If <timeout> != 0, the call will wait for data to arrive no longer - * than the relative time specified in *<timeout>. - * The "_n()" I/O methods keep looping until all the data has been - * transferred. These methods also work for sockets in non-blocking - * mode i.e., they keep looping on EWOULDBLOCK. <timeout> is used - * to make sure we keep making progress, i.e., the same timeout - * value is used for every I/O operation in the loop and the timeout - * is not counted down. - * The return values for the "*_n()" methods match the return values - * from the non "_n()" methods and are specified as follows: - * - On complete transfer, the number of bytes transferred is returned. - * - On timeout, -1 is returned, errno == ETIME. - * - On error, -1 is returned, errno is set to appropriate error. - * - On EOF, 0 is returned, errno is irrelevant. - * - * On partial transfers, i.e., if any data is transferred before - * timeout/error/EOF, <bytes_transferred> will contain the number of - * bytes transferred. - * Methods with <iovec> parameter are I/O vector variants of the I/O - * operations. - * Methods with the extra <flags> argument will always result in - * <send> getting called. Methods without the extra <flags> argument - * will result in <send> getting called on Win32 platforms, and - * <write> getting called on non-Win32 platforms. - */ - class HTBP_Export Stream - { - public: - // Initialization and termination methods. - /// Constructor. - Stream (Session *s = 0); - - /// Destructor. - ~Stream (void); - - // = I/O functions. - - /// The Stream is a sibling of the ACE_SOCK_IO class, rather - /// than a decendant. This is due to the requirement to wrap all - /// messages with an HTTP request or reply wrapper, and to send - /// application data in only one direction on one stream. - - /// Recv an <n> byte buffer from the connected socket. - ssize_t recv (void *buf, - size_t n, - int flags, - const ACE_Time_Value *timeout = 0) const; - - /// Recv an <n> byte buffer from the connected socket. - ssize_t recv (void *buf, - size_t n, - const ACE_Time_Value *timeout = 0) const; - - /// Recv an <iovec> of size <n> from the connected socket. - ssize_t recvv (iovec iov[], - int n, - const ACE_Time_Value *timeout = 0) const; - - /// Same as above. Deprecated. - ssize_t recv (iovec iov[], - size_t n, - const ACE_Time_Value *timeout = 0) const; - - /** - * Allows a client to read from a socket without having to - * provide a buffer to read. This method determines how much - * data is in the socket, allocates a buffer of this size, reads - * in the data, and returns the number of bytes read. The - * caller is responsible for deleting the member in the - * <iov_base> field of <io_vec> using delete [] - * io_vec->iov_base. - */ - ssize_t recvv (iovec *io_vec, - const ACE_Time_Value *timeout = 0) const; - - /// Recv <n> bytes via Win32 <ReadFile> using overlapped I/O. - ssize_t recv (void *buf, - size_t n, - ACE_OVERLAPPED *overlapped) const; - - /// Send an <n> byte buffer to the connected socket. - ssize_t send (const void *buf, - size_t n, - int flags, - const ACE_Time_Value *timeout = 0) const; - - /// Send an <n> byte buffer to the connected socket. - ssize_t send (const void *buf, - size_t n, - const ACE_Time_Value *timeout = 0) const; - - /// Send an <iovec> of size <n> to the connected socket. - ssize_t sendv (const iovec iov[], - int n, - const ACE_Time_Value *timeout = 0) const; - - /// Send <n> bytes via Win32 <WriteFile> using overlapped I/O. - ssize_t send (const void *buf, - size_t n, - ACE_OVERLAPPED *overlapped) const; - - - /// Try to recv exactly <len> bytes into <buf> from the - /// connected socket. - ssize_t recv_n (void *buf, - size_t len, - int flags, - const ACE_Time_Value *timeout = 0, - size_t *bytes_transferred = 0) const; - - /// Try to recv exactly <len> bytes into <buf> from the - /// connected socket. - ssize_t recv_n (void *buf, - size_t len, - const ACE_Time_Value *timeout = 0, - size_t *bytes_transferred = 0) const; - - /// Receive an <iovec> of size <iovcnt> from the connected - /// socket. - ssize_t recvv_n (iovec iov[], - int iovcnt, - const ACE_Time_Value *timeout = 0, - size_t *bytes_transferred = 0) const; - - /// Try to send exactly <len> bytes from <buf> to the connection - /// socket. - ssize_t send_n (const void *buf, - size_t len, - int flags, - const ACE_Time_Value *timeout = 0, - size_t *bytes_transferred = 0) const; - - /// Try to send exactly <len> bytes from <buf> to the connected - /// socket. - ssize_t send_n (const void *buf, - size_t len, - const ACE_Time_Value *timeout = 0, - size_t *bytes_transferred = 0) const; - - /// Send all the <message_block>s chained through their <next> - /// and <cont> pointers. This call uses the underlying OS - /// gather-write operation to reduce the domain-crossing - /// penalty. - ssize_t send_n (const ACE_Message_Block *message_block, - const ACE_Time_Value *timeout = 0, - size_t *bytes_transferred = 0) const; - - /// Send an <iovec> of size <iovcnt> to the connected socket. - ssize_t sendv_n (const iovec iov[], - int iovcnt, - const ACE_Time_Value *timeout = 0, - size_t *bytes_transferred = 0) const; - - // = Selectively close endpoints. / Close down the reader. - int close_reader (void); - - /// Close down the writer. - int close_writer (void); - - /** - * Close down the socket (we need this to make things work correctly - * on Win32, which requires use to do a <close_writer> before doing - * the close to avoid losing data). - */ - int close (void); - - // = Meta-type info - typedef Addr PEER_ADDR; - - /// Dump the state of an object. - void dump (void) const; - - /// Declare the dynamic allocation hooks. - ACE_ALLOC_HOOK_DECLARE; - - public: - ///@notes Added the following methods to continue with - /// current compilation of HTIOP. Might not be needed in - /// future. - Priyanka - /// {@ - void set_handle (ACE_HANDLE h); - ACE_HANDLE get_handle (void) const; - - Session *session (void) const; - void session (Session *s); - - /** - * Enable asynchronous I/O (ACE_SIGIO), urgent data (ACE_SIGURG), - * non-blocking I/O (ACE_NONBLOCK), or close-on-exec (ACE_CLOEXEC), - * which is passed as the <value>. - */ - int enable (int value) const; - - /** - * Disable asynchronous I/O (ACE_SIGIO), urgent data (ACE_SIGURG), - * non-blocking I/O (ACE_NONBLOCK), or close-on-exec (ACE_CLOEXEC), - * which is passed as the <value>. - */ - int disable (int value) const; - - /** - * Return the address of the remotely connected peer (if there is - * one), in the referenced <ACE_Addr>. Returns 0 if successful, else - * -1. - */ - int get_remote_addr (Addr &) const; - - /** - * Return the address of the remotely connected peer (if there is - * one), in the referenced <ACE_Addr>. Returns 0 if successful, else - * -1. - */ - int get_local_addr (Addr &) const; - - //@} - - private: - /// The session_ is a reference to the persistent session this stream is - /// associated with. On the inside, sessions are created by the Connector, - /// which then create streams on demand. - Session *session_; - - }; - } -} - -ACE_END_VERSIONED_NAMESPACE_DECL - -#include /**/ "ace/post.h" -#endif /* ACE_HTBP_STREAM_H */ diff --git a/protocols/ace/HTBP/HTID_Generator.cgi b/protocols/ace/HTBP/HTID_Generator.cgi deleted file mode 100644 index 0d57a552d6c..00000000000 --- a/protocols/ace/HTBP/HTID_Generator.cgi +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/perl - -# This is a sample script that may be used to create domain specific -# unique ID's rather than using UUID. In a typical scenario, this HTID -# generator would reside in the same domain as the target server, so -# that it could be used by any clients of the server. While use of UUID -# as a unique identifier is perfectly fine, use of a remote generator -# gives additional benefits, such as the ability to collect metrics on -# identity requestors. - -print "Content-type:text/html\n\n"; - -$htid = $ENV{'REMOTE_ADDR'}; - -open(IN,"counts.txt") or dienice("Can't open counts.txt for writing: $!"); - -flock(IN,2); # lock the file -seek(IN,0,0); # rewind it to the beginning - -$oldtimestamp = <IN>; # read only the first line. -$save_time = $oldtimestamp; - -close(IN); - - -$timestamp = time; - -if ($oldtimestamp == $timestamp) - { - open (IN2, "sec_id.txt") or - dienice ("Can't open sec_id.txt for writing: $!"); - - flock (IN2, 2); - seek (IN2, 0, 0); - - $secondary_id = <IN2>; - - # increment the secondary id - ++$secondary_id; - - - close (IN2); - } -else { - - $secondary_id = 0; -} - - open(OUT2,">sec_id.txt") or - dienice("Can't open outdata.txt for writing: $!"); - - flock(OUT2,2); # lock the file - seek(OUT2,0,0); # rewind it to the beginning - - print OUT2 "$secondary_id"; - - close(OUT2); - - -#save the timestamp for next time -$oldtimestamp = $timestamp; - - -open(OUT,">counts.txt") or dienice("Can't open outdata.txt for writing: $!"); - -flock(OUT,2); # lock the file -seek(OUT,0,0); # rewind it to the beginning -print OUT "$oldtimestamp\n"; -close(OUT); - - -$result_string = join (".$timestamp", $htid, ".$secondary_id"); - -print <<EndOfHTML; - -$result_string - -EndOfHTML diff --git a/protocols/ace/HTBP/Makefile.am b/protocols/ace/HTBP/Makefile.am deleted file mode 100644 index ca10061bcdd..00000000000 --- a/protocols/ace/HTBP/Makefile.am +++ /dev/null @@ -1,75 +0,0 @@ -## Process this file with automake to create Makefile.in -## -## $Id$ -## - -includedir = @includedir@/ace/HTBP -pkgconfigdir = @libdir@/pkgconfig - -ACE_BUILDDIR = $(top_builddir) -ACE_ROOT = $(top_srcdir) - -## Makefile.HTBP.am - -lib_LTLIBRARIES = libACE_HTBP.la - -libACE_HTBP_la_CPPFLAGS = \ - -I$(ACE_ROOT) \ - -I$(ACE_BUILDDIR) \ - -DHTBP_BUILD_DLL - -libACE_HTBP_la_SOURCES = \ - HTBP_Addr.cpp \ - HTBP_Channel.cpp \ - HTBP_Environment.cpp \ - HTBP_Filter.cpp \ - HTBP_Filter_Factory.cpp \ - HTBP_ID_Requestor.cpp \ - HTBP_Inside_Squid_Filter.cpp \ - HTBP_Notifier.cpp \ - HTBP_Outside_Squid_Filter.cpp \ - HTBP_Session.cpp \ - HTBP_Stream.cpp - -libACE_HTBP_la_LDFLAGS = \ - -version-number @ACE_MAJOR@:@ACE_MINOR@:@ACE_BETA@ - -libACE_HTBP_la_LIBADD = \ - $(ACE_BUILDDIR)/ace/libACE.la - -nobase_include_HEADERS = \ - HTBP_Addr.h \ - HTBP_Channel.h \ - HTBP_Channel.inl \ - HTBP_Environment.h \ - HTBP_Export.h \ - HTBP_Filter.h \ - HTBP_Filter.inl \ - HTBP_Filter_Factory.h \ - HTBP_ID_Requestor.h \ - HTBP_Inside_Squid_Filter.h \ - HTBP_Inside_Squid_Filter.inl \ - HTBP_Macros.h \ - HTBP_Notifier.h \ - HTBP_Outside_Squid_Filter.h \ - HTBP_Outside_Squid_Filter.inl \ - HTBP_Session.h \ - HTBP_Session.inl \ - HTBP_Stream.h - -pkgconfig_DATA = ACE_HTBP.pc - -ACE_HTBP.pc: ${top_builddir}/config.status ${srcdir}/ACE_HTBP.pc.in - ${top_builddir}/config.status --file $@:${srcdir}/ACE_HTBP.pc.in - -EXTRA_DIST = \ - ACE_HTBP.pc.in - - -## Clean up template repositories, etc. -clean-local: - -rm -f *~ *.bak *.rpo *.sym lib*.*_pure_* core core.* - -rm -f gcctemp.c gcctemp so_locations *.ics - -rm -rf cxx_repository ptrepository ti_files - -rm -rf templateregistry ir.out - -rm -rf ptrepository SunWS_cache Templates.DB diff --git a/protocols/ace/HTBP/README b/protocols/ace/HTBP/README deleted file mode 100644 index 577aaf15866..00000000000 --- a/protocols/ace/HTBP/README +++ /dev/null @@ -1,186 +0,0 @@ -// $Id$ - -This directory contains the HTTP Tunneling, Bidirectional, Protocol -implementation. This is a new streaming abstraction layered over an -HTTP document request/reply mechanism. It is designed to allow clients -that are inside a of a corporate firewall to communicate with servers -that are outside, hence HTTP Tunneling. Also, once a connection is -established, the outside peer is able to send asynchronous messages to -the inside peer, hence Bidirectional. - -HTBP provides Acceptor, Connector, and Stream classes that follow the -interface defined for the ACE_Acceptor and ACE_Connector -templates. This means that HTBP can be used right away with -applications designed to use these templates. - -Bidirectionality is achieved in the context of the proxy's restriction -by using two channels between the peers. One channel is defined for -data flow from the inside to the outside, data flow from the outside -in occurs on the other channel. In-to-out data is passed in the form -of a PUT command with the data payload marshalled into an -"application/gzip" buffer. On this channel, the outside peer always -responds with a simple document which serves as an ack. On the -out-to-in channel, the inside client must send a token request in the -form of a GET command. This request goes unfulfilled until the outside -peer has data to send, which it does by supplying an HTML document -that again encapsulates the data so that it may pass through the proxy -uncorrupted. - -The connections from the inside peer to the proxy, or from the proxy -to the outside peer may be closed by the proxy at any time. The inside -peer will automatically reconnect as needed when this happens. Since -the outside peer cannot actively connect to the proxy, it will queue -outbound messages as long as it can until a new out-to-in channel is -made available, at which time it will flush its queue. The sense of -channels may change over time, as the proxy may choose any local -connection to the server to send any request (GET or POST). - -The outside peer is identified using an ordinary INET addr, however -the inside peer uses a simple, transient unique ID to identify -itself. Inside peers will never have any type of persistent identity. -The unique ID used to identify the inside peer is usually a UUID value -as composed by ACE_UUID_Generator. However, a domain based unique ID -may also be obtainedusing HTBP::ID_Requestor::get_HTID(). If no domain -based ID generator is configured, get_HTID() will return a UUID value. - -As there are a variety of HTTP proxies available, HTBP uses a -pluggable filter class that defines the particular characteristics of -a proxy and is responsible for marshalling and unmarshalling binary -data. As of now there is a single filter available that works with a -defaulted Squid proxy and may also be used as a null filter, directly -connecting the inside and outside peers. This mode is useful for -testing. - -CONFIGURING HTBP -This is done through the ACE_Configuration framework. On windows -platforms, the Windows Registry may be used, whereas on non-windows, a -flat file is used to configure. Configuration data may also be -persisted in a memory mapped file. - -The configuration map contains a single section, HTBP, that contains -all the configurable parameters in name=value form. The following is -an example of a configuration file: - -[htbp] -proxy_host=<hostname> This is the hostname of the http - proxy through which all requests - will be sent. -proxy_port=<port> This is the proxy's port. -htid_url=<url> If a domain based unique id is - required, this is the URL of the - ID generator. -htid_via_proxy=<1|0> If the htid_url must be reached - via the proxy, set this to 1. - Default is 0, meaning the ID - generator is directly accessible. - -COMPANION DIRECTORIES: -$ACE_ROOT/tests/HTBP. These are the test drivers, which - also serve as example code. -$TAO_ROOT/orbsvcs/orbsvcs/HTIOP This is a TAO pluggable protocol - based on HTBP. -$TAO_ROOT/orbsvcs/tests/HTIOP The tests for HTIOP. - - -BACKGROUND INFORMATION - -HT Addresses - -The class HT_Addr is a subclass of ACE_INET_Addr class. The interface -for the HT_Addr is a common interface to be used with the inside and -outside peers. The inside peer is identified by a HTID while the -outside peer is identified with an ip address. Constructors are -provided to initialize the inside and outside peers in addition to the -default and copy constructors. addr_to_string and string_to_addr -methods from the base class are overridden to help convert the HT_Addr -to a string and vice versa. Finally, the class provides accessor -methods for the default local address and the default proxy addresses. - -The local address is the address of the inside peer and is obtained -using the singleton HTID_Requestor class. The HTID_Requestor class -sends a request to the web server that is running at the htid_url to -get the HTID unique to each inside peer. - -The proxy address is of ACE_INET_Addr type as it is no different to a -regular server. It is obtained using the singleton HT_Environment -class. The HT_Environment class helps read the HT configuration file -and provides acccessors to the proxy address, port and the htid url. - -The code below illustrates the initialization of a local or inside, -remote or outside and the proxy addresses using the classes -aforementioned. - - HT_Addr local(HTID_REQUESTOR::instance()->get_HTID()); - - char hostname [1000]; - if (ACE_OS::hostname (hostname, - 1000) == -1) - { - ACE_DEBUG ((LM_DEBUG, "Could not get the host name\n")); - return -1; - } - - HT_Addr remote (8088, hostname); - - char proxy_address [1000]; - HT_ENVIRONMENT::instance ()->get_proxy_address (proxy_address); - - unsigned int proxy_port; - HT_ENVIRONMENT::instance ()->get_proxy_port (proxy_port); - - ACE_INET_Addr proxy(port, proxy_address); - - -HT Streams - -The class HT_Stream is a sibling of the ACE_SOCK_IO class. It is used -to send and receive messages between two peers identified by their HT -addresses. It is made a sibling of the ACE_SOCK_IO class rather than -a decendant. This is due to the requirement in the HTBP protocol to -wrap all messages with an HTTP request or reply wrapper, and to send -application data in only one direction on one stream. - -HT Sessions - -A session is an entity that combines two HT_Streams that connect -directly to a proxy to manage communication with a remote peer. The -session may persist longer than either stream, assuming that the proxy -is libel to close a connection at any time. This means that the -session needs to be able to reconnect to the remote peer. This also -means that the session needs to be aware of its location. If it is -outside the proxy and looses a stream, nothing can really be done. If -it is inside, then the next time a stream is required, then it must -reconnect before returning the stream. The session does not queue -outbound messages. It will be the responsibility of the application or -a higher level protocol wrapper. - -Each session is identified by a special type, -HT_Session_Id_t. HT_Session_Id_t is a class with three members, the -local address, the peer address and an id of type ACE_UINT32. A -session map, .... - -Besides the default constructor and copy constructors, two other -constructors are provided to initialize a session and are shown below. - - - /// Constructor (sets the underlying session id with <sid>). - HT_Session (const HT_Addr& peer, - const HT_Addr& local = HT_Addr::default_local(), - ACE_UINT32 sid = 0, - ACE_INET_Addr *proxy = 0, - int take_proxy = 0); - - HT_Session (const HT_Session_Id_t &id, - ACE_INET_Addr *proxy = 0, - int take_proxy = 0); - - - -If a session id (sid) is not provided by the user, it is generated -using the static method HT_Session::next_session_id(). - -The following code illustrates the usage of HT_Stream and HT_Session -classes. - -HT_Filters -<TBD> diff --git a/protocols/ace/Makefile.am b/protocols/ace/Makefile.am deleted file mode 100644 index 797a2a25625..00000000000 --- a/protocols/ace/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -## Process this file with automake to create Makefile.in -## -## $Id$ -## -## This file was generated by MPC. Any changes made directly to -## this file will be lost the next time it is generated. -## -## MPC Command: -## /acebuilds/ACE_wrappers-repository/bin/mwc.pl -include /acebuilds/MPC/config -include /acebuilds/MPC/templates -feature_file /acebuilds/ACE_wrappers-repository/local.features -noreldefs -type automake -exclude build,Kokyu - -SUBDIRS = \ - HTBP \ - RMCast \ - TMCast diff --git a/protocols/ace/RMCast/ACE_RMCast.pc.in b/protocols/ace/RMCast/ACE_RMCast.pc.in deleted file mode 100644 index 3eb6428d28b..00000000000 --- a/protocols/ace/RMCast/ACE_RMCast.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: ACE_RMCast -Description: ACE Reliable Multicast Library -Requires: ACE -Version: @VERSION@ -Libs: -L${libdir} -lACE_RMCast -Cflags: -I${includedir} diff --git a/protocols/ace/RMCast/Acknowledge.cpp b/protocols/ace/RMCast/Acknowledge.cpp deleted file mode 100644 index b647a255dad..00000000000 --- a/protocols/ace/RMCast/Acknowledge.cpp +++ /dev/null @@ -1,389 +0,0 @@ -// file : ace/RMCast/Acknowledge.cpp -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#include "ace/Time_Value.h" // ACE_Time_Value -#include "ace/OS_NS_unistd.h" -#include "ace/OS_NS_stdlib.h" // abort -#include "ace/OS_NS_sys_time.h" // gettimeofday - -#include "Acknowledge.h" - -/* -#include <iostream> -using std::cerr; -using std::endl; -*/ - -namespace ACE_RMCast -{ - Acknowledge:: - Acknowledge (Parameters const& params) - : params_ (params), - hold_ (params.addr_map_size ()), - cond_ (mutex_), - nrtm_timer_ (params_.nrtm_timeout ()), - stop_ (false) - { - } - - void Acknowledge:: - in_start (In_Element* in) - { - Element::in_start (in); - } - - void Acknowledge:: - out_start (Out_Element* out) - { - Element::out_start (out); - - tracker_mgr_.spawn (track_thunk, this); - } - - void Acknowledge:: - out_stop () - { - { - Lock l (mutex_); - stop_ = true; - cond_.signal (); - } - - tracker_mgr_.wait (); - - Element::out_stop (); - } - - void Acknowledge:: - collapse (Queue& q) - { - // I would normally use iterators in the logic below but ACE_Map_Manager - // iterates over entries in no particular order so it is pretty much - // unusable here. Instead we will do slow and cumbersome find's. - // - - u64 sn (q.sn () + 1); - - for (;; ++sn) - { - Queue::ENTRY* e; - - if (q.find (sn, e) == -1 || e->int_id_.lost ()) break; - - Message_ptr m (e->int_id_.msg ()); - q.unbind (sn); - - in_->recv (m); - } - - q.sn (sn - 1); - } - - void Acknowledge:: - track () - { - while (true) - { - Messages msgs; - - { - Lock l (mutex_); - - if (stop_) - break; - - if (hold_.current_size () != 0) - { - for (Map::iterator i (hold_.begin ()), e (hold_.end ()); - i != e; - ++i) - { - Queue& q = (*i).int_id_; - - if (q.current_size () == 0) continue; - - track_queue ((*i).ext_id_, q, msgs); - } - } - - if (--nrtm_timer_ == 0) - { - nrtm_timer_ = params_.nrtm_timeout (); - - // Send NRTM. - // - unsigned short max_payload_size ( - params_.max_packet_size () - max_service_size); - - u32 max_elem (NRTM::max_count (max_payload_size)); - - Profile_ptr nrtm (create_nrtm (max_elem)); - - if (nrtm.get ()) - { - Message_ptr m (new Message); - m->add (nrtm); - msgs.push_back (m); - - } - } - } - - // Send stuff off. - // - for (Messages::Iterator i (msgs); !i.done (); i.advance ()) - { - Message_ptr* ppm; - i.next (ppm); - send (*ppm); - } - - // Go to sleep but watch for "manual cancellation" request. - // - { - ACE_Time_Value time (ACE_OS::gettimeofday ()); - time += params_.tick (); - - Lock l (mutex_); - - while (!stop_) - { - if (cond_.wait (&time) == -1) - { - if (errno != ETIME) - ACE_OS::abort (); - else - break; - } - } - - if (stop_) - break; - } - } - } - - void Acknowledge:: - track_queue (Address const& addr, Queue& q, Messages& msgs) - { - unsigned short max_payload_size ( - params_.max_packet_size () - max_service_size); - - u32 max_elem (NAK::max_count (max_payload_size)); - u32 count (0); - - Queue::iterator i (q.begin ()), e (q.end ()); - - // Track existing losses. - // - while (i != e) - { - NAK_ptr nak (new NAK (addr)); - - // Inner loop that fills NAK profile with up to max_elem elements. - // - for (; i != e && nak->count () < max_elem; ++i) - { - u64 sn ((*i).ext_id_); - Descr& d = (*i).int_id_; - - if (d.lost ()) - { - d.timer (d.timer () - 1); - - if (d.timer () == 0) - { - //@@ Need exp fallback. - // - d.nak_count (d.nak_count () + 1); - d.timer ((d.nak_count () + 1) * params_.nak_timeout ()); - - nak->add (sn); - - ++count; - - // cerr << 6 << "NAK # " << d.nak_count () << ": " - // << addr << " " << sn << endl; - } - } - } - - // Send this NAK. - // - if (nak->count ()) - { - // cerr << 5 << "NAK: " << addr << " " << nak->count () << " sns" - // << endl; - - Message_ptr m (new Message); - - m->add (Profile_ptr (nak.release ())); - - msgs.push_back (m); - } - } - - // Detect and record new losses. - // - for (u64 sn (q.sn () + 1), end (q.max_sn ()); sn < end; ++sn) - { - if (q.find (sn) == -1) - { - q.bind (sn, Descr (1)); - } - } - } - - void Acknowledge:: - recv (Message_ptr m) - { - // Handle NRTM. There could be some nasty interaction with code - // that handles data below (like missing message and NAK). This - // is why I hold the lock at the beginning (which may be not very - // efficient). - // - Lock l (mutex_); - - if (NRTM const* nrtm = static_cast<NRTM const*> (m->find (NRTM::id))) - { - for (Map::iterator i (hold_.begin ()), e (hold_.end ()); i != e; ++i) - { - u64 sn (nrtm->find ((*i).ext_id_)); - - if (sn != 0) - { - Queue& q = (*i).int_id_; - - u64 old (q.max_sn ()); - - if (old < sn) - { - // Mark as lost. - // - q.bind (sn, Descr (1)); - } - } - } - } - - if (m->find (Data::id) || m->find (NoData::id)) - { - Address from ( - static_cast<From const*> (m->find (From::id))->address ()); - - u64 sn (static_cast<SN const*> (m->find (SN::id))->num ()); - - Map::ENTRY* e; - - if (hold_.find (from, e) == -1) - { - // First message from this source. - // - hold_.bind (from, Queue (sn)); - in_->recv (m); - } - else - { - Queue& q = e->int_id_; - - if (sn <= q.sn ()) - { - // Duplicate. - // - //cerr << 6 << "DUP " << from << " " << q.sn () << " >= " << sn - // << endl; - } - else if (sn == q.sn () + 1) - { - // Next message. - // - - q.rebind (sn, Descr (m)); - collapse (q); - } - else - { - // Some messages are missing. Insert this one into the queue. - // - q.rebind (sn, Descr (m)); - } - } - } - else - { - l.release (); - - // Just forward it up. - // - in_->recv (m); - } - } - - void Acknowledge:: - send (Message_ptr m) - { - if (Data const* data = static_cast<Data const*> (m->find (Data::id))) - { - size_t max_payload_size ( - params_.max_packet_size () - max_service_size); - - if (max_payload_size > data->size ()) - { - u32 max_size (max_payload_size - data->size ()); - u32 max_elem (NRTM::max_count (max_size)); - - if (max_elem > 0) - { - Lock l (mutex_); - - Profile_ptr nrtm (create_nrtm (max_elem)); - - if (nrtm.get ()) - m->add (nrtm); - } - } - - nrtm_timer_ = params_.nrtm_timeout (); // Reset timer. - } - - out_->send (m); - } - - Profile_ptr Acknowledge:: - create_nrtm (u32 max_elem) - { - // Prepare NRTM. - // - NRTM_ptr nrtm (new NRTM ()); - - // Gather the information. - // - { - for (Map::iterator i (hold_.begin ()), e (hold_.end ()); i != e; ++i) - { - Address addr ((*i).ext_id_); - Queue& q = (*i).int_id_; - - //@@ Should look for the highest known number. - // - nrtm->insert (addr, q.sn ()); - - if (--max_elem == 0) - break; - } - } - - if (nrtm->empty ()) - return Profile_ptr (0); - else - return Profile_ptr (nrtm.release ()); - } - - ACE_THR_FUNC_RETURN Acknowledge:: - track_thunk (void* obj) - { - reinterpret_cast<Acknowledge*> (obj)->track (); - return 0; - } -} diff --git a/protocols/ace/RMCast/Acknowledge.h b/protocols/ace/RMCast/Acknowledge.h deleted file mode 100644 index 3d7654b1fec..00000000000 --- a/protocols/ace/RMCast/Acknowledge.h +++ /dev/null @@ -1,248 +0,0 @@ -// file : ace/RMCast/Acknowledge.h -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#ifndef ACE_RMCAST_ACKNOWLEDGE_H -#define ACE_RMCAST_ACKNOWLEDGE_H - -#include "ace/Hash_Map_Manager.h" -#include "ace/Thread_Manager.h" - -#include "Stack.h" -#include "Protocol.h" -#include "Bits.h" -#include "Parameters.h" - -#if !defined (ACE_RMCAST_DEFAULT_MAP_SIZE) -#define ACE_RMCAST_DEFAULT_MAP_SIZE 10 -#endif /* ACE_RMCAST_DEFAULT_MAP_SIZE */ - -#if !defined (ACE_RMCAST_DEFAULT_QUEUE_SIZE) -#define ACE_RMCAST_DEFAULT_QUEUE_SIZE 10 -#endif /* ACE_RMCAST_DEFAULT_QUEUE_SIZE */ - -namespace ACE_RMCast -{ - class Acknowledge : public Element - { - public: - Acknowledge (Parameters const& params); - - virtual void - in_start (In_Element* in); - - virtual void - out_start (Out_Element* out); - - virtual void - out_stop (); - - public: - virtual void - recv (Message_ptr m); - - virtual void - send (Message_ptr m); - - // Sun C++ 5.4 can't handle private here. - // - // private: - public: - struct Descr - { - //@@ There should be no default c-tor. - // - Descr () - : nak_count_ (0), timer_ (1) - { - } - - Descr (unsigned long timer) - : nak_count_ (0), timer_ (timer) - { - } - - Descr (Message_ptr m) - : m_ (m) - { - } - - public: - bool - lost () const - { - return m_.get () == 0; - } - - public: - Message_ptr - msg () - { - return m_; - } - - void - msg (Message_ptr m) - { - m_ = m; - } - - public: - unsigned long - nak_count () const - { - return nak_count_; - } - - void - nak_count (unsigned long v) - { - nak_count_ = v; - } - - unsigned long - timer () const - { - return timer_; - } - - void - timer (unsigned long v) - { - timer_ = v; - } - - private: - Message_ptr m_; - - unsigned long nak_count_; - unsigned long timer_; - }; - - private: - struct Queue : ACE_Hash_Map_Manager<u64, Descr, ACE_Null_Mutex> - { - typedef ACE_Hash_Map_Manager<u64, Descr, ACE_Null_Mutex> Base; - - // Should never be here but required by ACE_Hash_Blah_Blah. - // - Queue () - : Base (ACE_RMCAST_DEFAULT_MAP_SIZE), sn_ (0), max_sn_ (0) - { - } - - Queue (u64 sn) - : Base (ACE_RMCAST_DEFAULT_MAP_SIZE), sn_ (sn), max_sn_ (sn) - { - } - - Queue (Queue const& q) - : Base (ACE_RMCAST_DEFAULT_MAP_SIZE), sn_ (q.sn_), max_sn_ (sn_) - { - for (Queue::const_iterator i (q), e (q, 1); i != e; ++i) - { - bind ((*i).ext_id_, (*i).int_id_); - } - } - - public: - int - bind (u64 sn, Descr const& d) - { - int r (Base::bind (sn, d)); - - if (r == 0 && sn > max_sn_) max_sn_ = sn; - - return r; - } - - int - rebind (u64 sn, Descr const& d) - { - int r (Base::rebind (sn, d)); - - if (r == 0 && sn > max_sn_) max_sn_ = sn; - - return r; - } - - int - unbind (u64 sn) - { - int r (Base::unbind (sn)); - - if (r == 0 && sn == max_sn_) - { - for (--max_sn_; max_sn_ >= sn_; --max_sn_) - { - if (find (max_sn_) == 0) break; - } - } - - return r; - } - - public: - u64 - sn () const - { - return sn_; - } - - void - sn (u64 sn) - { - sn_ = sn; - } - - u64 - max_sn () const - { - if (current_size () == 0) return sn_; - - return max_sn_; - } - - private: - u64 sn_, max_sn_; - }; - - typedef - ACE_Hash_Map_Manager_Ex<Address, - Queue, - AddressHasher, - ACE_Equal_To<Address>, - ACE_Null_Mutex> - Map; - - private: - void - collapse (Queue& q); - - void - track (); - - void - track_queue (Address const& addr, Queue& q, Messages& msgs); - - Profile_ptr - create_nrtm (u32 max_elem); - - static ACE_THR_FUNC_RETURN - track_thunk (void* obj); - - private: - Parameters const& params_; - - Map hold_; - Mutex mutex_; - Condition cond_; - - unsigned long nrtm_timer_; - - bool stop_; - ACE_Thread_Manager tracker_mgr_; - }; -} - -#endif // ACE_RMCAST_ACKNOWLEDGE_H diff --git a/protocols/ace/RMCast/Bits.h b/protocols/ace/RMCast/Bits.h deleted file mode 100644 index 1b45580647b..00000000000 --- a/protocols/ace/RMCast/Bits.h +++ /dev/null @@ -1,26 +0,0 @@ -// file : ace/RMCast/Bits.h -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#ifndef ACE_RMCAST_BITS_H -#define ACE_RMCAST_BITS_H - -#include "ace/Auto_Ptr.h" -#include "ace/Thread_Mutex.h" -#include "ace/Condition_T.h" -#include "ace/Synch_Traits.h" - -namespace ACE_RMCast -{ - typedef ACE_SYNCH_MUTEX Mutex; - typedef ACE_Guard<Mutex> Lock; - typedef ACE_Condition<Mutex> Condition; - - // tmp - // - //using std::cerr; - //using std::endl; -} - - -#endif // ACE_RMCAST_BITS_H diff --git a/protocols/ace/RMCast/Flow.cpp b/protocols/ace/RMCast/Flow.cpp deleted file mode 100644 index a415862647e..00000000000 --- a/protocols/ace/RMCast/Flow.cpp +++ /dev/null @@ -1,138 +0,0 @@ -// file : ace/RMCast/Flow.cpp -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#include "Flow.h" - -#include "ace/OS_NS_unistd.h" // sleep -#include "ace/OS_NS_sys_time.h" // gettimeofday - -#include "ace/os_include/os_math.h" // exp - -/* -#include <iostream> -using std::cerr; -using std::endl; -*/ - -namespace ACE_RMCast -{ - Flow:: - Flow (Parameters const& params) - : params_ (params), - nak_time_ (0, 0), - sample_start_time_ (0, 0), - sample_bytes_ (0), - current_tput_ (0.0), - cap_tput_ (0.0) - { - } - - void Flow:: - send (Message_ptr m) - { - if (Data const* data = static_cast<Data const*> (m->find (Data::id))) - { - ACE_Time_Value now_time (ACE_OS::gettimeofday ()); - - Lock l (mutex_); - sample_bytes_ += data->size (); - - if (sample_start_time_ == ACE_Time_Value (0, 0)) - { - sample_start_time_ = now_time; - } - else - { - ACE_Time_Value delta (now_time - sample_start_time_); - - if (delta > ACE_Time_Value (0, 2000)) - { - current_tput_ = - double (sample_bytes_) / (delta.sec () * 1000000 + delta.usec ()); - - // cerr << "tput: " << current_tput_ << " bytes/usec" << endl; - - sample_bytes_ = 0; - sample_start_time_ = ACE_Time_Value (0, 0); - } - } - - if (cap_tput_ != 0.0 - && current_tput_ != 0.0 - && current_tput_ > cap_tput_) - { - double dev = (current_tput_ - cap_tput_) / current_tput_; - - // cerr << "deviation: " << dev << endl; - - // Cap decay algorithm. - // - { - ACE_Time_Value delta (now_time - nak_time_); - - unsigned long msec = delta.msec (); - - double x = msec / -16000.0; - double y = 1.0 * exp (x); - cap_tput_ = cap_tput_ / y; - - // cerr << "cap decay: " << cap_tput_ << " bytes/usec" << endl; - } - - l.release (); - - - timespec time; - time.tv_sec = 0; - time.tv_nsec = static_cast<unsigned long> (dev * 500000.0); - - // Don't bother to sleep if the time is less than 10 usec. - // - if (time.tv_nsec > 10000) - ACE_OS::sleep (ACE_Time_Value (time)); - } - } - - out_->send (m); - } - - void Flow:: - recv (Message_ptr m) - { - if (NAK const* nak = static_cast<NAK const*> (m->find (NAK::id))) - { - Address to (static_cast<To const*> (m->find (To::id))->address ()); - - if (nak->address () == to) - { - // This one is for us. - // - - //cerr << "NAK from " - // << static_cast<From const*> (m->find (From::id))->address () - // << " for " << nak->count () << " sns." << endl; - - - ACE_Time_Value nak_time (ACE_OS::gettimeofday ()); - - Lock l (mutex_); - - nak_time_ = nak_time; - - if (cap_tput_ == 0.0) - cap_tput_ = current_tput_; - - if (cap_tput_ != 0.0) - { - cap_tput_ = cap_tput_ - cap_tput_ / 6.0; - - // cerr << "cap: " << cap_tput_ << " bytes/usec" << endl; - } - } - } - - in_->recv (m); - } -} - diff --git a/protocols/ace/RMCast/Flow.h b/protocols/ace/RMCast/Flow.h deleted file mode 100644 index e64d0d438a2..00000000000 --- a/protocols/ace/RMCast/Flow.h +++ /dev/null @@ -1,43 +0,0 @@ -// file : ace/RMCast/Flow.h -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#ifndef ACE_RMCAST_FLOW_H -#define ACE_RMCAST_FLOW_H - -#include "Stack.h" -#include "Protocol.h" -#include "Bits.h" -#include "Parameters.h" - -namespace ACE_RMCast -{ - class Flow : public Element - { - public: - Flow (Parameters const& params); - - public: - virtual void - send (Message_ptr m); - - virtual void - recv (Message_ptr m); - - private: - Parameters const& params_; - - Mutex mutex_; - ACE_Time_Value nak_time_; - - // Throughput sampling. - // - ACE_Time_Value sample_start_time_; - unsigned long sample_bytes_; - double current_tput_; - double cap_tput_; - }; -} - - -#endif // ACE_RMCAST_FLOW_H diff --git a/protocols/ace/RMCast/Fragment.cpp b/protocols/ace/RMCast/Fragment.cpp deleted file mode 100644 index 27247f0e3f9..00000000000 --- a/protocols/ace/RMCast/Fragment.cpp +++ /dev/null @@ -1,78 +0,0 @@ -// file : ace/RMCast/Fragment.cpp -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#include "Fragment.h" - -/* -#include <iostream> -using std::cerr; -using std::endl; -*/ - -namespace ACE_RMCast -{ - Fragment:: - Fragment (Parameters const& params) - : params_ (params), - sn_ (1) - { - } - - void Fragment:: - send (Message_ptr m) - { - if (Data const* data = static_cast<Data const*> (m->find (Data::id))) - { - size_t max_payload_size ( - params_.max_packet_size () - max_service_size); - - if (data->size () <= max_payload_size) - { - u64 sn; - { - Lock l (mutex_); - sn = sn_++; - } - - m->add (Profile_ptr (new SN (sn))); - - out_->send (m); - return; - } - - char const* p = data->buf (); - size_t size (data->size ()); - - // Need fragmentation. - // - u32 packets (size / max_payload_size + (size % max_payload_size ? 1 : 0)); - - // cerr << "size : " << size << endl - // << "packs: " << packets << endl; - - for (u32 i (1); i <= packets; ++i) - { - Message_ptr part (new Message); - - size_t s (i == packets ? size % max_payload_size : max_payload_size); - - // cerr << "pack: " << s << endl; - - u64 sn; - { - Lock l (mutex_); - sn = sn_++; - } - - part->add (Profile_ptr (new SN (sn))); - part->add (Profile_ptr (new Part (i, packets, size))); - part->add (Profile_ptr (new Data (p, s))); - - out_->send (part); - - p += s; - } - } - } -} diff --git a/protocols/ace/RMCast/Fragment.h b/protocols/ace/RMCast/Fragment.h deleted file mode 100644 index bfaa3044c83..00000000000 --- a/protocols/ace/RMCast/Fragment.h +++ /dev/null @@ -1,32 +0,0 @@ -// file : ace/RMCast/Fragment.h -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#ifndef ACE_RMCAST_FRAGMENT_H -#define ACE_RMCAST_FRAGMENT_H - -#include "Stack.h" -#include "Protocol.h" -#include "Bits.h" -#include "Parameters.h" - -namespace ACE_RMCast -{ - class Fragment : public Element - { - public: - Fragment (Parameters const& params); - - public: - virtual void - send (Message_ptr m); - - Parameters const& params_; - - private: - Mutex mutex_; - u64 sn_; - }; -} - -#endif // ACE_RMCAST_FRAGMENT_H diff --git a/protocols/ace/RMCast/Link.cpp b/protocols/ace/RMCast/Link.cpp deleted file mode 100644 index e3379ac1893..00000000000 --- a/protocols/ace/RMCast/Link.cpp +++ /dev/null @@ -1,332 +0,0 @@ -// file : ace/RMCast/Link.cpp -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#include "ace/Time_Value.h" // ACE_Time_Value -#include "ace/OS_NS_stdio.h" -#include "ace/OS_NS_stdlib.h" -#include "ace/OS_NS_sys_socket.h" - -#include "Link.h" - -namespace ACE_RMCast -{ - Link:: - Link (Address const& addr, Parameters const& params) - : params_ (params), - addr_ (addr), - ssock_ (Address (static_cast<unsigned short> (0), - static_cast<ACE_UINT32> (INADDR_ANY)), - AF_INET, - IPPROTO_UDP, - 1), - stop_ (false) - - { - srand (time (0)); - - - rsock_.set_option (IP_MULTICAST_LOOP, 0); - // rsock_.set_option (IP_MULTICAST_TTL, 0); - - // Set recv/send buffers. - // - { - int r (131070); - int s (sizeof (r)); - - static_cast<ACE_SOCK&> (rsock_).set_option ( - SOL_SOCKET, SO_RCVBUF, &r, s); - - static_cast<ACE_SOCK&> (ssock_).set_option ( - SOL_SOCKET, SO_RCVBUF, &r, s); - - rsock_.get_option (SOL_SOCKET, SO_RCVBUF, &r, &s); - //cerr << 5 << "recv buffer size: " << r << endl; - - ssock_.get_option (SOL_SOCKET, SO_RCVBUF, &r, &s); - //cerr << 5 << "send buffer size: " << r << endl; - - } - - // Bind address and port. - // - if (ACE_OS::connect (ssock_.get_handle (), - reinterpret_cast<sockaddr*> (addr_.get_addr ()), - addr_.get_addr_size ()) == -1) - { - ACE_OS::perror ("connect: "); - ACE_OS::abort (); - } - - - ssock_.get_local_addr (self_); - - //cerr << 5 << "self: " << self_ << endl; - } - - void Link:: - in_start (In_Element* in) - { - Element::in_start (in); - - rsock_.join (addr_); - - // Start receiving thread. - // - recv_mgr_.spawn (recv_thunk, this); - } - - void Link:: - out_start (Out_Element* out) - { - Element::out_start (out); - } - - void Link:: - in_stop () - { - // Stop receiving thread. - // - { - Lock l (mutex_); - stop_ = true; - } - recv_mgr_.wait (); - - Element::in_stop (); - } - - void Link:: - send (Message_ptr m) - { - // Simulate message loss and reordering. - // - if (params_.simulator ()) - { - if ((rand () % 17) != 0) - { - Lock l (mutex_); - - if (hold_.get ()) - { - send_ (m); - send_ (hold_); - hold_ = Message_ptr (0); - } - else - { - if ((rand () % 17) != 0) - { - send_ (m); - } - else - { - hold_ = m; - - // Make a copy in M so that the reliable loop below - // won't add FROM and TO to HOLD_. - // - m = hold_->clone (); - } - } - } - } - else - send_ (m); - - // Reliable loop. - // - m->add (Profile_ptr (new From (self_))); - m->add (Profile_ptr (new To (self_))); - - in_->recv (m); - } - - void Link:: - send_ (Message_ptr m) - { - ostream os (m->size (), 1); // Always little-endian. - - os << *m; - - if (os.length () > size_t (params_.max_packet_size ())) - { - ACE_ERROR ((LM_ERROR, - "packet length (%d) exceeds max_poacket_size (%d)\n", - os.length (), params_.max_packet_size ())); - - for (Message::ProfileIterator i (m->begin ()); !i.done (); i.advance ()) - { - ACE_ERROR ((LM_ERROR, - "profile id: %d; size: %d\n", - (*i).ext_id_, (*i).int_id_->size ())); - } - - ACE_OS::abort (); - } - - ssock_.send (os.buffer (), os.length (), addr_); - - /* - if (m->find (nrtm::id)) - { - write (1, os.buffer (), os.length ()); - exit (1); - } - */ - } - - void Link:: - recv () - { - size_t max_packet_size (params_.max_packet_size ()); - - // This is wicked. - // - ACE_Auto_Ptr<char> holder ( - reinterpret_cast<char*> ( - operator new (max_packet_size + ACE_CDR::MAX_ALIGNMENT))); - - char* data = ACE_ptr_align_binary (holder.get (), ACE_CDR::MAX_ALIGNMENT); - - size_t size (0); - - while (true) - { - //@@ Should I lock here? - // - - Address addr; - - // Block for up to one tick waiting for an incomming message. - // - for (;;) - { - ACE_Time_Value t (params_.tick ()); - ssize_t r = rsock_.recv (data, 4, addr, MSG_PEEK, &t); - - - // Check for cancellation request. - // - { - Lock l (mutex_); - if (stop_) - return; - } - - if (r == -1) - { - if (errno != ETIME) - ACE_OS::abort (); - } - else - { - size = static_cast<size_t> (r); - break; - } - } - - - if (size != 4 || addr == self_) - { - // Discard bad messages and ones from ourselvs since - // we are using reliable loopback. - // - rsock_.recv (data, 0, addr); - continue; - } - - u32 msg_size; - { - istream is (data, size, 1); // Always little-endian. - is >> msg_size; - } - - if (msg_size <= 4 || msg_size > max_packet_size) - { - // Bad message. - // - rsock_.recv (data, 0, addr); - continue; - } - - size = rsock_.recv (data, max_packet_size, addr); - - if (msg_size != size) - { - // Bad message. - // - continue; - } - - //cerr << 6 << "from: " << addr << endl; - - Message_ptr m (new Message ()); - - m->add (Profile_ptr (new From (addr))); - m->add (Profile_ptr (new To (self_))); - - istream is (data, size, 1); // Always little-endian. - - is >> msg_size; - - while (true) - { - u16 id, size; - - if (!((is >> id) && (is >> size))) break; - - //cerr << 6 << "reading profile with id " << id << " " - // << size << " bytes long" << endl; - - Profile::Header hdr (id, size); - - if (id == SN::id) - { - m->add (Profile_ptr (new SN (hdr, is))); - } - else if (id == Data::id) - { - m->add (Profile_ptr (new Data (hdr, is))); - } - else if (id == NAK::id) - { - m->add (Profile_ptr (new NAK (hdr, is))); - } - else if (id == NRTM::id) - { - m->add (Profile_ptr (new NRTM (hdr, is))); - } - else if (id == NoData::id) - { - m->add (Profile_ptr (new NoData (hdr, is))); - } - else if (id == Part::id) - { - m->add (Profile_ptr (new Part (hdr, is))); - } - else - { - //cerr << 0 << "unknown profile id " << hdr.id () << endl; - ACE_OS::abort (); - } - } - - in_->recv (m); - } - } - - ACE_THR_FUNC_RETURN Link:: - recv_thunk (void* obj) - { - reinterpret_cast<Link*> (obj)->recv (); - return 0; - } - - void Link:: - recv (Message_ptr) - { - ACE_OS::abort (); - } -} diff --git a/protocols/ace/RMCast/Link.h b/protocols/ace/RMCast/Link.h deleted file mode 100644 index cff166c6e13..00000000000 --- a/protocols/ace/RMCast/Link.h +++ /dev/null @@ -1,71 +0,0 @@ -// file : ace/RMCast/Link.h -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#ifndef ACE_RMCAST_LINK_H -#define ACE_RMCAST_LINK_H - -#include "ace/SOCK_Dgram.h" -#include "ace/SOCK_Dgram_Mcast.h" - -#include "ace/Thread_Manager.h" - -#include "Stack.h" -#include "Protocol.h" -#include "Parameters.h" - -namespace ACE_RMCast -{ - class Link : public Element - { - public: - Link (Address const& addr, Parameters const& params); - - virtual void - in_start (In_Element* in); - - virtual void - out_start (Out_Element* out); - - virtual void - in_stop (); - - public: - virtual void - send (Message_ptr m); - - private: - virtual void - send_ (Message_ptr m); - - private: - void - recv (); - - static ACE_THR_FUNC_RETURN - recv_thunk (void* obj); - - private: - virtual void - recv (Message_ptr); - - private: - Parameters const& params_; - - Address addr_, self_; - ACE_SOCK_Dgram_Mcast rsock_; - ACE_SOCK_Dgram ssock_; - - bool stop_; - ACE_Thread_Manager recv_mgr_; - - // Simulator. - // - Message_ptr hold_; - - Mutex mutex_; - }; -} - - -#endif // ACE_RMCAST_LINK_H diff --git a/protocols/ace/RMCast/Makefile.am b/protocols/ace/RMCast/Makefile.am deleted file mode 100644 index 1a121915c62..00000000000 --- a/protocols/ace/RMCast/Makefile.am +++ /dev/null @@ -1,79 +0,0 @@ -## Process this file with automake to create Makefile.in -## -## $Id$ -## -## This file was generated by MPC. Any changes made directly to -## this file will be lost the next time it is generated. -## -## MPC Command: -## ./bin/mwc.pl -include /home/jtc/ACE/ACE-config3/MPC/config -include /home/jtc/ACE/ACE-config3/MPC/templates -type automake ACE.mwc - -includedir = @includedir@/ace/RMCast -pkgconfigdir = @libdir@/pkgconfig - -ACE_BUILDDIR = $(top_builddir) -ACE_ROOT = $(top_srcdir) - - - -if BUILD_THREADS - -lib_LTLIBRARIES = libACE_RMCast.la - -libACE_RMCast_la_CPPFLAGS = \ - -I$(ACE_ROOT) \ - -I$(ACE_BUILDDIR) \ - -DACE_RMCAST_BUILD_DLL - -libACE_RMCast_la_SOURCES = \ - Acknowledge.cpp \ - Flow.cpp \ - Fragment.cpp \ - Link.cpp \ - Protocol.cpp \ - Reassemble.cpp \ - Retransmit.cpp \ - Simulator.cpp \ - Socket.cpp \ - Stack.cpp \ - Template_Instantiations.cpp - -libACE_RMCast_la_LDFLAGS = \ - -version-number @ACE_MAJOR@:@ACE_MINOR@:@ACE_BETA@ - -libACE_RMCast_la_LIBADD = \ - $(ACE_BUILDDIR)/ace/libACE.la - -nobase_include_HEADERS = \ - Acknowledge.h \ - Bits.h \ - Flow.h \ - Fragment.h \ - Link.h \ - Parameters.h \ - Protocol.h \ - RMCast_Export.h \ - Reassemble.h \ - Retransmit.h \ - Simulator.h \ - Socket.h \ - Stack.h - -pkgconfig_DATA = ACE_RMCast.pc - -ACE_RMCast.pc: ${top_builddir}/config.status ${srcdir}/ACE_RMCast.pc.in - ${top_builddir}/config.status --file $@:${srcdir}/ACE_RMCast.pc.in - -endif BUILD_THREADS - -EXTRA_DIST = \ - ACE_RMCast.pc.in - - -## Clean up template repositories, etc. -clean-local: - -rm -f *~ *.bak *.rpo *.sym lib*.*_pure_* core core.* - -rm -f gcctemp.c gcctemp so_locations *.ics - -rm -rf cxx_repository ptrepository ti_files - -rm -rf templateregistry ir.out - -rm -rf ptrepository SunWS_cache Templates.DB diff --git a/protocols/ace/RMCast/Parameters.h b/protocols/ace/RMCast/Parameters.h deleted file mode 100644 index d254bd00fad..00000000000 --- a/protocols/ace/RMCast/Parameters.h +++ /dev/null @@ -1,109 +0,0 @@ -// file : ace/RMCast/Parameters.h -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#ifndef ACE_RMCAST_PARAMETERS_H -#define ACE_RMCAST_PARAMETERS_H - -#include "ace/Time_Value.h" - - -namespace ACE_RMCast -{ - class Parameters - { - public: - Parameters ( - // Loss and reordering simulator. - // - bool simulator = false, - - // MTU(1500) - IP-hdr - UDP-hdr - // - unsigned short max_packet_size = 1470, - - // How often various worker threads wakeup to do - // cacellation checks, queue run-throughs, etc. - // - ACE_Time_Value const& tick = ACE_Time_Value (0, 2000), - - // How long to wait, in ticks, before sending NAK. - // - unsigned long nak_timeout = 1, - - // How long to wait, in ticks, before sending NRTM. - // - unsigned long nrtm_timeout = 10, - - // How long to retain a message for retransmission, in ticks. - // - unsigned long retention_timeout = 500, // 1 sec - - size_t addr_map_size = 50 - ) - : simulator_ (simulator), - max_packet_size_ (max_packet_size), - tick_ (tick), - nak_timeout_ (nak_timeout), - nrtm_timeout_ (nrtm_timeout), - retention_timeout_ (retention_timeout), - addr_map_size_(addr_map_size) - { - } - - public: - bool - simulator () const - { - return simulator_; - } - - unsigned short - max_packet_size () const - { - return max_packet_size_; - } - - ACE_Time_Value const& - tick () const - { - return tick_; - } - - unsigned long - nak_timeout () const - { - return nak_timeout_; - } - - unsigned long - nrtm_timeout () const - { - return nrtm_timeout_; - } - - unsigned long - retention_timeout () const - { - return retention_timeout_; - } - - size_t - addr_map_size () const - { - return addr_map_size_; - } - - private: - bool simulator_; - unsigned short max_packet_size_; - ACE_Time_Value tick_; - unsigned long nak_timeout_; - unsigned long nrtm_timeout_; - unsigned long retention_timeout_; - size_t addr_map_size_; - }; -} - - -#endif // ACE_RMCAST_PARAMETERS_H diff --git a/protocols/ace/RMCast/Protocol.cpp b/protocols/ace/RMCast/Protocol.cpp deleted file mode 100644 index 755872371cb..00000000000 --- a/protocols/ace/RMCast/Protocol.cpp +++ /dev/null @@ -1,17 +0,0 @@ -// file : ace/RMCast/Protocol.cpp -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#include "Protocol.h" - -namespace ACE_RMCast -{ - u16 const From:: id = 0x0001; - u16 const To:: id = 0x0002; - u16 const Data:: id = 0x0003; - u16 const SN:: id = 0x0004; - u16 const NAK:: id = 0x0005; - u16 const NRTM:: id = 0x0006; - u16 const NoData::id = 0x0007; - u16 const Part:: id = 0x0008; -} diff --git a/protocols/ace/RMCast/Protocol.h b/protocols/ace/RMCast/Protocol.h deleted file mode 100644 index c0e2797b732..00000000000 --- a/protocols/ace/RMCast/Protocol.h +++ /dev/null @@ -1,1274 +0,0 @@ -// file : ace/RMCast/Protocol.h -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#ifndef ACE_RMCAST_PROTOCOL_H -#define ACE_RMCAST_PROTOCOL_H - -#include "ace/Refcounted_Auto_Ptr.h" - -#include "ace/Vector_T.h" -#include "ace/Hash_Map_Manager.h" - -#include "ace/CDR_Stream.h" -#include "ace/CDR_Size.h" - -#include "ace/INET_Addr.h" -#include "ace/Null_Mutex.h" - -#include "ace/OS_NS_string.h" -#include "ace/OS_NS_stdlib.h" - -#include "Bits.h" - -/* -#include <iostream> -*/ - -namespace ACE_RMCast -{ - // Basic types. - // - typedef ACE_CDR::UShort u16; - typedef ACE_CDR::ULong u32; - typedef ACE_CDR::ULongLong u64; - - // Protocol parameters - // - // - unsigned short const max_service_size = 60; // service profiles (Part, SN, - // etc), sizes plus message size. - - // - // - // - typedef ACE_INET_Addr Address; - - struct AddressHasher - { - unsigned long - operator() (Address const& a) const - { - unsigned long port (a.get_port_number ()); - unsigned long ip (a.get_ip_address ()); - - port <<= sizeof (unsigned long) - sizeof (unsigned short); - - return port ^ ip; - } - }; - - //@@ Provide stream<< (Address const&) - // - - typedef ACE_OutputCDR ostream; - typedef ACE_SizeCDR sstream; - typedef ACE_InputCDR istream; - - struct Profile; - - typedef - ACE_Refcounted_Auto_Ptr<Profile, Mutex> - Profile_ptr; - - struct Profile - { - public: - class Header - { - public: - Header (u16 id, u16 size) - : id_ (id), size_ (size) - { - } - - Header (istream& is) - { - (void) (is >> id_ >> size_); - } - - public: - u16 - id () const - { - return id_; - } - - u16 - size () const - { - return size_; - } - - protected: - void - size (u16 s) - { - size_ = s; - } - - friend struct Profile; - - private: - u16 id_; - u16 size_; - }; - - public: - virtual - ~Profile () - { - } - - Profile_ptr - clone () - { - return clone_ (); - } - - protected: - Profile (u16 id) - : header_ (id, 0) - { - } - - Profile (Header const& h) - : header_ (h) - { - } - - virtual Profile_ptr - clone_ () = 0; - - private: - Profile& - operator= (Profile const&); - - public: - u16 - id () const - { - return header_.id (); - } - - u16 - size () const - { - return header_.size (); - } - - protected: - void - size (u16 s) - { - header_.size (s); - } - - u16 - calculate_size () - { - sstream ss; - - serialize_body (ss); - - return static_cast<u16> (ss.total_length ()); - } - - public: - virtual void - serialize_body (ostream&) const = 0; - - virtual void - serialize_body (sstream&) const = 0; - - friend - ostream& - operator<< (ostream& os, Profile const& p); - - friend - sstream& - operator<< (sstream& ss, Profile const& p); - - private: - Header header_; - }; - - inline - ostream& - operator<< (ostream& os, Profile::Header const& hdr) - { - os << hdr.id (); - os << hdr.size (); - - return os; - } - - inline - sstream& - operator<< (sstream& ss, Profile::Header const& hdr) - { - ss << hdr.id (); - ss << hdr.size (); - - return ss; - } - - inline - ostream& - operator<< (ostream& os, Profile const& p) - { - os << p.header_; - p.serialize_body (os); - - return os; - } - - inline - sstream& - operator<< (sstream& ss, Profile const& p) - { - ss << p.header_; - p.serialize_body (ss); - - return ss; - } - - - // - // - // - class Message; - - typedef - ACE_Refcounted_Auto_Ptr<Message, Mutex> - Message_ptr; - - class Message - { - typedef - ACE_Hash_Map_Manager<u16, Profile_ptr, ACE_Null_Mutex> - Profiles; - - public: - Message () - : profiles_ (4) - { - } - - Message_ptr - clone () - { - return new Message (*this); - } - - protected: - Message (Message const& m) - : profiles_ (4) - { - for (Profiles::const_iterator i (m.profiles_); !i.done (); i.advance ()) - { - // Shallow copy of profiles. This implies that profiles are not - // modified as they go up/down the stack. - // - profiles_.bind ((*i).ext_id_, (*i).int_id_); - } - } - - private: - Message& - operator= (Message const&); - - public: - bool - add (Profile_ptr p) - { - u16 id (p->id ()); - - if (profiles_.find (id) == 0) - { - return false; - } - - profiles_.bind (id, p); - - return true; - } - - void - replace (Profile_ptr p) - { - profiles_.rebind (p->id (), p); - } - - void - remove (u16 id) - { - profiles_.unbind (id); - } - - Profile const* - find (u16 id) const - { - Profiles::ENTRY* e = 0; - - if (profiles_.find (id, e) == -1) return 0; - - return e->int_id_.get (); - } - - typedef - Profiles::const_iterator - ProfileIterator; - - ProfileIterator - begin () const - { - return ProfileIterator (profiles_); - } - - public: - size_t - size () const - { - sstream ss; - - u32 s (0); - - ss << s; - - for (Profiles::const_iterator i (profiles_); !i.done (); i.advance ()) - { - ss << *((*i).int_id_); - } - - return ss.total_length (); - } - - friend - ostream& - operator<< (ostream& os, Message const& m) - { - u32 s (m.size ()); - - os << s; - - for (Profiles::const_iterator i (m.profiles_); !i.done (); i.advance ()) - { - os << *((*i).int_id_); - } - - return os; - } - - private: - Profiles profiles_; - }; - - typedef ACE_Vector<Message_ptr, ACE_VECTOR_DEFAULT_SIZE> Messages; - - // - // - // - struct From; - - typedef - ACE_Refcounted_Auto_Ptr<From, Mutex> - From_ptr; - - struct From : Profile - { - static u16 const id; - - public: - From (Header const& h, istream& is) - : Profile (h) - { - u32 addr; - u16 port; - - is >> addr; - is >> port; - - address_ = Address (port, addr); - } - - From (Address const& addr) - : Profile (id), address_ (addr) - { - size (calculate_size ()); - } - - From_ptr - clone () - { - return From_ptr (static_cast<From*> (clone_ ().release ())); - } - - protected: - virtual Profile_ptr - clone_ () - { - return new From (*this); - } - - From (From const& from) - : Profile (from), - address_ (from.address_) - { - } - - public: - Address const& - address () const - { - return address_; - } - - public: - virtual void - serialize_body (ostream& os) const - { - u32 addr (address_.get_ip_address ()); - u16 port (address_.get_port_number ()); - - os << addr; - os << port; - } - - virtual void - serialize_body (sstream& ss) const - { - u32 addr (0); - u16 port (0); - - ss << addr; - ss << port; - } - - private: - Address address_; - }; - - - // - // - // - struct To; - - typedef - ACE_Refcounted_Auto_Ptr<To, Mutex> - To_ptr; - - struct To : Profile - { - static u16 const id; - - public: - To (Header const& h, istream& is) - : Profile (h) - { - u32 addr; - u16 port; - - is >> addr; - is >> port; - - address_ = Address (port, addr); - } - - To (Address const& addr) - : Profile (id), address_ (addr) - { - size (calculate_size ()); - } - - To_ptr - clone () - { - return To_ptr (static_cast<To*> (clone_ ().release ())); - } - - protected: - virtual Profile_ptr - clone_ () - { - return new To (*this); - } - - To (To const& to) - : Profile (to), - address_ (to.address_) - { - } - - public: - Address const& - address () const - { - return address_; - } - - public: - virtual void - serialize_body (ostream& os) const - { - u32 addr (address_.get_ip_address ()); - u16 port (address_.get_port_number ()); - - os << addr; - os << port; - } - - virtual void - serialize_body (sstream& ss) const - { - u32 addr (0); - u16 port (0); - - ss << addr; - ss << port; - } - - private: - Address address_; - }; - - - // - // - // - struct Data; - - typedef - ACE_Refcounted_Auto_Ptr<Data, Mutex> - Data_ptr; - - struct Data : Profile - { - static u16 const id; - - public: - virtual - ~Data () - { - if (buf_) - operator delete (buf_); - } - - Data (Header const& h, istream& is) - : Profile (h), - buf_ (0), - size_ (h.size ()), - capacity_ (size_) - { - if (size_) - { - buf_ = reinterpret_cast<char*> (operator new (capacity_)); - is.read_char_array (buf_, size_); - } - } - - Data (void const* buf, size_t s, size_t capacity = 0) - : Profile (id), - buf_ (0), - size_ (s), - capacity_ (capacity < size_ ? size_ : capacity) - { - if (size_) - { - buf_ = reinterpret_cast<char*> (operator new (capacity_)); - ACE_OS::memcpy (buf_, buf, size_); - } - - Profile::size (calculate_size ()); - } - - Data_ptr - clone () - { - return Data_ptr (static_cast<Data*> (clone_ ().release ())); - } - - protected: - virtual Profile_ptr - clone_ () - { - return new Data (*this); - } - - Data (Data const& d) - : Profile (d), - buf_ (0), - size_ (d.size_), - capacity_ (d.capacity_) - { - if (size_) - { - buf_ = reinterpret_cast<char*> (operator new (capacity_)); - ACE_OS::memcpy (buf_, d.buf_, size_); - } - - Profile::size (calculate_size ()); - } - - public: - char const* - buf () const - { - return buf_; - } - - char* - buf () - { - return buf_; - } - - size_t - size () const - { - return size_; - } - - void - size (size_t s) - { - if (s > capacity_) - ACE_OS::abort (); - - size_ = s; - - Profile::size (calculate_size ()); - } - - size_t - capacity () const - { - return capacity_; - } - - public: - virtual void - serialize_body (ostream& os) const - { - os.write_char_array (buf_, size_); - } - - virtual void - serialize_body (sstream& ss) const - { - ss.write_char_array (buf_, size_); - } - - private: - char* buf_; - size_t size_; - size_t capacity_; - }; - - - // - // - // - struct SN; - - typedef - ACE_Refcounted_Auto_Ptr<SN, Mutex> - SN_ptr; - - struct SN : Profile - { - static u16 const id; - - public: - SN (Header const& h, istream& is) - : Profile (h) - { - is >> n_; - } - - SN (u64 n) - : Profile (id), n_ (n) - { - size (calculate_size ()); - } - - SN_ptr - clone () - { - return SN_ptr (static_cast<SN*> (clone_ ().release ())); - } - - protected: - virtual Profile_ptr - clone_ () - { - return new SN (*this); - } - - SN (SN const& sn) - : Profile (sn), - n_ (sn.n_) - { - } - - public: - u64 - num () const - { - return n_; - } - - public: - virtual void - serialize_body (ostream& os) const - { - os << n_; - } - - virtual void - serialize_body (sstream& ss) const - { - ss << n_; - } - - private: - u64 n_; - }; - - - // - // - // - class NAK; - - typedef - ACE_Refcounted_Auto_Ptr<NAK, Mutex> - NAK_ptr; - - class NAK : public Profile - { - public: - - static u16 const id; - - typedef ACE_Vector<u64, ACE_VECTOR_DEFAULT_SIZE> SerialNumbers; - typedef SerialNumbers::Iterator iterator; - - NAK (Header const& h, istream& is) - : Profile (h) - { - u64 sn (0); - u32 addr (0); - u16 port (0); - - sstream ss; - - ss << sn; - size_t sn_size (ss.total_length ()); - - ss.reset (); - - ss << addr; - ss << port; - - size_t addr_size (ss.total_length ()); - - - is >> addr; - is >> port; - - // num_of_sns = (size - addr_size) / sn_size - // - for (unsigned long i (0); i < ((h.size () - addr_size) / sn_size); ++i) - { - is >> sn; - sns_.push_back (sn); - } - - - address_ = Address (port, addr); - } - - NAK (Address const& src) - : Profile (id), address_ (src) - { - size (calculate_size ()); - } - - NAK_ptr - clone () - { - return NAK_ptr (static_cast<NAK*> (clone_ ().release ())); - } - - protected: - virtual Profile_ptr - clone_ () - { - return new NAK (*this); - } - - NAK (NAK const& nak) - : Profile (nak), - address_ (nak.address_), - sns_ (nak.sns_) - { - } - - public: - void - add (u64 sn) - { - sns_.push_back (sn); - size (calculate_size ()); - } - - public: - Address const& - address () const - { - return address_; - } - - - iterator - begin () /* const */ - { - return iterator (sns_); - } - - /* - iterator - end () const - { - return sns_.end (); - } - */ - - size_t - count () const - { - return sns_.size (); - } - - public: - // Count max number of elements that will fit into NAK profile - // with size <= max_size. - // - static u32 - max_count (u32 max_size) - { - u32 n (0); - - sstream ss; - - Profile::Header hdr (0, 0); - ss << hdr; - - u32 addr (0); - u16 port (0); - ss << addr; - ss << port; - - while (true) - { - u64 sn (0); - ss << sn; - - if (ss.total_length () <= max_size) - ++n; - - if (ss.total_length () >= max_size) - break; - } - - return n; - } - - public: - virtual void - serialize_body (ostream& os) const - { - NAK& this_ = const_cast<NAK&> (*this); // Don't put in ROM. - - u32 addr (address_.get_ip_address ()); - u16 port (address_.get_port_number ()); - - os << addr; - os << port; - - // Stone age iteration. - // - for (iterator i (this_.begin ()); !i.done (); i.advance ()) - { - u64* psn; - i.next (psn); - os << *psn; - } - } - - virtual void - serialize_body (sstream& ss) const - { - NAK& this_ = const_cast<NAK&> (*this); // Don't put in ROM. - - u32 addr (0); - u16 port (0); - - ss << addr; - ss << port; - - // Stone age iteration. - // - for (iterator i (this_.begin ()); !i.done (); i.advance ()) - { - u64 sn (0); - ss << sn; - } - } - - private: - Address address_; - SerialNumbers sns_; - }; - - // - // - // - struct NRTM; - - typedef - ACE_Refcounted_Auto_Ptr<NRTM, Mutex> - NRTM_ptr; - - struct NRTM : Profile - { - static u16 const id; - - public: - NRTM (Header const& h, istream& is) - : Profile (h), map_ (10) - { - u32 addr (0); - u16 port (0); - u64 sn (0); - - sstream ss; - - ss << sn; - ss << addr; - ss << port; - - size_t block_size (ss.total_length ()); - - - // num_of_blocks = size / block_size - // - for (size_t i (0); i < (h.size () / block_size); ++i) - { - is >> sn; - is >> addr; - is >> port; - - map_.bind (Address (port, addr), sn); - } - } - - NRTM () - : Profile (id), map_ (10) - { - size (calculate_size ()); - } - - NRTM_ptr - clone () - { - return NRTM_ptr (static_cast<NRTM*> (clone_ ().release ())); - } - - protected: - virtual Profile_ptr - clone_ () - { - return new NRTM (*this); - } - - NRTM (NRTM const& nrtm) - : Profile (nrtm) - { - for (Map::const_iterator i (nrtm.map_); !i.done (); i.advance ()) - { - map_.bind ((*i).ext_id_, (*i).int_id_); - } - } - - public: - void - insert (Address const& addr, u64 sn) - { - map_.bind (addr, sn); - - size (calculate_size ()); - } - - u64 - find (Address const& addr) const - { - u64 sn; - - if (map_.find (addr, sn) == -1) return 0; - - return sn; - } - - bool - empty () const - { - return map_.current_size () == 0; - } - - public: - // Count max number of elements that will fit into NRTM profile - // with size <= max_size. - // - static u32 - max_count (u32 max_size) - { - u32 n (0); - - sstream ss; - - Profile::Header hdr (0, 0); - ss << hdr; - - while (true) - { - u32 addr (0); - u16 port (0); - u64 sn (0); - - ss << sn; - ss << addr; - ss << port; - - if (ss.total_length () <= max_size) - ++n; - - if (ss.total_length () >= max_size) - break; - } - - return n; - } - - public: - virtual void - serialize_body (ostream& os) const - { - for (Map::const_iterator i (map_), e (map_, 1); i != e; ++i) - { - u32 addr ((*i).ext_id_.get_ip_address ()); - u16 port ((*i).ext_id_.get_port_number ()); - u64 sn ((*i).int_id_); - - os << sn; - os << addr; - os << port; - - } - } - - virtual void - serialize_body (sstream& ss) const - { - for (Map::const_iterator i (map_), e (map_, 1); i != e; ++i) - { - u32 addr (0); - u16 port (0); - u64 sn (0); - - ss << sn; - ss << addr; - ss << port; - } - } - - private: - typedef - ACE_Hash_Map_Manager_Ex<Address, - u64, - AddressHasher, - ACE_Equal_To<Address>, - ACE_Null_Mutex> - Map; - - Map map_; - }; - - - // - // - // - struct NoData; - - typedef - ACE_Refcounted_Auto_Ptr<NoData, Mutex> - NoData_ptr; - - struct NoData : Profile - { - static u16 const id; - - public: - NoData (Header const& h, istream&) - : Profile (h) - { - } - - NoData () - : Profile (id) - { - Profile::size (0); - } - - NoData_ptr - clone () - { - return NoData_ptr (static_cast<NoData*> (clone_ ().release ())); - } - - protected: - virtual Profile_ptr - clone_ () - { - return new NoData (*this); - } - - NoData (NoData const& no_data) - : Profile (no_data) - { - } - - public: - virtual void - serialize_body (ostream&) const - { - } - - virtual void - serialize_body (sstream&) const - { - } - }; - - - // - // - // - struct Part; - - typedef - ACE_Refcounted_Auto_Ptr<Part, Mutex> - Part_ptr; - - struct Part : Profile - { - static u16 const id; - - public: - Part (Header const& h, istream& is) - : Profile (h) - { - is >> num_; - is >> of_; - is >> total_size_; - } - - Part (u32 num, u32 of, u64 total_size) - : Profile (id), - num_ (num), - of_ (of), - total_size_ (total_size) - { - size (calculate_size ()); - } - - Part_ptr - clone () - { - return Part_ptr (static_cast<Part*> (clone_ ().release ())); - } - - protected: - virtual Profile_ptr - clone_ () - { - return new Part (*this); - } - - Part (Part const& part) - : Profile (part), - num_ (part.num_), - of_ (part.of_), - total_size_ (part.total_size_) - { - } - - public: - u32 - num () const - { - return num_; - } - - u32 - of () const - { - return of_; - } - - u64 - total_size () const - { - return total_size_; - } - - public: - virtual void - serialize_body (ostream& os) const - { - os << num_; - os << of_; - os << total_size_; - } - - virtual void - serialize_body (sstream& ss) const - { - ss << num_; - ss << of_; - ss << total_size_; - } - - - private: - u32 num_; - u32 of_; - u64 total_size_; - }; - -} - -/* -inline -std::ostream& -operator<< (std::ostream& os, ACE_RMCast::Address const& a) -{ - char buf[64]; - a.addr_to_string (buf, 64, 1); - return os << buf; -} -*/ - -#endif // ACE_RMCAST_PROTOCOL_H diff --git a/protocols/ace/RMCast/README b/protocols/ace/RMCast/README deleted file mode 100644 index 9eda58871b0..00000000000 --- a/protocols/ace/RMCast/README +++ /dev/null @@ -1,197 +0,0 @@ - -Introduction ------------- - -RMCast is a reliable source-ordered multicast protocol implementation -for message-oriented multi-sender group communication built on top of -IPv4 multicast. It uses sequence numbers for re-ordering, duplicate -suppression and loss detection. Negative acknowledgments (NAK) with -retransmissions are used to recover from losses. - -One new and interesting idea implemented in this protocol is history -transmission (dubbed negative retransmission). In a nutshell, each -sender, along with normal payload, transmits a list of other sender's -IDs along with sequence numbers of last messages received from those -senders by this member. This, in some sense, builds a pyramid of -information: each subsequent message carries some information for a -number of previous messages (from other senders). This helps other -receivers detect losses. - -The protocol does not track group membership. Messages are retained -for retransmission for a predefined amount of time. The "last message -or lost message" dilemma is solved by periodic history transmissions -in cases when there is no useful traffic (idle network). - - -Examples --------- - -There is a simple example available in examples/RMCast/Send_Msg with -the corresponding README file. - - -Protocol --------- - -Over-the-wire representation is little-endian CDR. The protocol is -message-based with information encapsulated into one or multiple -profiles (Protocol.h): - - - -struct Profile -{ - u16 id; // Profile id. - u16 size; // Profile size. -}; - -struct Message -{ - u32 size; // Total size of the message. - sequence<Profile> profiles; // Sequence of profiles. -} - - - -The following profiles are defined (Protocol.h): - - - -struct From: Profile -{ - u32 addr; // IPv4 address. - u16 port; -}; - -The 'From' profile appears in each message. It is never transmitted -over the wire. Instead the 'Link' layer (see below) adds it. - - - -struct To: Profile -{ - u32 addr; // IPv4 address. - u16 port; -}; - -The 'To' profile also appears in each message. It is also never -transmitted over the wire since all communications are done via -well-known group address. It is added by the 'Link' layer and is used -by a group member to identify messages from itself ('From' == 'To'). - - - -struct Data: Profile -{ - sequence<octet> data; -}; - -The 'Data' profile is used to transmit user payload. - - - -struct SN: Profile -{ - u64 sn; -}; - -The 'SN' profile carries sequence number for 'Data' and 'NoData' profiles. - - - -struct NAK: Profile -{ - u32 addr; // IPv4 address. - u16 port; - - sequence<u64> sns; -}; - -The 'NAK' profile carries sequence numbers of all the messages originated -from the member identified by addr:port that the receiver detected were -lost. - - - -struct NRTM: Profile -{ - struct Pair - { - u32 addr; // IPv4 address. - u16 port; - - u64 max_sn; - }; - - sequence<Pair> nrtm; -}; - -The 'NRTM' profile carries highest sequence numbers known to this member -for (some sub-) set of members. It is used by other members to detect loses. -This profile is normally combined with 'Data' transmission. - - - -struct NoData: Profile -{ -}; - -The 'NoData' profile is send in reply to 'NAK' when the lost message is -no longer available. - - - -Below is the list of actions that trigger messages with various -profiles: - - -user calls send(): SN - Data - NRTM - -detected loss: NAK - - -received NAK: SN or SN - Data NoData - NRTM NRTM - - -Implementation --------------- - -This section describes high-level architecture of the implementation. -The protocol is implemented as a stack (Stack.h) of the following -elements: - -'Socket' -'Acknowledge' -'Retransmit' -'Link' - -The 'Socket' element is the user interface of the member. When a user -calls send() 'Socket' creates a new message with 'SN' and 'Data' profiles -and forwards it to the 'Acknowledge' element. It also receives (from -'Acknowledge') and queues incoming messages that are delivered to the user -when recv() is called. - -The 'Acknowledge' element is responsible for re-ordering, duplicate -suppression, loss detection and negative acknowledgments. It maintains a -dynamically changing "window" (which slides toward higher sequence -numbers) of received messages. Messages that arrive out of order are held -in this window. Presence of a hole in the windows for a long period of time -indicates loss and triggers a negative acknowledgment. - -The 'Retransmit' element is responsible for message retention, aging and -retransmission in response to NAKs. Each message received from the 'Socket' -element is held for predetermined amount of time in case retransmission is -required. Upon reception of a NAK duplicate is send if the requested message -is still available. Otherwise 'NoData' profile is sent. - - -The 'Link' element is responsible for interfacing with the IPv4 multicast -socket. It also parses over-the-wire representation into in-memory messages -with individually-accessible profiles. - --- -Boris Kolpackov <boris@kolpackov.net> diff --git a/protocols/ace/RMCast/RMCast.mpc b/protocols/ace/RMCast/RMCast.mpc deleted file mode 100644 index f77bd4d942c..00000000000 --- a/protocols/ace/RMCast/RMCast.mpc +++ /dev/null @@ -1,12 +0,0 @@ -// -*- MPC -*- -// $Id$ - -project(RMCast) : acelib, core, threads { - avoids = ace_for_tao - sharedname = ACE_RMCast - dynamicflags = ACE_RMCAST_BUILD_DLL - - Pkgconfig_Files { - ACE_RMCast.pc.in - } -} diff --git a/protocols/ace/RMCast/RMCast_Export.h b/protocols/ace/RMCast/RMCast_Export.h deleted file mode 100644 index 51257c4d682..00000000000 --- a/protocols/ace/RMCast/RMCast_Export.h +++ /dev/null @@ -1,44 +0,0 @@ -// -*- C++ -*- -// $Id$ -// Definition for Win32 Export directives. -// This file is generated automatically by -// generate_export_file.pl -// ------------------------------ -#if !defined (ACE_RMCAST_EXPORT_H) -#define ACE_RMCAST_EXPORT_H - -#include "ace/config-all.h" - -#if defined (ACE_AS_STATIC_LIBS) && !defined (ACE_RMCAST_HAS_DLL) -# define ACE_RMCAST_HAS_DLL 0 -#endif /* ACE_AS_STATIC_LIBS && ACE_RMCAST_HAS_DLL */ - -#if !defined (ACE_RMCAST_HAS_DLL) -#define ACE_RMCAST_HAS_DLL 1 -#endif /* ! ACE_RMCAST_HAS_DLL */ - -#if defined (ACE_RMCAST_HAS_DLL) -# if (ACE_RMCAST_HAS_DLL == 1) -# if defined (ACE_RMCAST_BUILD_DLL) -# define ACE_RMCast_Export ACE_Proper_Export_Flag -# define ACE_RMCAST_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T) -# define ACE_RMCAST_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) -# else -# define ACE_RMCast_Export ACE_Proper_Import_Flag -# define ACE_RMCAST_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T) -# define ACE_RMCAST_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) -# endif /* ACE_RMCAST_BUILD_DLL */ -# else -# define ACE_RMCast_Export -# define ACE_RMCAST_SINGLETON_DECLARATION(T) -# define ACE_RMCAST_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) -# endif /* ! ACE_RMCAST_HAS_DLL == 1 */ -#else -# define ACE_RMCast_Export -# define ACE_RMCAST_SINGLETON_DECLARATION(T) -# define ACE_RMCAST_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) -#endif /* ACE_RMCAST_HAS_DLL */ - -#endif /* ACE_RMCAST_EXPORT_H */ - -// End of auto generated file. diff --git a/protocols/ace/RMCast/Reassemble.cpp b/protocols/ace/RMCast/Reassemble.cpp deleted file mode 100644 index 9fa3e0d0167..00000000000 --- a/protocols/ace/RMCast/Reassemble.cpp +++ /dev/null @@ -1,122 +0,0 @@ -// file : ace/RMCast/Reassemble.cpp -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#include "Reassemble.h" -#include "ace/OS_NS_stdlib.h" - -/* -#include <iostream> -using std::cerr; -using std::endl; -*/ - -namespace ACE_RMCast -{ - Reassemble:: - Reassemble (Parameters const& params) - : params_ (params) - { - } - - void Reassemble:: - recv (Message_ptr m) - { - Map::ENTRY* e; - Address from ( - static_cast<From const*> (m->find (From::id))->address ()); - - if (Data const* data = static_cast<Data const*> (m->find (Data::id))) - { - if (Part const* part = static_cast<Part const*> (m->find (Part::id))) - { - if (map_.find (from, e) == -1) - { - // First part of the message. - // - - if (part->num () != 1) - { - // We assume that we received NoData for one of the preceding - // fragments. Ignore this one. - return; - } - - Data_ptr new_data (new Data (data->buf (), - static_cast<size_t> (data->size ()), - static_cast<size_t> (part->total_size ()))); - - //std::cerr << "part->total_size (): " << part->total_size () << endl; - - map_.bind (from, new_data); - } - else - { - // Next part of the message. - // - - if (part->num () == 1) - ACE_OS::abort (); - - - Data const* data = static_cast<Data const*> (m->find (Data::id)); - - Data_ptr& new_data = e->int_id_; - - ACE_OS::memcpy (new_data->buf () + new_data->size (), - data->buf (), - data->size ()); - - //std::cerr << "data->size (): " << data->size () << endl - // << "new_data->size (): " << new_data->size () << endl - // << "new_data->capa (): " << new_data->capacity () << endl; - - new_data->size (new_data->size () + data->size ()); - - - if (part->num () == part->of ()) - { - // Reassembly is complete. - // - if (part->total_size () != new_data->size ()) - ACE_OS::abort (); - - Message_ptr new_msg (new Message ()); - - Address to ( - static_cast<To const*> (m->find (To::id))->address ()); - - new_msg->add (Profile_ptr (new To (to))); - new_msg->add (Profile_ptr (new From (from))); - new_msg->add (Profile_ptr (new_data.release ())); - - map_.unbind (from); - - in_->recv (new_msg); - } - } - } - else - { - // Non-fragmented message. Make sure we are in the consistent state - // and forward it up. - // - if (map_.find (from, e) != -1) - ACE_OS::abort (); - - in_->recv (m); - } - } - else if (m->find (NoData::id) != 0) - { - if (map_.find (from, e) != -1) - { - // We already received some fragments. Clean everyhting up. - // - map_.unbind (from); - } - - in_->recv (m); - } - } -} diff --git a/protocols/ace/RMCast/Reassemble.h b/protocols/ace/RMCast/Reassemble.h deleted file mode 100644 index cffa4fdc359..00000000000 --- a/protocols/ace/RMCast/Reassemble.h +++ /dev/null @@ -1,42 +0,0 @@ -// file : ace/RMCast/Reassemble.h -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#ifndef ACE_RMCAST_REASSEMBLE_H -#define ACE_RMCAST_REASSEMBLE_H - -#include "ace/Hash_Map_Manager.h" - -#include "Stack.h" -#include "Protocol.h" -#include "Bits.h" -#include "Parameters.h" - -namespace ACE_RMCast -{ - class Reassemble : public Element - { - public: - Reassemble (Parameters const& params); - - public: - virtual void - recv (Message_ptr m); - - private: - Parameters const& params_; - - typedef - ACE_Hash_Map_Manager_Ex<Address, - Data_ptr, - AddressHasher, - ACE_Equal_To<Address>, - ACE_Null_Mutex> - Map; - - Map map_; - }; -} - - -#endif // ACE_RMCAST_REASSEMBLE_H diff --git a/protocols/ace/RMCast/Retransmit.cpp b/protocols/ace/RMCast/Retransmit.cpp deleted file mode 100644 index b968908f82b..00000000000 --- a/protocols/ace/RMCast/Retransmit.cpp +++ /dev/null @@ -1,158 +0,0 @@ -// file : ace/RMCast/Retransmit.cpp -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#include "ace/Time_Value.h" // ACE_Time_Value -#include "ace/OS_NS_stdlib.h" // abort -#include "ace/OS_NS_sys_time.h" // gettimeofday - -#include "Retransmit.h" - -/* -#include <iostream> -using std::cerr; -using std::endl; -*/ - -namespace ACE_RMCast -{ - Retransmit:: - Retransmit (Parameters const& params) - : params_ (params), - cond_ (mutex_), - stop_ (false) - { - } - - void Retransmit:: - out_start (Out_Element* out) - { - Element::out_start (out); - - tracker_mgr_.spawn (track_thunk, this); - } - - void Retransmit:: - out_stop () - { - { - Lock l (mutex_); - stop_ = true; - cond_.signal (); - } - - tracker_mgr_.wait (); - - Element::out_stop (); - } - - void Retransmit:: - send (Message_ptr m) - { - if (m->find (Data::id) != 0) - { - SN const* sn = static_cast<SN const*> (m->find (SN::id)); - - Lock l (mutex_); - queue_.bind (sn->num (), Descr (m->clone ())); - } - - out_->send (m); - } - - void Retransmit:: - recv (Message_ptr m) - { - if (NAK const* nak = static_cast<NAK const*> (m->find (NAK::id))) - { - Address to (static_cast<To const*> (m->find (To::id))->address ()); - - if (nak->address () == to) - { - Lock l (mutex_); - - for (NAK::iterator j (const_cast<NAK*> (nak)->begin ()); - !j.done (); - j.advance ()) - { - u64* psn; - j.next (psn); - - Message_ptr m; - - Queue::ENTRY* pair; - - if (queue_.find (*psn, pair) == 0) - { - //cerr << 5 << "PRTM " << to << " " << pair->ext_id_ << endl; - - m = pair->int_id_.message (); - - pair->int_id_.reset (); - } - else - { - //cerr << 4 << "message " << *psn << " not available" << endl; - - m = Message_ptr (new Message); - m->add (Profile_ptr (new SN (*psn))); - m->add (Profile_ptr (new NoData)); - } - - out_->send (m); - } - } - } - - in_->recv (m); - } - - ACE_THR_FUNC_RETURN Retransmit:: - track_thunk (void* obj) - { - reinterpret_cast<Retransmit*> (obj)->track (); - return 0; - } - - void Retransmit:: - track () - { - while (true) - { - Lock l (mutex_); - - for (Queue::iterator i (queue_); !i.done ();) - { - if ((*i).int_id_.inc () >= params_.retention_timeout ()) - { - u64 sn ((*i).ext_id_); - i.advance (); - queue_.unbind (sn); - } - else - { - i.advance (); - } - } - - // Go to sleep but watch for "manual cancellation" request. - // - ACE_Time_Value time (ACE_OS::gettimeofday ()); - time += params_.tick (); - - while (!stop_) - { - if (cond_.wait (&time) == -1) - { - if (errno != ETIME) - ACE_OS::abort (); - else - break; - } - } - - if (stop_) - break; - } - } -} diff --git a/protocols/ace/RMCast/Retransmit.h b/protocols/ace/RMCast/Retransmit.h deleted file mode 100644 index 0a3a8f72bd7..00000000000 --- a/protocols/ace/RMCast/Retransmit.h +++ /dev/null @@ -1,98 +0,0 @@ -// file : ace/RMCast/Retransmit.h -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#ifndef ACE_RMCAST_RETRANSMIT_H -#define ACE_RMCAST_RETRANSMIT_H - -#include "ace/Hash_Map_Manager.h" -#include "ace/Thread_Manager.h" - -#include "Stack.h" -#include "Protocol.h" -#include "Bits.h" -#include "Parameters.h" - -namespace ACE_RMCast -{ - class Retransmit : public Element - { - public: - Retransmit (Parameters const& params); - - virtual void - out_start (Out_Element* out); - - virtual void - out_stop (); - - public: - virtual void - send (Message_ptr m); - - virtual void - recv (Message_ptr m); - - private: - struct Descr - { - // Shouldn't be available but ACE_Hash_Map needs it. - // - Descr () - : msg_ (), count_ (0) - { - } - - Descr (Message_ptr msg) - : msg_ (msg), count_ (0) - { - } - - unsigned long - inc () - { - return ++count_; - } - - void - reset () - { - count_ = 0; - } - - Message_ptr - message () const - { - return msg_->clone (); - } - - private: - Message_ptr msg_; - unsigned long count_; - }; - - typedef - ACE_Hash_Map_Manager<u64, Descr, ACE_Null_Mutex> - Queue; - - private: - void - track (); - - static ACE_THR_FUNC_RETURN - track_thunk (void* obj); - - private: - Parameters const& params_; - - Queue queue_; - Mutex mutex_; - Condition cond_; - - bool stop_; - ACE_Thread_Manager tracker_mgr_; - }; -} - - -#endif // ACE_RMCAST_RETRANSMIT_H diff --git a/protocols/ace/RMCast/Simulator.cpp b/protocols/ace/RMCast/Simulator.cpp deleted file mode 100644 index 8b024d1d299..00000000000 --- a/protocols/ace/RMCast/Simulator.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// file : ace/RMCast/Simulator.cpp -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#include "Simulator.h" - -namespace ACE_RMCast -{ - Simulator:: - Simulator () - { - srand (time (0)); - } - - void Simulator:: - send (Message_ptr m) - { - // Note: Simulator may work in unpredictable ways mainly due - // to the "reliable loopback" mechanism. - // - out_->send (m); - return; - - int r (rand ()); - - if ((r % 3) == 0) return; - - Lock l (mutex_); - - if (hold_.get ()) - { - out_->send (m); - out_->send (hold_); - } - else - { - hold_ = m; - } - } -} diff --git a/protocols/ace/RMCast/Simulator.h b/protocols/ace/RMCast/Simulator.h deleted file mode 100644 index 27b227f488b..00000000000 --- a/protocols/ace/RMCast/Simulator.h +++ /dev/null @@ -1,30 +0,0 @@ -// file : ace/RMCast/Simulator.h -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#ifndef ACE_RMCAST_SIMULATOR_H -#define ACE_RMCAST_SIMULATOR_H - -#include "Stack.h" -#include "Protocol.h" -#include "Bits.h" - -namespace ACE_RMCast -{ - class Simulator : public Element - { - public: - Simulator (); - - public: - virtual void - send (Message_ptr m); - - private: - Message_ptr hold_; - Mutex mutex_; - }; -} - - -#endif // ACE_RMCAST_SIMULATOR_H diff --git a/protocols/ace/RMCast/Socket.cpp b/protocols/ace/RMCast/Socket.cpp deleted file mode 100644 index 8f433f7c6ed..00000000000 --- a/protocols/ace/RMCast/Socket.cpp +++ /dev/null @@ -1,394 +0,0 @@ -// file : ace/RMCast/Socket.cpp -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#include "ace/OS_Memory.h" -#include "ace/OS_NS_stdio.h" -#include "ace/OS_NS_stdlib.h" -#include "ace/OS_NS_string.h" -#include "ace/OS_NS_unistd.h" -#include "ace/OS_NS_sys_time.h" // gettimeofday - -#include "ace/Unbounded_Queue.h" - -#include "ace/Pipe.h" - -#include "Stack.h" -#include "Protocol.h" -#include "Bits.h" - -#include "Fragment.h" -#include "Reassemble.h" -#include "Acknowledge.h" -#include "Retransmit.h" -#include "Flow.h" -#include "Link.h" - -#include "Socket.h" - -/* -#include <iostream> -using std::cerr; -using std::endl; -*/ - -namespace ACE_RMCast -{ - class Socket_Impl : protected Element - { - public: - ~Socket_Impl (); - - Socket_Impl (Address const& a, bool loop, Parameters const& params); - - public: - void - send_ (void const* buf, size_t s); - - ssize_t - recv_ (void* buf, - size_t s, - ACE_Time_Value const* timeout, - ACE_INET_Addr* from); - - ssize_t - size_ (ACE_Time_Value const* timeout); - - ACE_HANDLE - get_handle_ (); - - private: - virtual void - recv (Message_ptr m); - - private: - bool loop_; - Parameters const params_; - - Mutex mutex_; - Condition cond_; - - ACE_Unbounded_Queue<Message_ptr> queue_; - - ACE_Pipe signal_pipe_; - - ACE_Auto_Ptr<Fragment> fragment_; - ACE_Auto_Ptr<Reassemble> reassemble_; - ACE_Auto_Ptr<Acknowledge> acknowledge_; - ACE_Auto_Ptr<Retransmit> retransmit_; - ACE_Auto_Ptr<Flow> flow_; - ACE_Auto_Ptr<Link> link_; - }; - - - Socket_Impl:: - Socket_Impl (Address const& a, bool loop, Parameters const& params) - : loop_ (loop), - params_ (params), - cond_ (mutex_) - { - fragment_.reset (new Fragment (params_)); - reassemble_.reset (new Reassemble (params_)); - acknowledge_.reset (new Acknowledge (params_)); - retransmit_.reset (new Retransmit (params_)); - flow_.reset (new Flow (params_)); - link_.reset (new Link (a, params_)); - - // Start IN stack from top to bottom. - // - in_start (0); - fragment_->in_start (this); - reassemble_->in_start (fragment_.get ()); - acknowledge_->in_start (reassemble_.get ()); - retransmit_->in_start (acknowledge_.get ()); - flow_->in_start (retransmit_.get ()); - link_->in_start (flow_.get ()); - - // Start OUT stack from bottom up. - // - link_->out_start (0); - flow_->out_start (link_.get ()); - retransmit_->out_start (flow_.get ()); - acknowledge_->out_start (retransmit_.get ()); - reassemble_->out_start (acknowledge_.get ()); - fragment_->out_start (reassemble_.get ()); - out_start (fragment_.get ()); - } - - Socket_Impl:: - ~Socket_Impl () - { - // Stop OUT stack from top to bottom. - // - out_stop (); - fragment_->out_stop (); - reassemble_->out_stop (); - acknowledge_->out_stop (); - retransmit_->out_stop (); - flow_->out_stop (); - link_->out_stop (); - - // Stop IN stack from bottom up. - // - link_->in_stop (); - flow_->in_stop (); - retransmit_->in_stop (); - acknowledge_->in_stop (); - reassemble_->in_stop (); - fragment_->in_stop (); - in_stop (); - } - - - void Socket_Impl:: - send_ (void const* buf, size_t s) - { - Message_ptr m (new Message); - - m->add (Profile_ptr (new Data (buf, s))); - - // Qualification is for VC6 and VxWorks. - // - Element::send (m); - } - - ssize_t Socket_Impl:: - recv_ (void* buf, - size_t s, - ACE_Time_Value const* timeout, - ACE_INET_Addr* from) - { - ACE_Time_Value abs_time; - - if (timeout) - abs_time = ACE_OS::gettimeofday () + *timeout; - - Lock l (mutex_); - - while (queue_.is_empty ()) - { - if (timeout) - { - if (cond_.wait (&abs_time) != -1) - break; - } - else - { - if (cond_.wait () != -1) - break; - } - - return -1; // errno is already set - } - - - Message_ptr m; - - if (queue_.dequeue_head (m) == -1) - ACE_OS::abort (); - - - if (queue_.is_empty ()) - { - // Remove data from the pipe. - // - if (signal_pipe_.read_handle () != ACE_INVALID_HANDLE) - { - char c; - - if (signal_pipe_.recv (&c, 1) != 1) - { - ACE_OS::perror ("read: "); - ACE_OS::abort (); - } - } - } - - if (from) - *from = static_cast<From const*> (m->find (From::id))->address (); - - if (m->find (NoData::id) != 0) - { - errno = ENOENT; - return -1; - } - - Data const* d = static_cast<Data const*>(m->find (Data::id)); - - ssize_t r (static_cast<ssize_t> (d->size () < s ? d->size () : s)); - - ACE_OS::memcpy (buf, d->buf (), r); - - return r; - } - - ssize_t Socket_Impl:: - size_ (ACE_Time_Value const* timeout) - { - ACE_Time_Value abs_time; - - if (timeout) - abs_time = ACE_OS::gettimeofday () + *timeout; - - Lock l (mutex_); - - while (queue_.is_empty ()) - { - if (timeout) - { - if (cond_.wait (&abs_time) != -1) - break; - } - else - { - if (cond_.wait () != -1) - break; - } - - return -1; // errno is already set - } - - // I can't get the head of the queue without actually dequeuing - // the element. - // - Message_ptr m; - - if (queue_.dequeue_head (m) == -1) - ACE_OS::abort (); - - if (queue_.enqueue_head (m) == -1) - ACE_OS::abort (); - - if (m->find (NoData::id) != 0) - { - errno = ENOENT; - return -1; - } - - Data const* d = static_cast<Data const*>(m->find (Data::id)); - - return static_cast<ssize_t> (d->size ()); - } - - ACE_HANDLE Socket_Impl:: - get_handle_ () - { - if (signal_pipe_.read_handle () == ACE_INVALID_HANDLE) - { - signal_pipe_.open (); - } - - return signal_pipe_.read_handle (); - } - - - void Socket_Impl:: - recv (Message_ptr m) - { - if (m->find (Data::id) != 0 || m->find (NoData::id) != 0) - { - if (!loop_) - { - Address to (static_cast<To const*> (m->find (To::id))->address ()); - - Address from ( - static_cast<From const*> (m->find (From::id))->address ()); - - if (to == from) - return; - } - - Lock l (mutex_); - - //if (queue_.size () != 0) - // cerr << "recv socket queue size: " << queue_.size () << endl; - - bool signal (queue_.is_empty ()); - - queue_.enqueue_tail (m); - - if (signal) - { - // Also write to the pipe. - if (signal_pipe_.write_handle () != ACE_INVALID_HANDLE) - { - char c; - - if (signal_pipe_.send (&c, 1) != 1) - { - // perror ("write: "); - ACE_OS::abort (); - } - } - - cond_.signal (); - } - } - } - - - // Socket - // - // - Socket:: - ~Socket () - { - } - - Socket:: - Socket (Address const& a, bool loop, Parameters const& params) - : impl_ (new Socket_Impl (a, loop, params)) - { - } - - void Socket:: - send (void const* buf, size_t s) - { - impl_->send_ (buf, s); - } - - ssize_t Socket:: - recv (void* buf, size_t s) - { - return impl_->recv_ (buf, s, 0, 0); - } - - ssize_t Socket:: - recv (void* buf, size_t s, ACE_INET_Addr& from) - { - return impl_->recv_ (buf, s, 0, &from); - } - - ssize_t Socket:: - recv (void* buf, size_t s, ACE_Time_Value const& timeout) - { - return impl_->recv_ (buf, s, &timeout, 0); - } - - ssize_t Socket:: - recv (void* buf, - size_t s, - ACE_Time_Value const& timeout, - ACE_INET_Addr& from) - { - return impl_->recv_ (buf, s, &timeout, &from); - } - - ssize_t Socket:: - size () - { - return impl_->size_ (0); - } - - ssize_t Socket:: - size (ACE_Time_Value const& timeout) - { - return impl_->size_ (&timeout); - } - - ACE_HANDLE Socket:: - get_handle () - { - return impl_->get_handle_ (); - } -} diff --git a/protocols/ace/RMCast/Socket.h b/protocols/ace/RMCast/Socket.h deleted file mode 100644 index 3468df15d4d..00000000000 --- a/protocols/ace/RMCast/Socket.h +++ /dev/null @@ -1,99 +0,0 @@ -// file : ace/RMCast/Socket.h -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#ifndef ACE_RMCAST_SOCKET_H -#define ACE_RMCAST_SOCKET_H - -#include "ace/config-lite.h" // ACE_HANDLE - -#include "ace/Auto_Ptr.h" -#include "ace/INET_Addr.h" -#include "ace/Time_Value.h" - -#include "RMCast_Export.h" -#include "Parameters.h" - - -namespace ACE_RMCast -{ - class Socket_Impl; - - class ACE_RMCast_Export Socket - { - public: - virtual - ~Socket (); - - // If 'simulator' is 'true' then internal message loss and - // reordering simulator (on IPv4 level) is turned on. - // - Socket (ACE_INET_Addr const& a, - bool loop = true, - Parameters const& params = Parameters ()); - - public: - virtual void - send (void const* buf, size_t s); - - - // Block if message is not available. Upon successful completion - // return the next message. Otherwise return -1 and errno set to - // indicate the error. ENOENT indicates that the sender does not - // retain the data for this message anymore. - // - virtual ssize_t - recv (void* buf, size_t s); - - virtual ssize_t - recv (void* buf, size_t s, ACE_INET_Addr& from); - - - // Block for up to <timeout> until message is available. Upon - // successful completion return the next message. Otherwise - // return -1 and errno set to indicate the error. ETIME indicates - // that the operation timed out. ENOENT indicates that the sender - // does not retain the data for this message anymore. - // - virtual ssize_t - recv (void* buf, size_t s, ACE_Time_Value const& timeout); - - virtual ssize_t - recv (void* buf, - size_t s, - ACE_Time_Value const& timeout, - ACE_INET_Addr& from); - - - // Block if message is not available. Upon successful completion - // return the size of the next message. Otherwise return -1 and - // errno set to indicate the error. ENOENT indicates that the - // sender does not retain the data for this message anymore. - // - virtual ssize_t - size (); - - - // Block for up to <timeout> until message is available. Upon - // successful completion return the size of the next message. - // Otherwise return -1 and errno set to indicate the error. - // ETIME indicates that the operation timed out. ENOENT indicates - // that the sender does not retain the data for this message anymore. - // - virtual ssize_t - size (ACE_Time_Value const& timeout); - - public: - // Reactor interface. Note that the handle returned by get_handle() - // is for signalling purposes only. - // - ACE_HANDLE - get_handle (); - - private: - ACE_Auto_Ptr<Socket_Impl> impl_; - }; -} - - -#endif // ACE_RMCAST_SOCKET_H diff --git a/protocols/ace/RMCast/Stack.cpp b/protocols/ace/RMCast/Stack.cpp deleted file mode 100644 index aa62558b4c9..00000000000 --- a/protocols/ace/RMCast/Stack.cpp +++ /dev/null @@ -1,73 +0,0 @@ -// file : ace/RMCast/Stack.cpp -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#include "Stack.h" - -namespace ACE_RMCast -{ - // Out_Element - // - - Out_Element:: - ~Out_Element () - { - } - - Out_Element:: - Out_Element () - : out_ (0) - { - } - - void Out_Element:: - out_start (Out_Element* out) - { - out_ = out; - } - - void Out_Element:: - send (Message_ptr m) - { - if (out_) out_->send (m); - } - - void Out_Element:: - out_stop () - { - out_ = 0; - } - - - // In_Element - // - - In_Element:: - ~In_Element () - { - } - - In_Element:: - In_Element () - : in_ (0) - { - } - - void In_Element:: - in_start (In_Element* in) - { - in_ = in; - } - - void In_Element:: - recv (Message_ptr m) - { - if (in_) in_->recv (m); - } - - void In_Element:: - in_stop () - { - in_ = 0; - } -} diff --git a/protocols/ace/RMCast/Stack.h b/protocols/ace/RMCast/Stack.h deleted file mode 100644 index 322fe0dc501..00000000000 --- a/protocols/ace/RMCast/Stack.h +++ /dev/null @@ -1,59 +0,0 @@ -// file : ace/RMCast/Stack.h -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#ifndef ACE_RMCAST_STACK_H -#define ACE_RMCAST_STACK_H - -#include "Protocol.h" - -namespace ACE_RMCast -{ - struct Out_Element - { - virtual - ~Out_Element (); - - Out_Element (); - - virtual void - out_stop (); - - virtual void - out_start (Out_Element* out); - - virtual void - send (Message_ptr m); - - protected: - Out_Element* out_; - }; - - - struct In_Element - { - virtual - ~In_Element (); - - In_Element (); - - virtual void - in_stop (); - - virtual void - in_start (In_Element* in); - - virtual void - recv (Message_ptr m); - - protected: - In_Element* in_; - }; - - - struct Element : In_Element, Out_Element - { - }; -} - -#endif // ACE_RMCAST_STACK_H diff --git a/protocols/ace/RMCast/Template_Instantiations.cpp b/protocols/ace/RMCast/Template_Instantiations.cpp deleted file mode 100644 index 262a8e5b36a..00000000000 --- a/protocols/ace/RMCast/Template_Instantiations.cpp +++ /dev/null @@ -1,128 +0,0 @@ -// $Id$ - -// Note: this file is here only until support for explicit template -// instantiations is removed from ACE, after ACE 5.5 is released. - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) || \ - defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) - -# include "ace/Array_Base.h" -# include "ace/Condition_T.h" -# include "ace/Functor_T.h" -# include "ace/Hash_Map_Manager.h" -# include "ace/INET_Addr.h" -# include "ace/Refcounted_Auto_Ptr.h" -# include "ace/Thread_Mutex.h" -# include "ace/Unbounded_Queue.h" -# include "ace/Vector_T.h" - -# include "Acknowledge.h" -# include "Protocol.h" -# include "Retransmit.h" - -#endif - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) - -template class ACE_Array_Base<unsigned char>; -template class ACE_Array_Base<ACE_RMCast::u64>; -template class ACE_Array_Base<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Null_Mutex> >; -template class ACE_Array_Base<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Thread_Mutex> >; -template class ACE_Condition<ACE_Thread_Mutex>; -template class ACE_Equal_To<ACE_INET_Addr>; -template class ACE_Hash_Map_Const_Iterator_Base_Ex<unsigned short, ACE_Refcounted_Auto_Ptr<ACE_RMCast::Profile, ACE_Thread_Mutex>, ACE_Hash<unsigned short>, ACE_Equal_To<unsigned short>, ACE_Null_Mutex>; -template class ACE_Hash_Map_Const_Iterator_Base_Ex<ACE_RMCast::u64, ACE_RMCast::Acknowledge::Descr, ACE_Hash<ACE_RMCast::u64>, ACE_Equal_To<ACE_RMCast::u64>, ACE_Null_Mutex>; -template class ACE_Hash_Map_Const_Iterator_Base_Ex<ACE_INET_Addr, ACE_RMCast::u64, ACE_RMCast::AddressHasher, ACE_Equal_To<ACE_INET_Addr>, ACE_Null_Mutex>; -template class ACE_Hash_Map_Iterator_Base_Ex<ACE_INET_Addr, ACE_RMCast::Acknowledge::Queue, ACE_RMCast::AddressHasher, ACE_Equal_To<ACE_INET_Addr>, ACE_Null_Mutex>; -template class ACE_Hash_Map_Iterator_Base_Ex<ACE_RMCast::u64, ACE_RMCast::Acknowledge::Descr, ACE_Hash<ACE_RMCast::u64>, ACE_Equal_To<ACE_RMCast::u64>, ACE_Null_Mutex>; -template class ACE_Hash_Map_Iterator_Base_Ex<ACE_RMCast::u64, ACE_RMCast::Retransmit::Descr, ACE_Hash<ACE_RMCast::u64>, ACE_Equal_To<ACE_RMCast::u64>, ACE_Null_Mutex>; -template class ACE_Hash_Map_Entry<ACE_RMCast::u64, ACE_RMCast::Acknowledge::Descr>; -template class ACE_Hash_Map_Entry<ACE_RMCast::u64, ACE_RMCast::Retransmit::Descr>; -template class ACE_Hash_Map_Entry<unsigned short, ACE_Refcounted_Auto_Ptr<ACE_RMCast::Profile, ACE_Thread_Mutex> >; -template class ACE_Hash_Map_Entry<ACE_INET_Addr, ACE_RMCast::u64>; -template class ACE_Hash_Map_Entry<ACE_INET_Addr, ACE_Refcounted_Auto_Ptr<ACE_RMCast::Data, ACE_Thread_Mutex> >; -template class ACE_Hash_Map_Entry<ACE_INET_Addr, ACE_RMCast::Acknowledge::Queue>; -template class ACE_Hash_Map_Manager<ACE_RMCast::u64, ACE_RMCast::Acknowledge::Descr, ACE_Null_Mutex>; -template class ACE_Hash_Map_Manager<ACE_RMCast::u64, ACE_RMCast::Retransmit::Descr, ACE_Null_Mutex>; -template class ACE_Hash_Map_Manager<unsigned short, ACE_Refcounted_Auto_Ptr<ACE_RMCast::Profile, ACE_Thread_Mutex>, ACE_Null_Mutex>; -template class ACE_Hash_Map_Manager_Ex<ACE_INET_Addr, ACE_Refcounted_Auto_Ptr<ACE_RMCast::Data, ACE_Thread_Mutex>, ACE_RMCast::AddressHasher, ACE_Equal_To<ACE_INET_Addr>, ACE_Null_Mutex>; -template class ACE_Hash_Map_Manager_Ex<ACE_INET_Addr, ACE_RMCast::Acknowledge::Queue, ACE_RMCast::AddressHasher, ACE_Equal_To<ACE_INET_Addr>, ACE_Null_Mutex>; -template class ACE_Hash_Map_Manager_Ex<ACE_INET_Addr, ACE_RMCast::u64, ACE_RMCast::AddressHasher, ACE_Equal_To<ACE_INET_Addr>, ACE_Null_Mutex>; -template class ACE_Hash_Map_Manager_Ex<ACE_RMCast::u64, ACE_RMCast::Acknowledge::Descr, ACE_Hash<ACE_RMCast::u64>, ACE_Equal_To<ACE_RMCast::u64>, ACE_Null_Mutex>; -template class ACE_Hash_Map_Manager_Ex<ACE_RMCast::u64, ACE_RMCast::Retransmit::Descr, ACE_Hash<ACE_RMCast::u64>, ACE_Equal_To<ACE_RMCast::u64>, ACE_Null_Mutex>; -template class ACE_Hash_Map_Manager_Ex<unsigned short, ACE_Refcounted_Auto_Ptr<ACE_RMCast::Profile, ACE_Thread_Mutex>, ACE_Hash<unsigned short>, ACE_Equal_To<unsigned short>, ACE_Null_Mutex>; -template class ACE_Node<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Null_Mutex> >; -template class ACE_Node<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Thread_Mutex> >; -template class ACE_Refcounted_Auto_Ptr<ACE_RMCast::Data, ACE_Thread_Mutex>; -template class ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Null_Mutex>; -template class ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Thread_Mutex>; -template class ACE_Refcounted_Auto_Ptr<ACE_RMCast::NAK, ACE_Thread_Mutex>; -template class ACE_Refcounted_Auto_Ptr<ACE_RMCast::NRTM, ACE_Thread_Mutex>; -template class ACE_Refcounted_Auto_Ptr<ACE_RMCast::Profile, ACE_Thread_Mutex>; -template class ACE_Unbounded_Queue<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Null_Mutex> >; -template class ACE_Unbounded_Queue<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Thread_Mutex> >; -template class ACE_Unbounded_Queue_Iterator<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Null_Mutex> >; -template class ACE_Unbounded_Queue_Iterator<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Thread_Mutex> >; -template class ACE_Vector<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Null_Mutex> >; -template class ACE_Vector<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Thread_Mutex> >; -template class ACE_Vector<unsigned char>; -template class ACE_Vector<ACE_RMCast::u64>; -template class ACE_Vector_Iterator<unsigned char>; -template class ACE_Vector_Iterator<ACE_RMCast::u64>; -template class ACE_Vector_Iterator<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Null_Mutex> >; -template class ACE_Vector_Iterator<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Thread_Mutex> >; - -#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) - -# pragma instantiate class ACE_Array_Base<unsigned char> -# pragma instantiate class ACE_Array_Base<ACE_RMCast::u64> -# pragma instantiate class ACE_Array_Base<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Null_Mutex> > -# pragma instantiate class ACE_Array_Base<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Thread_Mutex> > -# pragma instantiate class ACE_Condition<ACE_Thread_Mutex> -# pragma instantiate class ACE_Equal_To<ACE_INET_Addr> -# pragma instantiate class ACE_Hash_Map_Const_Iterator_Base_Ex<ACE_RMCast::u64, ACE_RMCast::Acknowledge::Descr, ACE_Hash<ACE_RMCast::u64>, ACE_Equal_To<ACE_RMCast::u64>, ACE_Null_Mutex> -# pragma instantiate class ACE_Hash_Map_Const_Iterator_Base_Ex<unsigned short, ACE_Refcounted_Auto_Ptr<ACE_RMCast::Profile, ACE_Thread_Mutex>, ACE_Hash<unsigned short>, ACE_Equal_To<unsigned short>, ACE_Null_Mutex> -# pragma instantiate class ACE_Hash_Map_Const_Iterator_Base_Ex<ACE_INET_Addr, ACE_RMCast::u64, ACE_RMCast::AddressHasher, ACE_Equal_To<ACE_INET_Addr>, ACE_Null_Mutex> -# pragma instantiate class ACE_Hash_Map_Iterator_Base_Ex<ACE_INET_Addr, ACE_RMCast::Acknowledge::Queue, ACE_RMCast::AddressHasher, ACE_Equal_To<ACE_INET_Addr>, ACE_Null_Mutex> -# pragma instantiate class ACE_Hash_Map_Iterator_Base_Ex<ACE_RMCast::u64, ACE_RMCast::Acknowledge::Descr, ACE_Hash<ACE_RMCast::u64>, ACE_Equal_To<ACE_RMCast::u64>, ACE_Null_Mutex> -# pragma instantiate class ACE_Hash_Map_Iterator_Base_Ex<ACE_RMCast::u64, ACE_RMCast::Retransmit::Descr, ACE_Hash<ACE_RMCast::u64>, ACE_Equal_To<ACE_RMCast::u64>, ACE_Null_Mutex> -# pragma instantiate class ACE_Hash_Map_Entry<ACE_RMCast::u64, ACE_RMCast::Acknowledge::Descr> -# pragma instantiate class ACE_Hash_Map_Entry<ACE_RMCast::u64, ACE_RMCast::Retransmit::Descr> -# pragma instantiate class ACE_Hash_Map_Entry<unsigned short, ACE_Refcounted_Auto_Ptr<ACE_RMCast::Profile, ACE_Thread_Mutex> > -# pragma instantiate class ACE_Hash_Map_Entry<ACE_INET_Addr, ACE_RMCast::u64> -# pragma instantiate class ACE_Hash_Map_Entry<ACE_INET_Addr, ACE_Refcounted_Auto_Ptr<ACE_RMCast::Data, ACE_Thread_Mutex> > -# pragma instantiate class ACE_Hash_Map_Entry<ACE_INET_Addr, ACE_RMCast::Acknowledge::Queue> -# pragma instantiate class ACE_Hash_Map_Manager<ACE_RMCast::u64, ACE_RMCast::Acknowledge::Descr, ACE_Null_Mutex> -# pragma instantiate class ACE_Hash_Map_Manager<ACE_RMCast::u64, ACE_RMCast::Retransmit::Descr, ACE_Null_Mutex> -# pragma instantiate class ACE_Hash_Map_Manager<unsigned short, ACE_Refcounted_Auto_Ptr<ACE_RMCast::Profile, ACE_Thread_Mutex>, ACE_Null_Mutex> -# pragma instantiate class ACE_Hash_Map_Manager_Ex<ACE_INET_Addr, ACE_Refcounted_Auto_Ptr<ACE_RMCast::Data, ACE_Thread_Mutex>, ACE_RMCast::AddressHasher, ACE_Equal_To<ACE_INET_Addr>, ACE_Null_Mutex> -# pragma instantiate class ACE_Hash_Map_Manager_Ex<ACE_INET_Addr, ACE_RMCast::Acknowledge::Queue, ACE_RMCast::AddressHasher, ACE_Equal_To<ACE_INET_Addr>, ACE_Null_Mutex> -# pragma instantiate class ACE_Hash_Map_Manager_Ex<ACE_INET_Addr, ACE_RMCast::u64, ACE_RMCast::AddressHasher, ACE_Equal_To<ACE_INET_Addr>, ACE_Null_Mutex> -# pragma instantiate class ACE_Hash_Map_Manager_Ex<ACE_RMCast::u64, ACE_RMCast::Acknowledge::Descr, ACE_Hash<ACE_RMCast::u64>, ACE_Equal_To<ACE_RMCast::u64>, ACE_Null_Mutex> -# pragma instantiate class ACE_Hash_Map_Manager_Ex<ACE_RMCast::u64, ACE_RMCast::Retransmit::Descr, ACE_Hash<ACE_RMCast::u64>, ACE_Equal_To<ACE_RMCast::u64>, ACE_Null_Mutex> -# pragma instantiate class ACE_Hash_Map_Manager_Ex<unsigned short, ACE_Refcounted_Auto_Ptr<ACE_RMCast::Profile, ACE_Thread_Mutex>, ACE_Hash<unsigned short>, ACE_Equal_To<unsigned short>, ACE_Null_Mutex> -# pragma instantiate class ACE_Node<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Null_Mutex> > -# pragma instantiate class ACE_Node<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Thread_Mutex> > -# pragma instantiate class ACE_Refcounted_Auto_Ptr<ACE_RMCast::Data, ACE_Thread_Mutex> -# pragma instantiate class ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Null_Mutex> -# pragma instantiate class ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Thread_Mutex> -# pragma instantiate class ACE_Refcounted_Auto_Ptr<ACE_RMCast::NAK, ACE_Thread_Mutex> -# pragma instantiate class ACE_Refcounted_Auto_Ptr<ACE_RMCast::NRTM, ACE_Thread_Mutex> -# pragma instantiate class ACE_Refcounted_Auto_Ptr<ACE_RMCast::Profile, ACE_Thread_Mutex> -# pragma instantiate class ACE_Unbounded_Queue<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Null_Mutex> > -# pragma instantiate class ACE_Unbounded_Queue<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Thread_Mutex> > -# pragma instantiate class ACE_Unbounded_Queue_Iterator<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Null_Mutex> > -# pragma instantiate class ACE_Unbounded_Queue_Iterator<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Thread_Mutex> > -# pragma instantiate class ACE_Vector<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Null_Mutex> > -# pragma instantiate class ACE_Vector<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Thread_Mutex> > -# pragma instantiate class ACE_Vector<unsigned char> -# pragma instantiate class ACE_Vector<ACE_RMCast::u64> -# pragma instantiate class ACE_Vector_Iterator<unsigned char> -# pragma instantiate class ACE_Vector_Iterator<ACE_RMCast::u64> -# pragma instantiate class ACE_Vector_Iterator<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Null_Mutex> > -# pragma instantiate class ACE_Vector_Iterator<ACE_Refcounted_Auto_Ptr<ACE_RMCast::Message, ACE_Thread_Mutex> > - -#elif defined (__HP_aCC) -// Make aC++ stop complaining about an empty translation unit -static int shut_up_aCC = 0; -#endif diff --git a/protocols/ace/TMCast/ACE_TMCast.pc.in b/protocols/ace/TMCast/ACE_TMCast.pc.in deleted file mode 100644 index a56956f81b2..00000000000 --- a/protocols/ace/TMCast/ACE_TMCast.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: ACE_TMCast -Description: ACE Transaction Multicast Library -Requires: ACE -Version: @VERSION@ -Libs: -L${libdir} -lACE_TMCast -Cflags: -I${includedir} diff --git a/protocols/ace/TMCast/Export.hpp b/protocols/ace/TMCast/Export.hpp deleted file mode 100644 index bf04f7ee114..00000000000 --- a/protocols/ace/TMCast/Export.hpp +++ /dev/null @@ -1,58 +0,0 @@ - -// -*- C++ -*- -// $Id$ -// Definition for Win32 Export directives. -// This file is generated automatically by generate_export_file.pl ACE_TMCast -// ------------------------------ -#ifndef TMCAST_EXPORT_H -#define TMCAST_EXPORT_H - -#include "ace/config-all.h" - -#if defined (ACE_AS_STATIC_LIBS) && !defined (TMCAST_HAS_DLL) -# define TMCAST_HAS_DLL 0 -#endif /* ACE_AS_STATIC_LIBS && TMCAST_HAS_DLL */ - -#if !defined (TMCAST_HAS_DLL) -#define TMCAST_HAS_DLL 1 -#endif /* ! TMCAST_HAS_DLL */ - -#if defined (TMCAST_HAS_DLL) && (TMCAST_HAS_DLL == 1) -# if defined (TMCAST_BUILD_DLL) -# define ACE_TMCast_Export ACE_Proper_Export_Flag -# define TMCAST_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T) -# define TMCAST_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) -# else /* TMCAST_BUILD_DLL */ -# define ACE_TMCast_Export ACE_Proper_Import_Flag -# define TMCAST_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T) -# define TMCAST_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) -# endif /* TMCAST_BUILD_DLL */ -#else /* TMCAST_HAS_DLL == 1 */ -# define ACE_TMCast_Export -# define TMCAST_SINGLETON_DECLARATION(T) -# define TMCAST_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) -#endif /* TMCAST_HAS_DLL == 1 */ - -// Set TMCAST_NTRACE = 0 to turn on library specific tracing even if -// tracing is turned off for ACE. -#if !defined (TMCAST_NTRACE) -# if (ACE_NTRACE == 1) -# define TMCAST_NTRACE 1 -# else /* (ACE_NTRACE == 1) */ -# define TMCAST_NTRACE 0 -# endif /* (ACE_NTRACE == 1) */ -#endif /* !TMCAST_NTRACE */ - -#if (TMCAST_NTRACE == 1) -# define TMCAST_TRACE(X) -#else /* (TMCAST_NTRACE == 1) */ -# if !defined (ACE_HAS_TRACE) -# define ACE_HAS_TRACE -# endif /* ACE_HAS_TRACE */ -# define TMCAST_TRACE(X) ACE_TRACE_IMPL(X) -# include "ace/Trace.h" -#endif /* (TMCAST_NTRACE == 1) */ - -#endif /* TMCAST_EXPORT_H */ - -// End of auto generated file. diff --git a/protocols/ace/TMCast/FaultDetector.hpp b/protocols/ace/TMCast/FaultDetector.hpp deleted file mode 100644 index 49ffcdd174c..00000000000 --- a/protocols/ace/TMCast/FaultDetector.hpp +++ /dev/null @@ -1,45 +0,0 @@ -// file : ACE_TMCast/FaultDetector.hpp -// author : Boris Kolpackov <boris@dre.vanderbilt.edu> -// cvs-id : $Id$ - -#include "Protocol.hpp" - -namespace ACE_TMCast -{ - class FaultDetector - { - public: - FaultDetector () - : alone_ (true), silence_period_ (-1) - { - } - - public: - class Failed {}; - - - void - insync () - { - if (alone_) - alone_ = false; - - silence_period_ = 0; - } - - void - outsync () - { - if (!alone_ && ++silence_period_ >= Protocol::FATAL_SILENCE_FRAME) - { - // cerr << "Silence period has been passed." << endl; - // cerr << "Decalring the node failed." << endl; - throw Failed (); - } - } - - private: - bool alone_; // true if we haven't heard from any members yet. - short silence_period_; - }; -} diff --git a/protocols/ace/TMCast/Group.cpp b/protocols/ace/TMCast/Group.cpp deleted file mode 100644 index 29187838a85..00000000000 --- a/protocols/ace/TMCast/Group.cpp +++ /dev/null @@ -1,511 +0,0 @@ -// file : ACE_TMCast/Group.cpp -// author : Boris Kolpackov <boris@dre.vanderbilt.edu> -// cvs-id : $Id$ - -#include "Group.hpp" - -#include <typeinfo> - -// OS primitives -#include <ace/OS.h> -#include <ace/OS_NS_stdlib.h> -#include <ace/Synch.h> -#include <ace/Time_Value.h> -#include <ace/SOCK_Dgram_Mcast.h> - -#include "Messaging.hpp" - -#include "Protocol.hpp" - -// Components - -#include "LinkListener.hpp" -#include "FaultDetector.hpp" -#include "TransactionController.hpp" - -namespace ACE_TMCast -{ - bool - operator== (std::type_info const* pa, std::type_info const& b) - { - return *pa == b; - } - - // - // - // - class Terminate : public virtual Message {}; - - - // - // - // - class Failure : public virtual Message {}; - - - // - // - // - class Scheduler - { - public: - Scheduler (ACE_INET_Addr const& addr, - char const* id, - MessageQueue& out_send_data, - MessageQueue& out_recv_data, - MessageQueue& out_control) - - : cond_ (mutex_), - - addr_ (addr), - sock_ (), - - out_control_ (out_control), - - in_data_ (mutex_), - in_link_data_(mutex_), - in_control_ (mutex_), - - sync_schedule (ACE_OS::gettimeofday ()), - - transaction_controller_ (in_data_, out_send_data, out_recv_data) - { - ACE_OS::strncpy (id_, id, Protocol::MEMBER_ID_LENGTH); - id_[Protocol::MEMBER_ID_LENGTH - 1] = '\0'; - - sock_.set_option (IP_MULTICAST_TTL, 32); // @@ ttl is hardcoded - - in_data_.subscribe (cond_); - in_link_data_.subscribe (cond_); - in_control_.subscribe (cond_); - - ACE_thread_t unused; - if (ACE_OS::thr_create (&thread_thunk, - this, - THR_JOINABLE, - &unused, - &thread_) != 0) ACE_OS::abort (); - } - - virtual ~Scheduler () - { - { - MessageQueueAutoLock lock (in_control_); - - in_control_.push (MessagePtr (new Terminate)); - } - - if (ACE_OS::thr_join (thread_, 0) != 0) ACE_OS::abort (); - - // cerr << "Scheduler is down." << endl; - } - - public: - MessageQueue& - in_data () - { - return in_data_; - } - - private: - static ACE_THR_FUNC_RETURN - thread_thunk (void* arg) - { - Scheduler* obj = reinterpret_cast<Scheduler*> (arg); - obj->execute (); - return 0; - } - - void - execute () - { - try - { - sock_.join (addr_); - auto_ptr<LinkListener> ll (new LinkListener (sock_, in_link_data_)); - - { - AutoLock lock (mutex_); - - // Loop - // - // - - while (true) - { - cond_.wait (&sync_schedule); - - // "Loop of Fairness" - - bool done = false; - - do - { - // control message - // - // - if (!in_control_.empty ()) - { - done = true; - break; - } - - // outsync - // - // - if (sync_schedule < ACE_OS::gettimeofday ()) - { - // OUTSYNC - - outsync (); - - // schedule next outsync - sync_schedule = - ACE_OS::gettimeofday () + - ACE_Time_Value (0, Protocol::SYNC_PERIOD); - } - - // link message - // - // - if (!in_link_data_.empty ()) - { - MessagePtr m (in_link_data_.front ()); - in_link_data_.pop (); - - std::type_info const* exp = &typeid (*m); - - if (exp == typeid (LinkFailure)) - { - // cerr << "link failure" << endl; - throw false; - } - else if (exp == typeid (LinkData)) - { - - LinkData* data = dynamic_cast<LinkData*> (m.get ()); - - // INSYNC, TL, CT - - // Filter out loopback. - // - if (ACE_OS::strcmp (data->header().member_id.id, id_) != 0) - { - insync (); - transaction_list (); - current_transaction (data->header().current, - data->payload (), - data->size ()); - } - } - else - { - // cerr << "unknown message type from link listener: " - // << typeid (*m).name () << endl; - ACE_OS::abort (); - } - } - - // api message - // - // - if (!in_data_.empty ()) - { - // API - - api (); - } - - } while (!in_link_data_.empty() || - sync_schedule < ACE_OS::gettimeofday ()); - - if (done) break; - } - } - } - catch (...) - { - // cerr << "Exception in scheduler loop." << endl; - MessageQueueAutoLock lock (out_control_); - out_control_.push (MessagePtr (new Failure)); - } - } - - // Events - // - // Order: - // - // INSYNC, TSL, VOTE, BEGIN - // API - // OUTSYNC - // - - void - insync () - { - fault_detector_.insync (); - } - - void - outsync () - { - char buf[Protocol::MAX_MESSAGE_SIZE]; - - Protocol::MessageHeader* hdr = - reinterpret_cast<Protocol::MessageHeader*> (buf); - - void* data = buf + sizeof (Protocol::MessageHeader); - - hdr->length = sizeof (Protocol::MessageHeader); - hdr->check_sum = 0; - - ACE_OS::strcpy (hdr->member_id.id, id_); - - size_t size (0); - - transaction_controller_.outsync (hdr->current, data, size); - - hdr->length += size; - - fault_detector_.outsync (); - - // sock_.send (buf, hdr->length, addr_); - sock_.send (buf, hdr->length); - } - - void - transaction_list () - { - } - - void - current_transaction (Protocol::Transaction const& t, - void const* payload, - size_t size) - { - transaction_controller_.current_transaction (t, payload, size); - } - - void - api () - { - transaction_controller_.api (); - } - - private: - ACE_hthread_t thread_; - - ACE_Thread_Mutex mutex_; - ACE_Condition<ACE_Thread_Mutex> cond_; - - typedef ACE_Guard<ACE_Thread_Mutex> AutoLock; - - char id_[Protocol::MEMBER_ID_LENGTH]; - - ACE_INET_Addr addr_; - ACE_SOCK_Dgram_Mcast sock_; - - MessageQueue& out_control_; - - MessageQueue in_data_; - MessageQueue in_link_data_; - MessageQueue in_control_; - - // Protocol state - // - // - - ACE_Time_Value sync_schedule; - - FaultDetector fault_detector_; - TransactionController transaction_controller_; - }; - - - // - // - // - class Group::GroupImpl - { - public: - virtual ~GroupImpl () - { - } - - GroupImpl (ACE_INET_Addr const& addr, char const* id) - throw (Group::Failed) - : send_cond_ (mutex_), - recv_cond_ (mutex_), - failed_ (false), - in_send_data_ (mutex_), - in_recv_data_ (mutex_), - in_control_ (mutex_), - scheduler_ (new Scheduler (addr, - id, - in_send_data_, - in_recv_data_, - in_control_)), - out_data_ (scheduler_->in_data ()) - { - in_send_data_.subscribe (send_cond_); - in_recv_data_.subscribe (recv_cond_); - - in_control_.subscribe (send_cond_); - in_control_.subscribe (recv_cond_); - } - - void - send (void const* msg, size_t size) - throw (Group::InvalidArg, Group::Failed, Group::Aborted) - { - if (size > Protocol::MAX_PAYLOAD_SIZE) throw InvalidArg (); - - // Note the potential deadlock if I lock mutex_ and out_data_ in - // reverse order. - - MessageQueueAutoLock l1 (out_data_); - AutoLock l2 (mutex_); - - throw_if_failed (); - - out_data_.push (MessagePtr (new Send (msg, size))); - - l1.unlock (); // no need to keep it locked - - while (true) - { - throw_if_failed (); - - if (!in_send_data_.empty ()) - { - MessagePtr m (in_send_data_.front ()); - in_send_data_.pop (); - - std::type_info const* exp = &typeid (*m); - - if (exp == typeid (ACE_TMCast::Aborted)) - { - throw Group::Aborted (); - } - else if (exp == typeid (Commited)) - { - return; - } - else - { - // cerr << "send: group-scheduler messaging protocol violation; " - // << "unexpected message " << typeid (*m).name () - // << " " << typeid (Aborted).name () << endl; - - ACE_OS::abort (); - } - } - - // cerr << "send: waiting on condition" << endl; - send_cond_.wait (); - // cerr << "send: wokeup on condition" << endl; - } - } - - - - size_t - recv (void* msg, size_t size) throw (Group::Failed, Group::InsufficienSpace) - { - AutoLock lock (mutex_); - - while (true) - { - throw_if_failed (); - - if (!in_recv_data_.empty ()) - { - MessagePtr m (in_recv_data_.front ()); - in_recv_data_.pop (); - - std::type_info const* exp = &typeid (*m); - - if (exp == typeid (Recv)) - { - Recv* data = dynamic_cast<Recv*> (m.get ()); - - if (size < data->size ()) throw Group::InsufficienSpace (); - - memcpy (msg, data->payload (), data->size ()); - - return data->size (); - } - else - { - // cerr << "recv: group-scheduler messaging protocol violation. " - // << "unexpected message " << typeid (*m).name () << endl; - - ACE_OS::abort (); - } - } - - recv_cond_.wait (); - } - } - - private: - void - throw_if_failed () - { - if (!failed_ && !in_control_.empty ()) failed_ = true; - - if (failed_) throw Group::Failed (); - } - - private: - ACE_Thread_Mutex mutex_; - ACE_Condition<ACE_Thread_Mutex> send_cond_; - ACE_Condition<ACE_Thread_Mutex> recv_cond_; - - typedef ACE_Guard<ACE_Thread_Mutex> AutoLock; - - bool failed_; - - MessageQueue in_send_data_; - MessageQueue in_recv_data_; - MessageQueue in_control_; - - auto_ptr<Scheduler> scheduler_; - - MessageQueue& out_data_; - }; - - - // Group - // - // - Group:: - Group (ACE_INET_Addr const& addr, char const* id) - throw (Group::Failed) - : pimpl_ (new GroupImpl (addr, id)) - { - } - - Group:: - ~Group () - { - } - - void - Group::send (void const* msg, size_t size) throw (Group::InvalidArg, Group::Failed, Group::Aborted) - { - pimpl_->send (msg, size); - } - - size_t - Group::recv (void* msg, size_t size) throw (Group::Failed, Group::InsufficienSpace) - { - return pimpl_->recv (msg, size); - } -} - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_Condition<ACE_Thread_Mutex>; -#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) -#pragma instantiate ACE_Condition<ACE_Thread_Mutex> -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ diff --git a/protocols/ace/TMCast/Group.hpp b/protocols/ace/TMCast/Group.hpp deleted file mode 100644 index 13c49f210bb..00000000000 --- a/protocols/ace/TMCast/Group.hpp +++ /dev/null @@ -1,51 +0,0 @@ -// file : ACE_TMCast/Group.hpp -// author : Boris Kolpackov <boris@dre.vanderbilt.edu> -// cvs-id : $Id$ - -#ifndef TMCAST_GROUP_HPP -#define TMCAST_GROUP_HPP - -#include <ace/Auto_Ptr.h> -#include <ace/INET_Addr.h> - -#include "Export.hpp" - -namespace ACE_TMCast -{ - class ACE_TMCast_Export Group - { - public: - class Aborted {}; - class Failed {}; - class InvalidArg {}; - class InsufficienSpace {}; - - public: - ~Group (); - - Group (ACE_INET_Addr const& addr, char const* id) throw (Failed); - - public: - void - send (void const* msg, size_t size) throw (InvalidArg, Failed, Aborted); - - size_t - recv (void* msg, size_t size) throw (Failed, InsufficienSpace); - - private: - bool - failed (); - - private: - class GroupImpl; - auto_ptr<GroupImpl> pimpl_; - - private: - Group (Group const&); - - Group& - operator= (Group const&); - }; -} - -#endif // TMCAST_GROUP_HPP diff --git a/protocols/ace/TMCast/GroupFwd.hpp b/protocols/ace/TMCast/GroupFwd.hpp deleted file mode 100644 index b4ed7304ff7..00000000000 --- a/protocols/ace/TMCast/GroupFwd.hpp +++ /dev/null @@ -1,15 +0,0 @@ -// file : ACE_TMCast/GroupFwd.hpp -// author : Boris Kolpackov <boris@dre.vanderbilt.edu> -// cvs-id : $Id$ - -#ifndef TMCAST_GROUP_FWD_HPP -#define TMCAST_GROUP_FWD_HPP - -#include "Export.hpp" - -namespace ACE_TMCast -{ - class ACE_TMCast_Export Group; -} - -#endif // TMCAST_GROUP_FWD_HPP diff --git a/protocols/ace/TMCast/LinkListener.hpp b/protocols/ace/TMCast/LinkListener.hpp deleted file mode 100644 index 983f7828f3e..00000000000 --- a/protocols/ace/TMCast/LinkListener.hpp +++ /dev/null @@ -1,171 +0,0 @@ -// file : ACE_TMCast/LinkListener.hpp -// author : Boris Kolpackov <boris@dre.vanderbilt.edu> -// cvs-id : $Id$ - -// OS primitives -#include <ace/OS_NS_string.h> -#include <ace/OS_NS_stdlib.h> -#include <ace/Synch.h> -#include <ace/SOCK_Dgram_Mcast.h> -#include <ace/Refcounted_Auto_Ptr.h> - - -#include "Messaging.hpp" -#include "Protocol.hpp" - -namespace ACE_TMCast -{ - // - // - // - class LinkFailure : public virtual Message {}; - - - // - // - // - class LinkData : public virtual Message - { - public: - LinkData (Protocol::MessageHeader const* header, - void* payload, - size_t size) - : size_ (size) - { - ACE_OS::memcpy (&header_, header, sizeof (Protocol::MessageHeader)); - ACE_OS::memcpy (payload_, payload, size_); - } - - Protocol::MessageHeader const& - header () const - { - return header_; - } - - void const* - payload () const - { - return payload_; - } - - size_t - size () const - { - return size_; - } - - private: - Protocol::MessageHeader header_; - char payload_[Protocol::MAX_MESSAGE_SIZE]; - size_t size_; - }; - - typedef - ACE_Refcounted_Auto_Ptr<LinkData, ACE_Null_Mutex> - LinkDataPtr; - - // - // - // - class LinkListener - { - private: - class Terminate : public virtual Message {}; - - public: - LinkListener (ACE_SOCK_Dgram_Mcast& sock, MessageQueue& out) - : sock_(sock), out_ (out) - { - ACE_thread_t unused; - if (ACE_OS::thr_create (&thread_thunk, - this, - THR_JOINABLE, - &unused, - &thread_) != 0) ACE_OS::abort (); - } - - ~LinkListener () - { - { - MessageQueueAutoLock lock (control_); - - control_.push (MessagePtr (new Terminate)); - } - - if (ACE_OS::thr_join (thread_, 0) != 0) ACE_OS::abort (); - - // cerr << "Link listener is down." << endl; - } - - - static ACE_THR_FUNC_RETURN - thread_thunk (void* arg) - { - LinkListener* obj = reinterpret_cast<LinkListener*> (arg); - - obj->execute (); - return 0; - } - - void - execute () - { - char msg[Protocol::MAX_MESSAGE_SIZE]; - - ssize_t header_size = sizeof (Protocol::MessageHeader); - - // OS::Time timeout (1000000); // one millisecond - - ACE_Time_Value timeout (0, 1000); // one millisecond - - try - { - while (true) - { - // Check control message queue - - { - MessageQueueAutoLock lock (control_); - - if (!control_.empty ()) break; - } - - ACE_INET_Addr junk; - ssize_t n = sock_.recv (msg, - Protocol::MAX_MESSAGE_SIZE, - junk, - 0, - &timeout); - - if (n != -1) - { - if (n < header_size) throw false; - - Protocol::MessageHeader* header = - reinterpret_cast<Protocol::MessageHeader*> (msg); - - MessageQueueAutoLock lock (out_); - - out_.push (MessagePtr (new LinkData (header, - msg + header_size, - n - header_size))); - } - } - } - catch (...) - { - MessageQueueAutoLock lock (out_); - - out_.push (MessagePtr (new LinkFailure)); - } - } - - private: - typedef ACE_Guard<ACE_Thread_Mutex> AutoLock; - - ACE_hthread_t thread_; - ACE_SOCK_Dgram_Mcast& sock_; - MessageQueue& out_; - MessageQueue control_; - }; -} diff --git a/protocols/ace/TMCast/MTQueue.cpp b/protocols/ace/TMCast/MTQueue.cpp deleted file mode 100644 index 32d10eb23b7..00000000000 --- a/protocols/ace/TMCast/MTQueue.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// file : ACE_TMCast/MTQueue.cpp -// author : Steve Huston <shuston@riverace.com> -// cvs-id : $Id$ - -#include "LinkListener.hpp" -#include "MTQueue.hpp" - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_Node<ACE_Refcounted_Auto_Ptr<ACE_TMCast::Message,ACE_Null_Mutex> >; -template class ACE_Unbounded_Queue<ACE_Refcounted_Auto_Ptr<ACE_TMCast::Message,ACE_Null_Mutex> >; -template class ACE_Unbounded_Queue_Iterator<ACE_Refcounted_Auto_Ptr<ACE_TMCast::Message,ACE_Null_Mutex> >; -template class ACE_Node<ACE_Condition<ACE_Thread_Mutex>* >; -template class ACE_Unbounded_Set<ACE_Condition<ACE_Thread_Mutex>* >; -template class ACE_Unbounded_Set_Iterator<ACE_Condition<ACE_Thread_Mutex> *>; -template class ACE_Unbounded_Set_Const_Iterator<ACE_Condition<ACE_Thread_Mutex> *>; -#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) -#pragma instantiate ACE_Node<ACE_Refcounted_Auto_Ptr<ACE_TMCast::Message,ACE_Null_Mutex> > -#pragma instantiate ACE_Unbounded_Queue<ACE_Refcounted_Auto_Ptr<ACE_TMCast::Message,ACE_Null_Mutex> > -#pragma instantiate ACE_Unbounded_Queue_Iterator<ACE_Refcounted_Auto_Ptr<ACE_TMCast::Message,ACE_Null_Mutex> > -#pragma instantiate ACE_Node<ACE_Condition<ACE_Thread_Mutex> *> -#pragma instantiate ACE_Unbounded_Set<ACE_Condition<ACE_Thread_Mutex> *> -#pragma instantiate ACE_Unbounded_Set_Iterator<ACE_Condition<ACE_Thread_Mutex> *> -#pragma instantiate ACE_Unbounded_Set_Const_Iterator<ACE_Condition<ACE_Thread_Mutex> *> -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ diff --git a/protocols/ace/TMCast/MTQueue.hpp b/protocols/ace/TMCast/MTQueue.hpp deleted file mode 100644 index 2eb128823fe..00000000000 --- a/protocols/ace/TMCast/MTQueue.hpp +++ /dev/null @@ -1,176 +0,0 @@ -// file : ACE_TMCast/MTQueue.hpp -// author : Boris Kolpackov <boris@dre.vanderbilt.edu> -// cvs-id : $Id$ - -#ifndef TMCAST_MT_QUEUE_HPP -#define TMCAST_MT_QUEUE_HPP - -#include "ace/Auto_Ptr.h" -#include "ace/Unbounded_Set.h" -#include "ace/Unbounded_Queue.h" -#include "ace/os_include/sys/os_types.h" - -namespace ACE_TMCast -{ - template <typename T, - typename M, - typename C, - typename Q = ACE_Unbounded_Queue<T> > - class MTQueue - { - public: - typedef T ElementType; - typedef M MutexType; - typedef C ConditionalType; - typedef Q QueueType; - - public: - - MTQueue () - : mutexp_ (new MutexType), - mutex_ (*mutexp_), - queue_ (), - signal_ (false) - { - } - - MTQueue (MutexType& mutex) - : mutexp_ (), - mutex_ (mutex), - queue_ (), - signal_ (false) - { - } - - public: - bool - empty () const - { - return queue_.is_empty (); - } - - size_t - size () const - { - return queue_.size (); - } - - // typedef typename QueueType::Empty Empty; - - class Empty {}; - - T& - front () - { - ACE_Unbounded_Queue_Iterator<T> f (queue_); - T* tmp; - if (!f.next (tmp)) throw Empty (); - - return *tmp; - } - - - T const& - front () const - { - ACE_Unbounded_Queue_Const_Iterator<T> f (queue_); - T* tmp; - if (!f.next (tmp)) throw Empty (); - - return *tmp; - } - - /* - T& - back () - { - return queue_.back (); - } - - - T const& - back () const - { - return queue_.back (); - } - */ - - void - push (T const& t) - { - signal_ = empty (); - queue_.enqueue_tail (t); - } - - void - pop () - { - T junk; - queue_.dequeue_head (junk); - } - - public: - void - lock () const - { - mutex_.acquire (); - } - - void - unlock () const - { - if (signal_) - { - signal_ = false; - - for (ConditionalSetConstIterator_ i (cond_set_); - !i.done (); - i.advance ()) - { - ConditionalType** c = 0; - - i.next (c); - - (*c)->signal (); - } - } - - mutex_.release (); - } - - void - subscribe (ConditionalType& c) - { - //@@ should check for duplicates - // - cond_set_.insert (&c); - } - - void - unsubscribe (ConditionalType& c) - { - //@@ should check for absence - // - cond_set_.remove (&c); - } - - private: - auto_ptr<MutexType> mutexp_; - MutexType& mutex_; - QueueType queue_; - - typedef - ACE_Unbounded_Set<ConditionalType*> - ConditionalSet_; - - typedef - ACE_Unbounded_Set_Const_Iterator<ConditionalType*> - ConditionalSetConstIterator_; - - ConditionalSet_ cond_set_; - - mutable bool signal_; - }; -} - -#endif // TMCAST_MT_QUEUE_HPP diff --git a/protocols/ace/TMCast/Makefile.am b/protocols/ace/TMCast/Makefile.am deleted file mode 100644 index 3338e4a8f64..00000000000 --- a/protocols/ace/TMCast/Makefile.am +++ /dev/null @@ -1,66 +0,0 @@ -## Process this file with automake to create Makefile.in -## -## $Id$ -## - -includedir = @includedir@/ace/TMCast -pkgconfigdir = @libdir@/pkgconfig - -ACE_BUILDDIR = $(top_builddir) -ACE_ROOT = $(top_srcdir) - - -## Makefile.TMCast.am - -if BUILD_EXCEPTIONS -if BUILD_THREADS - -lib_LTLIBRARIES = libACE_TMCast.la - -libACE_TMCast_la_CPPFLAGS = \ - -I$(ACE_ROOT) \ - -I$(ACE_BUILDDIR) \ - -DTMCAST_BUILD_DLL - -libACE_TMCast_la_SOURCES = \ - Group.cpp \ - MTQueue.cpp \ - Protocol.cpp \ - Template_Instantiations.cpp - -libACE_TMCast_la_LDFLAGS = \ - -version-number @ACE_MAJOR@:@ACE_MINOR@:@ACE_BETA@ - -libACE_TMCast_la_LIBADD = \ - $(ACE_BUILDDIR)/ace/libACE.la - -nobase_include_HEADERS = \ - Export.hpp \ - FaultDetector.hpp \ - Group.hpp \ - GroupFwd.hpp \ - LinkListener.hpp \ - MTQueue.hpp \ - Messaging.hpp \ - Protocol.hpp \ - TransactionController.hpp - -pkgconfig_DATA = ACE_TMCast.pc - -ACE_TMCast.pc: ${top_builddir}/config.status ${srcdir}/ACE_TMCast.pc.in - ${top_builddir}/config.status --file $@:${srcdir}/ACE_TMCast.pc.in - -endif BUILD_THREADS -endif BUILD_EXCEPTIONS - -EXTRA_DIST = \ - ACE_TMCast.pc.in - - -## Clean up template repositories, etc. -clean-local: - -rm -f *~ *.bak *.rpo *.sym lib*.*_pure_* core core.* - -rm -f gcctemp.c gcctemp so_locations *.ics - -rm -rf cxx_repository ptrepository ti_files - -rm -rf templateregistry ir.out - -rm -rf ptrepository SunWS_cache Templates.DB diff --git a/protocols/ace/TMCast/Messaging.hpp b/protocols/ace/TMCast/Messaging.hpp deleted file mode 100644 index 886745d1120..00000000000 --- a/protocols/ace/TMCast/Messaging.hpp +++ /dev/null @@ -1,54 +0,0 @@ -// file : ACE_TMCast/Messaging.hpp -// author : Boris Kolpackov <boris@dre.vanderbilt.edu> -// cvs-id : $Id$ - -#ifndef TMCAST_MESSAGING_HPP -#define TMCAST_MESSAGING_HPP - -#include <ace/Synch.h> -#include <ace/Refcounted_Auto_Ptr.h> - -#include "MTQueue.hpp" - -namespace ACE_TMCast -{ - class Message - { - public: - virtual - ~Message () {} - }; - - typedef - ACE_Refcounted_Auto_Ptr<Message, ACE_Null_Mutex> - MessagePtr; - - typedef - MTQueue<MessagePtr, ACE_Thread_Mutex, ACE_Condition<ACE_Thread_Mutex> > - MessageQueue; - - struct MessageQueueAutoLock - { - MessageQueueAutoLock (MessageQueue& q) - : q_ (q) - { - q_.lock (); - } - - void - unlock () - { - q_.unlock (); - } - - ~MessageQueueAutoLock () - { - q_.unlock (); - } - - private: - MessageQueue& q_; - }; -} - -#endif // TMCAST_MESSAGING_HPP diff --git a/protocols/ace/TMCast/Protocol.cpp b/protocols/ace/TMCast/Protocol.cpp deleted file mode 100644 index ea4c6b39020..00000000000 --- a/protocols/ace/TMCast/Protocol.cpp +++ /dev/null @@ -1,31 +0,0 @@ -// file : ACE_TMCast/Protocol.cpp -// author : Boris Kolpackov <boris@dre.vanderbilt.edu> -// cvs-id : $Id$ - -#include "Protocol.hpp" - -namespace ACE_TMCast -{ - namespace Protocol - { - /* - namespace - { - char const* labels[] = { - "NONE", "BEGIN", "COMMIT", "ABORT", "COMMITED", "ABORTED"}; - } - - std::string - tslabel (Protocol::TransactionStatus s) - { - return labels[s]; - } - - std::ostream& - operator << (std::ostream& o, Transaction const& t) - { - return o << "{" << t.id << "; " << tslabel (t.status) << "}"; - } - */ - } -} diff --git a/protocols/ace/TMCast/Protocol.hpp b/protocols/ace/TMCast/Protocol.hpp deleted file mode 100644 index 6cdf374f4f9..00000000000 --- a/protocols/ace/TMCast/Protocol.hpp +++ /dev/null @@ -1,107 +0,0 @@ -// file : ACE_TMCast/Protocol.hpp -// author : Boris Kolpackov <boris@dre.vanderbilt.edu> -// cvs-id : $Id$ - -#ifndef TMCAST_PROTOCOL_HPP -#define TMCAST_PROTOCOL_HPP - -namespace ACE_TMCast -{ - namespace Protocol - { - // - // - // - unsigned long const MEMBER_ID_LENGTH = 38; - - struct MemberId - { - char id[MEMBER_ID_LENGTH]; - /* - unsigned long ip; - unsigned short port; - */ - }; - - // - // - // - typedef unsigned short TransactionId; - - - - typedef unsigned char TransactionStatus; - - TransactionStatus const TS_BEGIN = 1; - TransactionStatus const TS_COMMIT = 2; - TransactionStatus const TS_ABORT = 3; - TransactionStatus const TS_COMMITED = 4; - TransactionStatus const TS_ABORTED = 5; - - struct Transaction - { - TransactionId id; - TransactionStatus status; - }; - - // Transaction List (TL) - - // unsigned long const TL_LENGTH = 1; - - // typedef Transaction TransactionList[TL_LENGTH]; - - - // - // - // - struct MessageHeader - { - unsigned long length; - - unsigned long check_sum; - - MemberId member_id; - - Transaction current; - - //TransactionList transaction_list; - }; - - - // - // - // - - unsigned long const MAX_MESSAGE_SIZE = 768; - - unsigned long const - MAX_PAYLOAD_SIZE = MAX_MESSAGE_SIZE - sizeof (MessageHeader); - - // Protocol timing - // - // - - unsigned long const SYNC_PERIOD = 30000; // in mks - - unsigned short const VOTING_FRAME = 4; // in SYNC_PERIOD's - unsigned short const SEPARATION_FRAME = 5; // in SYNC_PERIOD's - - // FATAL_SILENCE_FRAME in SYNC_PERIOD's - // Generally it's a good idea to set it to < VOTING_FRAME + SEPARATION_FRAME - // - - short const FATAL_SILENCE_FRAME = VOTING_FRAME + SEPARATION_FRAME - 2; - - // short const FATAL_SILENCE_FRAME = 10000; - - // Helpers - - // std::string - // tslabel (Protocol::TransactionStatus s); - - // std::ostream& - // operator << (std::ostream& o, Transaction const& t); - } -} - -#endif // TMCAST_PROTOCOL_HPP diff --git a/protocols/ace/TMCast/README b/protocols/ace/TMCast/README deleted file mode 100644 index 7104be46e30..00000000000 --- a/protocols/ace/TMCast/README +++ /dev/null @@ -1,240 +0,0 @@ - - -Introduction ------------- - -TMCast (stands for Transaction MultiCast) is an implementation of a -transactional multicast protocol. In essence, the idea is to represent -each message delivery to members of a multicast group as a transaction -- an atomic, consistent and isolated action. A multicast transaction -can be viewed as an atomic transition of the group members to a new -state. If we define [Mo] as a set of operational (non-faulty) members -of the group, [Mf] as a set of faulty members of the group, [Ma] as a -set of members that view transition [Tn] as aborted and [Mc] as a set -of members that view transition [Tn] as committed, then this atomic -transition [Tn] should satisfy one of the following equations: - -Mo(Tn-1) = Ma(T) U Mf(T) -Mo(Tn-1) = Mc(T) U Mf(T) - -Or, in other words, after transaction T has been committed (aborted), -all operational (before transaction T) members are either in the -committed (aborted) or failed state. - -Thus, for each member of the group, outcome of the transaction can be -commit, abort or a member failure. It is important for a member to -exhibit a failfast (error latency is less than transaction cycle) -behavior. Or, in other words, if a member transitioned into a wrong -state, it is guaranteed to fail instead of delivering a wrong result. - -In order to achieve such an error detection in a decentralized -environment, certain limitations were imposed. One of the most -user-visible limitation is the fact that the lifetime of the group -with only one member is very short. This is because there is not way -for a member to distinguish "no members yet" case from "my link to the -group is down". In such a situation, the member assumes the latter -case. There is also a military saying that puts it quite nicely: two -is one, one is nothing. - - - -State of Implementation ------------------------ - -The current implementation is in a prototypical stage. The following -parts are not implemented or still under development: - -* Handling of network partitioning (TODO) - -* Redundant network support (TODO) - -* Member failure detection (partial implementation) - - -Examples --------- - -There is a simple example available in examples/TMCast/Member with -the corresponding README. - - -Architecture ------------- - -Primary goals of the protocol are to (1) mask transient failures of the -underlying multicast protocol (or, more precisely, allow to recover -from transient failures) and (2) exhibit failfast behavior in cases of -permanent failures. - -The distinction between transient and permanent failures is based on -timeouts thus what can be a transient failure in one configuration of -the protocol could be a permanent failure in the other. - -[Maybe talk more about a transient/permanent threshold and its effect -on performance/resource utilization/etc.] - -[Maybe add a terminology section.] - -Each member of a multicast group has its unique (group-wise) id: - -struct MemberId -{ - char id[MEMBER_ID_LENGTH]; -}; - -Each payload delivery is part of a transaction. Each transaction is -identified by TransactionId: - -typedef unsigned short TransactionId; - - -Each transaction has a status code which identifies its state, as viewed by -a group member: - - -typedef unsigned char TransactionStatus; - -TransactionStatus const TS_BEGIN = 1; -TransactionStatus const TS_COMMIT = 2; -TransactionStatus const TS_ABORT = 3; -TransactionStatus const TS_COMMITTED = 4; -TransactionStatus const TS_ABORTED = 5; - -Thus each transaction is described by its id and status: - -struct Transaction -{ - TransactionId id; - TransactionStatus status; -}; - -The outcome of some predefined number of recent transactions is stored -in TransactionList: - -typedef Transaction TransactionList[TL_LENGTH]; - - -Each message sent to a multicast group has the following header: - -struct MessageHeader -{ - unsigned long length; - unsigned long check_sum; - MemberId member_id; - Transaction current; - TransactionList transaction_list; -}; - -[Maybe describe each field here.] - -A new member joins the group with transaction id 0 and status -TS_COMMITTED. - -Each member sends a periodic 'pulse' messages with some predefined interval -advertising its current view of the group. This includes the state of the -current transaction and the history of the recent transactions. - - -If a member of the group needs a payload delivery it starts a new -transaction by sending a message with current transaction set to - -{++current_id, TS_BEGIN} - -and payload appended after the header. - - -Each member joins a transaction in one of the following ways: - -* A member that began the transaction joins it 'to commit' (TS_COMMIT) - -* A member that received TS_BEGIN joins current transaction 'to commit' - (TS_COMMIT). - -* A member that received TS_COMMIT or TS_ABORT but did not receive TS_BEGIN - joins current transaction 'to abort' (TS_ABORT). - - -After a member has joined the transaction it starts participating in the -transaction's voting phase. On this phase members of the group decide the -fate of the transaction. Each member sends a predefined number of messages -where it announces its vote. In between those messages the member is receiving -and processing votes from other members and can be influenced by their -'opinion'. - -In their decision-making members follow the principle of the majority. As -the voting progresses (and comes close to an end) members become more and -more reluctant to deviate from the decision of the majority. - -[Maybe add an equation that measures member's willingness to change -its mind.] - -At the end of the voting phase each member declares the current transaction -either committed (TS_COMMITTED) or aborted (TS_ABORTED). If this decision does -not agree with the majority the member declares itself failed. - -In addition, each member builds a 'majority view' of the transaction history -(based on transaction_list). If it deviates from the member's own history the -member declares itself failed. - -Here are some example scenarios of how the protocol behaves in different -situations. Let's say we have three members of the group S, R1, R2. S -initiates a transaction. R1 and R2 join it. - -Scenario 1. (two-step voting) - -1. S initiates a transaction (TS_BEGIN) -2a. R1 receives TS_BEGIN, joins for commit -2b. R2 receives TS_BEGIN, joins for commit -3a. S announces TS_COMMIT (first vote) -3b. R1 announces TS_COMMIT (first vote) -3c. R2 announces TS_COMMIT (first vote) -4a. S announces TS_COMMIT (second vote) -4b. R1 announces TS_COMMIT (second vote) -4c. R2 announces TS_COMMIT (second vote) -5a. S announces TS_COMMITTED (end of vote) -5b. R1 announces TS_COMMITTED (end of vote) -5c. R2 announces TS_COMMITTED (end of vote) - - -Scenario 2. (two-step voting) - -1. S initiates a transaction (TS_BEGIN) -2a. R1 receives TS_BEGIN, joins for commit -2b. R2 didn't receive TS_BEGIN -3a. S announces TS_COMMIT (first vote) -3b. R1 announces TS_COMMIT (first vote) -3c. R2 received R1's TS_COMMIT announces TS_ABORT (first vote) -4a. S received R2's TS_ABORT announces TS_ABORT (second vote) -4b. R1 received R2's TS_ABORT announces TS_ABORT (second vote) -4c. R2 announces TS_ABORT (second vote) -5a. S announces TS_ABORTED (end of vote) -5b. R1 announces TS_ABORTED (end of vote) -5c. R2 announces TS_ABORTED (end of vote) - - -Scenario 3. (three-step voting) - -1. S initiates a transaction (TS_BEGIN) -2a. R1 receives TS_BEGIN, joins for commit -2b. R2 didn't receive TS_BEGIN -3a. S announces TS_COMMIT (first vote) -3b. R1 announces TS_COMMIT (first vote) -3c. R2 still didn't receive anything -4a. S announces TS_COMMIT (second vote) -4b. R1 announces TS_COMMIT (second vote) -4c. R2 received R1's TS_COMMIT, announces TS_ABORT (first vote) - -5a. S received R2's TS_ABORT but it is the end of the voting phase and - majority (S and R1) vote for commit, announces TS_COMMIT (third vote) -5b. R1 received R2's TS_ABORT but it is the end of the voting phase and - majority (S and R1) vote for commit, announces TS_COMMIT (third vote) -5c. R2 announces TS_ABORT (second vote) - -6a. S announces TS_COMMITTED (end of vote) -6b. R1 announces TS_COMMITTED (end of vote) -6c. R2 discovers that the the majority has declared current transaction - committed and thus declares itself failed. - - --- -Boris Kolpackov <boris@dre.vanderbilt.edu> diff --git a/protocols/ace/TMCast/TMCast.mpc b/protocols/ace/TMCast/TMCast.mpc deleted file mode 100644 index 1ff937a0a1a..00000000000 --- a/protocols/ace/TMCast/TMCast.mpc +++ /dev/null @@ -1,12 +0,0 @@ -// -*- MPC -*- -// $Id$ - -project : acelib, core, exceptions, threads { - avoids = ace_for_tao - sharedname = ACE_TMCast - dynamicflags += TMCAST_BUILD_DLL - - Pkgconfig_Files { - ACE_TMCast.pc.in - } -} diff --git a/protocols/ace/TMCast/Template_Instantiations.cpp b/protocols/ace/TMCast/Template_Instantiations.cpp deleted file mode 100644 index 62e9b24a8bc..00000000000 --- a/protocols/ace/TMCast/Template_Instantiations.cpp +++ /dev/null @@ -1,31 +0,0 @@ -// $Id$ - -// Note: this file is here only until support for explicit template -// instantiations is removed from ACE, after ACE 5.5 is released. - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) || \ - defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) - -# include "ace/Null_Mutex.h" -# include "ace/Refcounted_Auto_Ptr.h" - -# include "TransactionController.hpp" - -#endif - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) - -template class ACE_Refcounted_Auto_Ptr<ACE_TMCast::Message, ACE_Null_Mutex>; -template class ACE_Refcounted_Auto_Ptr<ACE_TMCast::Recv, ACE_Null_Mutex>; -template class ACE_Refcounted_Auto_Ptr<ACE_TMCast::Send, ACE_Null_Mutex>; - -#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) - -# pragma instantiate class ACE_Refcounted_Auto_Ptr<ACE_TMCast::Message, ACE_Null_Mutex> -# pragma instantiate class ACE_Refcounted_Auto_Ptr<ACE_TMCast::Recv, ACE_Null_Mutex> -# pragma instantiate class ACE_Refcounted_Auto_Ptr<ACE_TMCast::Send, ACE_Null_Mutex> - -#elif defined (__HP_aCC) -// Make aC++ stop complaining about an empty translation unit -static int shut_up_aCC = 0; -#endif diff --git a/protocols/ace/TMCast/TransactionController.hpp b/protocols/ace/TMCast/TransactionController.hpp deleted file mode 100644 index 6b0d4281655..00000000000 --- a/protocols/ace/TMCast/TransactionController.hpp +++ /dev/null @@ -1,388 +0,0 @@ -// file : ACE_TMCast/TransactionController.hpp -// author : Boris Kolpackov <boris@dre.vanderbilt.edu> -// cvs-id : $Id$ - -#include "ace/OS_NS_string.h" -#include "ace/OS_NS_stdlib.h" -#include "ace/Synch.h" -#include "ace/Refcounted_Auto_Ptr.h" - -#include "Protocol.hpp" -#include "Messaging.hpp" - -#include <typeinfo> - -namespace ACE_TMCast -{ - - // Messages - // - // - class Send : public virtual Message - { - public: - Send (void const* msg, size_t size) - : size_ (size) - { - ACE_OS::memcpy (payload_, msg, size_); - } - - void const* - payload () const - { - return payload_; - } - - size_t - size () const - { - return size_; - } - - private: - size_t size_; - char payload_[Protocol::MAX_PAYLOAD_SIZE]; - }; - - typedef - ACE_Refcounted_Auto_Ptr<Send, ACE_Null_Mutex> - SendPtr; - - - class Recv : public virtual Message - { - public: - Recv (void const* msg, size_t size) - : size_ (size) - { - ACE_OS::memcpy (payload_, msg, size_); - } - - void const* - payload () const - { - return payload_; - } - - size_t - size () const - { - return size_; - } - - private: - size_t size_; - char payload_[Protocol::MAX_PAYLOAD_SIZE]; - }; - - typedef - ACE_Refcounted_Auto_Ptr<Recv, ACE_Null_Mutex> - RecvPtr; - - class Aborted : public virtual Message {}; - - class Commited : public virtual Message {}; - - - // - // - // - class TransactionController - { - public: - TransactionController (MessageQueue& in, - MessageQueue& send_out, - MessageQueue& recv_out) - : trace_ (false), - voting_duration_ (0), - separation_duration_ (0), - in_ (in), - send_out_ (send_out), - recv_out_ (recv_out) - { - current_.id = 0; - current_.status = Protocol::TS_COMMITED; - } - - public: - class Failure {}; - - - void - outsync (Protocol::Transaction& c, void* payload, size_t& size) - { - if (current_.status == Protocol::TS_COMMIT || - current_.status == Protocol::TS_ABORT) - { - if (++voting_duration_ >= Protocol::VOTING_FRAME) - { - // end of voting frame - - if (current_.status == Protocol::TS_COMMIT) - { - { - if (initiated_) - { - MessageQueueAutoLock lock (send_out_); - send_out_.push (MessagePtr (new Commited)); - } - else // joined transaction - { - MessageQueueAutoLock lock (recv_out_); - recv_out_.push (MessagePtr (recv_.release ())); - recv_ = RecvPtr (); - } - } - - current_.status = Protocol::TS_COMMITED; - - // if (trace_) cerr << "commited transaction with id " - // << current_.id << endl; - } - else // TS_ABORT - { - if (initiated_) - { - MessageQueueAutoLock lock (send_out_); - send_out_.push (MessagePtr (new Aborted)); - } - else - { - // free revc_ buffer if necessary - // - if (recv_.get ()) recv_ = RecvPtr (); - } - - - current_.status = Protocol::TS_ABORTED; - - // if (trace_) cerr << "aborted transaction with id " - // << current_.id << endl; - } - - // start transaction separation frame (counts down) - // +1 because it will be decremented on this iteration - separation_duration_ = Protocol::SEPARATION_FRAME + 1; - } - } - - // Set current outsync info - - c.id = current_.id; - c.status = current_.status; - - - // Do some post-processing - - switch (current_.status) - { - case Protocol::TS_COMMITED: - case Protocol::TS_ABORTED: - { - if (separation_duration_ > 0) --separation_duration_; - break; - } - case Protocol::TS_BEGIN: - { - // transfer payload - - size = send_->size (); - memcpy (payload, send_->payload (), size); - - send_ = SendPtr (); - - // get redy to vote for 'commit' - - current_.status = Protocol::TS_COMMIT; - voting_duration_ = 0; - } - } - } - - void - current_transaction (Protocol::Transaction const& t, - void const* payload, - size_t size) - { - Protocol::TransactionId& id = current_.id; - Protocol::TransactionStatus& s = current_.status; - - if (id == 0 && t.id != 0) // catch up - { - switch (t.status) - { - case Protocol::TS_BEGIN: - case Protocol::TS_COMMIT: - case Protocol::TS_ABORT: - { - id = t.id - 1; - s = Protocol::TS_COMMITED; - break; - } - case Protocol::TS_ABORTED: - case Protocol::TS_COMMITED: - { - id = t.id; - s = t.status; - break; - } - } - - // if (trace_) cerr << "caught up with id " << id << endl; - } - - bool stable (s == Protocol::TS_COMMITED || s == Protocol::TS_ABORTED); - - switch (t.status) - { - case Protocol::TS_BEGIN: - { - if (!stable || t.id != id + 1) - { - // Transaction is in progress or hole in transaction id's - - // cerr << "unexpected request to join " << t - // << " while on " << current_ << endl; - - // if (!stable) cerr << "voting progress is " << voting_duration_ - // << "/" << Protocol::VOTING_FRAME << endl; - - if (t.id == id) // collision - { - if (!stable && s != Protocol::TS_ABORT) - { - // abort both - // cerr << "aborting both transactions" << endl; - - s = Protocol::TS_ABORT; - voting_duration_ = 0; //@@ reset voting frame - } - } - else - { - // @@ delicate case. need to think more - - // cerr << "Declaring node failed." << endl; - throw Failure (); - } - } - else - { - // join the transaction - - initiated_ = false; - - recv_ = RecvPtr (new Recv (payload, size)); - - id = t.id; - s = Protocol::TS_COMMIT; - voting_duration_ = 0; - - // if (trace_) cerr << "joining-for-commit transaction with id " - // << id << endl; - } - break; - } - case Protocol::TS_COMMIT: - { - if (stable && id == t.id - 1) - { - // not begin and and we haven't joined - - // join for abort - - initiated_ = false; - - current_.id = t.id; - current_.status = Protocol::TS_ABORT; - voting_duration_ = 0; - - // if (trace_) cerr << "joining-for-abort transaction with id " - // << current_.id << endl; - } - break; - } - case Protocol::TS_ABORT: - { - if ((!stable && id == t.id && s == Protocol::TS_COMMIT) || - (stable && id == t.id - 1)) // abort current || new transaction - { - // if (trace_) cerr << "voting-for-abort on transaction with id " - // << current_.id << endl; - - id = t.id; - s = Protocol::TS_ABORT; - - voting_duration_ = 0; //@@ reseting voting_duration_ - } - else - { - } - - break; - } - case Protocol::TS_ABORTED: - case Protocol::TS_COMMITED: - { - // nothing for now - break; - } - } - } - - void - api () - { - if ((current_.status == Protocol::TS_COMMITED || - current_.status == Protocol::TS_ABORTED) && - separation_duration_ == 0) // no transaction in progress - { - // start new transaction - - // Note that in_ is already locked by Scheduler - - MessagePtr m (in_.front ()); - in_.pop (); - - if (typeid (*m) == typeid (Send)) - { - send_ = SendPtr (dynamic_cast<Send*> (m.release ())); - } - else - { - // cerr << "Expecting Send but received " << typeid (*m).name () - // << endl; - - ACE_OS::abort (); - } - - current_.id++; - current_.status = Protocol::TS_BEGIN; - - initiated_ = true; - - // if (trace_) cerr << "starting transaction with id " << current_.id - // << endl; - } - } - - private: - typedef ACE_Guard<ACE_Thread_Mutex> AutoLock; - - bool trace_; - - Protocol::Transaction current_; - - bool initiated_; - - unsigned short voting_duration_; - unsigned short separation_duration_; - - MessageQueue& in_; - MessageQueue& send_out_; - MessageQueue& recv_out_; - - SendPtr send_; - RecvPtr recv_; - }; -} diff --git a/protocols/examples/Makefile.am b/protocols/examples/Makefile.am deleted file mode 100644 index a601192c677..00000000000 --- a/protocols/examples/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -## Process this file with automake to create Makefile.in -## -## $Id$ -## -## This file was generated by MPC. Any changes made directly to -## this file will be lost the next time it is generated. -## -## MPC Command: -## /acebuilds/ACE_wrappers-repository/bin/mwc.pl -include /acebuilds/MPC/config -include /acebuilds/MPC/templates -feature_file /acebuilds/ACE_wrappers-repository/local.features -noreldefs -type automake -exclude build,Kokyu - -SUBDIRS = \ - RMCast diff --git a/protocols/examples/RMCast/Makefile.am b/protocols/examples/RMCast/Makefile.am deleted file mode 100644 index 3a8fba8cf07..00000000000 --- a/protocols/examples/RMCast/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ -## Process this file with automake to create Makefile.in -## -## $Id$ -## -## This file was generated by MPC. Any changes made directly to -## this file will be lost the next time it is generated. -## -## MPC Command: -## ./bin/mwc.pl -include /home/jtc/ACE/ACE-config3/MPC/config -include /home/jtc/ACE/ACE-config3/MPC/templates -type automake ACE.mwc - -SUBDIRS = \ - Send_Msg - diff --git a/protocols/examples/RMCast/Send_Msg/Makefile.am b/protocols/examples/RMCast/Send_Msg/Makefile.am deleted file mode 100644 index a7c9874b08f..00000000000 --- a/protocols/examples/RMCast/Send_Msg/Makefile.am +++ /dev/null @@ -1,56 +0,0 @@ -## Process this file with automake to create Makefile.in - -ACE_BUILDDIR = $(top_builddir) -ACE_ROOT = $(top_srcdir) - -noinst_PROGRAMS = - -## Makefile.Send_Msg_Receiver.am - -if BUILD_EXCEPTIONS - -noinst_PROGRAMS += receiver - -receiver_CPPFLAGS = \ - -I$(ACE_ROOT) \ - -I$(ACE_BUILDDIR) \ - -I$(ACE_ROOT)/protocols - -receiver_SOURCES = \ - Receiver.cpp \ - Protocol.h - -receiver_LDADD = \ - ${ACE_BUILDDIR}/protocols/ace/RMCast/libACE_RMCast.la \ - ${ACE_BUILDDIR}/ace/libACE.la - -endif BUILD_EXCEPTIONS - -## Makefile.Send_Msg_Sender.am - -if BUILD_EXCEPTIONS - -noinst_PROGRAMS += sender - -sender_CPPFLAGS = \ - -I$(ACE_ROOT) \ - -I$(ACE_BUILDDIR) \ - -I$(ACE_ROOT)/protocols - -sender_SOURCES = \ - Sender.cpp \ - Protocol.h - -sender_LDADD = \ - ${ACE_BUILDDIR}/protocols/ace/RMCast/libACE_RMCast.la \ - ${ACE_BUILDDIR}/ace/libACE.la - -endif BUILD_EXCEPTIONS - -## Clean up template repositories, etc. -clean-local: - -rm -f *~ *.bak *.rpo *.sym lib*.*_pure_* core core.* - -rm -f gcctemp.c gcctemp so_locations *.ics - -rm -rf cxx_repository ptrepository ti_files - -rm -rf templateregistry ir.out - -rm -rf ptrepository SunWS_cache Templates.DB diff --git a/protocols/examples/RMCast/Send_Msg/Protocol.h b/protocols/examples/RMCast/Send_Msg/Protocol.h deleted file mode 100644 index 88fdb4d6a51..00000000000 --- a/protocols/examples/RMCast/Send_Msg/Protocol.h +++ /dev/null @@ -1,18 +0,0 @@ -// file : Protocol.h -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#ifndef PROTOCOL_H -#define PROTOCOL_H - -unsigned short const payload_size = 702; -unsigned long const message_count = 80000; - -struct Message -{ - unsigned int sn; - - unsigned short payload[payload_size]; -}; - -#endif // PROTOCOL_H diff --git a/protocols/examples/RMCast/Send_Msg/README b/protocols/examples/RMCast/Send_Msg/README deleted file mode 100644 index b02056bf0cf..00000000000 --- a/protocols/examples/RMCast/Send_Msg/README +++ /dev/null @@ -1,18 +0,0 @@ -In this example SENDER sends a number (defined in Protocol.h, 10000 -by default) of messages to the multicast group. Each message has -an application-level sequence number. RECEIVER tries to receive them -and checks for damaged, lost, and reordered messages. Since reliable -multicast is used there should be no damaged or reordered messages. -There could be some number of lost messages at the beginning, -howevere (standard race condition). - -To run the example start a one or more RECEIVERS, e.g., - -$ ./receiver 224.1.0.1:10000 - -Then start one SENDER: - -$ ./sender 224.1.0.1:10000 - --- -Boris Kolpackov <boris@kolpackov.net> diff --git a/protocols/examples/RMCast/Send_Msg/Receiver.cpp b/protocols/examples/RMCast/Send_Msg/Receiver.cpp deleted file mode 100644 index f86e95192f6..00000000000 --- a/protocols/examples/RMCast/Send_Msg/Receiver.cpp +++ /dev/null @@ -1,205 +0,0 @@ -// file : Receiver.cpp -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#include "ace/Vector_T.h" -#include "ace/Log_Msg.h" -#include "ace/OS_NS_string.h" -#include "ace/Time_Value.h" // ACE_Time_Value -#include "ace/OS_NS_sys_time.h" // gettimeofday - -#include "ace/RMCast/Socket.h" - -#include "Protocol.h" - -typedef -ACE_Vector<unsigned char, ACE_VECTOR_DEFAULT_SIZE> -Status_List; - -class args {}; - -int -ACE_TMAIN (int argc, ACE_TCHAR* argv[]) -{ - try - { - if (argc < 2) throw args (); - - ACE_INET_Addr addr (argv[1]); - - ACE_RMCast::Socket socket (addr, false); - - - Message expected_msg; - expected_msg.sn = 0; - - // VC6 does not know about the new rules. - // - { - for (unsigned short i = 0; i < payload_size; i++) - { - expected_msg.payload[i] = i; - } - } - - Status_List received (message_count); - Status_List damaged (message_count); - Status_List duplicate (message_count); - - // VC6 does not know about new rules. - // - { - for (unsigned int i = 0; i < message_count; ++i) - { - received.push_back (0); - damaged.push_back (0); - duplicate.push_back (0); - } - } - - - Message msg; - bool first (true); - ACE_Time_Value start_time, time; - - while (true) - { - ssize_t s = socket.size (); - - if (first) - { - start_time = ACE_OS::gettimeofday (); - first = false; - } - - if (s == -1 && errno == ENOENT) - { - ACE_ERROR ((LM_ERROR, "unavailable message detected\n")); - - // Receive it. - // - socket.recv (&msg, sizeof (msg)); - - continue; - } - - if (s != sizeof (msg)) - { - ACE_ERROR ((LM_ERROR, "unexpected message size %d, expected %d\n", - s, sizeof (msg))); - continue; - } - - if (socket.recv (&msg, sizeof (msg)) != s) - { - ACE_ERROR ((LM_ERROR, - "recv() reported different size than size()\n")); - continue; - } - - if (received[msg.sn] == 1) - { - duplicate[msg.sn] = 1; - } - else - { - received[msg.sn] = 1; - - if (ACE_OS::memcmp (expected_msg.payload, - msg.payload, - payload_size) != 0) - { - damaged[msg.sn] = 1; - } - } - - if (msg.sn + 1 == message_count) break; - } - - time = ACE_OS::gettimeofday () - start_time; - - unsigned int lost_count (0), damaged_count (0), duplicate_count (0); - - { - for (Status_List::Iterator i (received); !i.done (); i.advance ()) - { - unsigned char* e; - i.next (e); - - if (*e == 0) ++lost_count; - } - } - - - { - for (Status_List::Iterator i (damaged); !i.done (); i.advance ()) - { - unsigned char* e; - i.next (e); - - if (*e == 1) ++damaged_count; - } - } - - - { - for (Status_List::Iterator i (duplicate); !i.done (); i.advance ()) - { - unsigned char* e; - i.next (e); - - if (*e == 1) ++duplicate_count; - } - } - - unsigned long tput = - (sizeof (msg) * message_count) / (time.msec () == 0 ? 1 : time.msec ()); - - ACE_DEBUG ((LM_DEBUG, - "lost : %d\n" - "damaged : %d\n" - "duplicate : %d\n" - "throughput : %d KB/sec\n", - lost_count, - damaged_count, - duplicate_count, - tput)); - - /* - cout << "lost message dump:" << endl; - - unsigned long total = 0; - - for (Status_List::iterator - begin (received.begin ()), i (begin), end (received.end ()); - i != end;) - { - if (*i == 0) - { - unsigned long count = 1; - - for (Status_List::iterator j = i + 1; - j < end && *j == 0; - j++, count++); - - cout << '\t' << i - begin << " : " << count << endl; - - i += count; - total += count; - } - else ++i; - } - - if (total != lost_count) cerr << "trouble" << endl; - */ - - return 0; - } - catch (args const&) - { - ACE_ERROR ((LM_ERROR, - "usage: %s <IPv4 multicast address>:<port>\n", argv[0])); - } - - return 1; -} diff --git a/protocols/examples/RMCast/Send_Msg/Send_Msg.mpc b/protocols/examples/RMCast/Send_Msg/Send_Msg.mpc deleted file mode 100644 index 981df7ec8a7..00000000000 --- a/protocols/examples/RMCast/Send_Msg/Send_Msg.mpc +++ /dev/null @@ -1,17 +0,0 @@ -// -*- MPC -*- -// $Id$ - -project(*Sender) : aceexe, exceptions, rmcast { - avoids = ace_for_tao - exename = sender - Source_Files { - Sender.cpp - } -} -project(*Receiver) : aceexe, exceptions, rmcast { - avoids = ace_for_tao - exename = receiver - Source_Files { - Receiver.cpp - } -} diff --git a/protocols/examples/RMCast/Send_Msg/Sender.cpp b/protocols/examples/RMCast/Send_Msg/Sender.cpp deleted file mode 100644 index 19d570f249c..00000000000 --- a/protocols/examples/RMCast/Send_Msg/Sender.cpp +++ /dev/null @@ -1,51 +0,0 @@ -// file : Sender.cpp -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#include "ace/OS.h" -#include "ace/Log_Msg.h" - -#include "ace/RMCast/Socket.h" - -#include "Protocol.h" - -class args {}; - -int -ACE_TMAIN (int argc, ACE_TCHAR* argv[]) -{ - try - { - if (argc < 2) throw args (); - - ACE_INET_Addr addr (argv[1]); - - ACE_RMCast::Socket socket (addr, false); - - Message msg; - msg.sn = 0; - - for (unsigned short i = 0; i < payload_size; i++) - { - msg.payload[i] = i; - } - - for (; msg.sn < message_count; msg.sn++) - { - socket.send (&msg, sizeof (msg)); - } - - // Keep running in case retransmissions are needed. - // - ACE_OS::sleep (ACE_Time_Value (50, 0)); - - return 0; - } - catch (args const&) - { - ACE_ERROR ((LM_ERROR, - "usage: %s <IPv4 multicast address>:<port>\n", argv[0])); - } - - return 1; -} diff --git a/protocols/examples/example_base.mpb b/protocols/examples/example_base.mpb deleted file mode 100644 index 71b8b3452c6..00000000000 --- a/protocols/examples/example_base.mpb +++ /dev/null @@ -1,8 +0,0 @@ -// -*- MPC -*- -// $Id$ - -// Anything specific to examples could be added here. -// examples.mwc uses the implicit keyword to cause this -// project to be used as the base for all examples, -project : aceexe { -}
\ No newline at end of file diff --git a/protocols/examples/examples.mwc b/protocols/examples/examples.mwc deleted file mode 100644 index 975ad4e462d..00000000000 --- a/protocols/examples/examples.mwc +++ /dev/null @@ -1,14 +0,0 @@ -// -*- MPC -*- -// $Id$ - -workspace { - // This doesn't work quite yet, because not all the projects - // can be created implicitly. To fix this, we can either create - // a separate directory for each separate project, or we can - // add mpc files for C++NPv1/2 and other problem directories. - // The nice thing about splitting up into separate directories is - // that it completely eliminates mpc maintenance. - - implicit = example_base - cmdline += -include $PWD -} diff --git a/protocols/protocols.mwc b/protocols/protocols.mwc deleted file mode 100644 index 5be03124c71..00000000000 --- a/protocols/protocols.mwc +++ /dev/null @@ -1,5 +0,0 @@ -// -*- MPC -*- -// $Id$ - -workspace { -} diff --git a/protocols/tests/RMCast/Protocol.h b/protocols/tests/RMCast/Protocol.h deleted file mode 100644 index c0ecca3dae9..00000000000 --- a/protocols/tests/RMCast/Protocol.h +++ /dev/null @@ -1,18 +0,0 @@ -// file : Protocol.h -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#ifndef PROTOCOL_H -#define PROTOCOL_H - -unsigned short const payload_size = 1234; -unsigned long const message_count = 1000; - -struct Message -{ - unsigned long sn; - - unsigned short payload[payload_size]; -}; - -#endif // PROTOCOL_H diff --git a/protocols/tests/RMCast/RMCast.mpc b/protocols/tests/RMCast/RMCast.mpc deleted file mode 100644 index ebf0d96af3c..00000000000 --- a/protocols/tests/RMCast/RMCast.mpc +++ /dev/null @@ -1,17 +0,0 @@ -// -*- MPC -*- -// $Id$ - -project(*Sender) : aceexe, exceptions, rmcast { - avoids = ace_for_tao - exename = sender - Source_Files { - Sender.cpp - } -} -project(*Receiver) : aceexe, exceptions, rmcast { - avoids = ace_for_tao - exename = receiver - Source_Files { - Receiver.cpp - } -} diff --git a/protocols/tests/RMCast/Receiver.cpp b/protocols/tests/RMCast/Receiver.cpp deleted file mode 100644 index 317dc8e395a..00000000000 --- a/protocols/tests/RMCast/Receiver.cpp +++ /dev/null @@ -1,186 +0,0 @@ -// file : Receiver.cpp -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#include "ace/Vector_T.h" -#include "ace/Log_Msg.h" -#include "ace/OS_NS_string.h" - -#include "ace/RMCast/Socket.h" - -#include "Protocol.h" - -typedef -ACE_Vector<unsigned char, ACE_VECTOR_DEFAULT_SIZE> -Status_List; - -class args {}; - -int -ACE_TMAIN (int argc, ACE_TCHAR* argv[]) -{ - try - { - if (argc < 2) throw args (); - - ACE_INET_Addr addr (argv[1]); - - // Turn on message loss and reordering simulation. - // - ACE_RMCast::Socket socket (addr, false, true); - - - Message expected_msg; - expected_msg.sn = 0; - - // VC6 does not know about the new rules. - // - { - for (unsigned short i = 0; i < payload_size; i++) - { - expected_msg.payload[i] = i; - } - } - - Status_List received (message_count); - Status_List damaged (message_count); - Status_List duplicate (message_count); - - // VC6 does not know about new rules. - // - { - for (unsigned long i = 0; i < message_count; ++i) - { - received.push_back (0); - damaged.push_back (0); - duplicate.push_back (0); - } - } - - - Message msg; - - while (true) - { - ssize_t s = socket.size (); - - if (s == -1 && errno == ENOENT) - { - ACE_ERROR ((LM_ERROR, "unavailable message detected\n")); - - // Receive it. - // - socket.recv (&msg, sizeof (msg)); - - continue; - } - - if (s != sizeof (msg)) - { - ACE_ERROR ((LM_ERROR, "unexpected message size %d, expected %d\n", - s, sizeof (msg))); - continue; - } - - if (socket.recv (&msg, sizeof (msg)) != s) - { - ACE_ERROR ((LM_ERROR, - "recv() reported different size than size()\n")); - continue; - } - - if (received[msg.sn] == 1) - { - duplicate[msg.sn] = 1; - } - else - { - received[msg.sn] = 1; - - if (ACE_OS::memcmp (expected_msg.payload, - msg.payload, - payload_size) != 0) - { - damaged[msg.sn] = 1; - } - } - - if (msg.sn + 1 == message_count) break; - } - - unsigned long lost_count (0), damaged_count (0), duplicate_count (0); - - { - for (Status_List::Iterator i (received); !i.done (); i.advance ()) - { - unsigned char* e; - i.next (e); - - if (*e == 0) ++lost_count; - } - } - - - { - for (Status_List::Iterator i (damaged); !i.done (); i.advance ()) - { - unsigned char* e; - i.next (e); - - if (*e == 1) ++damaged_count; - } - } - - - { - for (Status_List::Iterator i (duplicate); !i.done (); i.advance ()) - { - unsigned char* e; - i.next (e); - - if (*e == 1) ++duplicate_count; - } - } - - ACE_DEBUG ((LM_DEBUG, - "lost : %d\n" - "damaged : %d\n" - "duplicate : %d\n", - lost_count, - damaged_count, - duplicate_count)); - - if (damaged_count != 0 || duplicate_count != 0) - return 1; - - if (lost_count != 0) - { - // It is ok to lose some number of messages at the beginning. - // - unsigned long count (0); - - for (Status_List::Iterator i (received); !i.done (); i.advance ()) - { - unsigned char* e; - i.next (e); - - if (*e == 0) - ++count; - else - break; // Seen first ok message. - } - - if (lost_count != count) - return 1; - } - - return 0; - } - catch (args const&) - { - ACE_ERROR ((LM_ERROR, - "usage: %s <IPv4 multicast address>:<port>\n", argv[0])); - } - - return 1; -} diff --git a/protocols/tests/RMCast/Sender.cpp b/protocols/tests/RMCast/Sender.cpp deleted file mode 100644 index 85340b6b4a0..00000000000 --- a/protocols/tests/RMCast/Sender.cpp +++ /dev/null @@ -1,53 +0,0 @@ -// file : Sender.cpp -// author : Boris Kolpackov <boris@kolpackov.net> -// cvs-id : $Id$ - -#include "ace/OS.h" -#include "ace/Log_Msg.h" - -#include "ace/RMCast/Socket.h" - -#include "Protocol.h" - -class args {}; - -int -ACE_TMAIN (int argc, ACE_TCHAR* argv[]) -{ - try - { - if (argc < 2) throw args (); - - ACE_INET_Addr addr (argv[1]); - - // Turn on message loss and reordering simulation. - // - ACE_RMCast::Socket socket (addr, false, true); - - Message msg; - msg.sn = 0; - - for (unsigned short i = 0; i < payload_size; i++) - { - msg.payload[i] = i; - } - - for (; msg.sn < message_count; msg.sn++) - { - socket.send (&msg, sizeof (msg)); - } - - // Keep running in case retransmissions are needed. - // - ACE_OS::sleep (ACE_Time_Value (60, 0)); - - return 0; - } - catch (args const&) - { - ACE_ERROR ((LM_ERROR, - "usage: %s <IPv4 multicast address>:<port>\n", argv[0])); - } - - return 1; -} diff --git a/protocols/tests/RMCast/run_test.pl b/protocols/tests/RMCast/run_test.pl deleted file mode 100755 index 699bcd103e9..00000000000 --- a/protocols/tests/RMCast/run_test.pl +++ /dev/null @@ -1,34 +0,0 @@ -eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' - & eval 'exec perl -S $0 $argv:q' - if 0; - -# $Id$ -# -*- perl -*- - -use lib '../../../bin'; -use PerlACE::Run_Test; - -$status = 0; - -$sender = new PerlACE::Process ("sender", "224.1.2.3:12345"); -$receiver = new PerlACE::Process ("receiver", "224.1.2.3:12345"); - - -$receiver->Spawn (); - -# Wait for receiver to start. -# -sleep ($PerlACE::wait_interval_for_process_creation); - -$sender->Spawn (); - -$status = $receiver->WaitKill (20); - -if ($status != 0) { - print STDERR "ERROR: receiver returned $status\n"; - $status = 1; -} - -$sender->Kill (); - -exit $status; diff --git a/protocols/tests/tests.mwc b/protocols/tests/tests.mwc deleted file mode 100644 index dd297256b34..00000000000 --- a/protocols/tests/tests.mwc +++ /dev/null @@ -1,5 +0,0 @@ -// -*- MPC -*- -// $Id$ - -workspace { -} |