TAO_ECG_CDR_Message_Receiver::Requests Class Reference

#include <ECG_CDR_Message_Receiver.h>

Collaboration diagram for TAO_ECG_CDR_Message_Receiver::Requests:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 Requests (void)
 ~Requests (void)
int init (size_t size, size_t min_purge_count)
 Allocates and initializes <fragmented_requests_>.
TAO_ECG_UDP_Request_Entry ** get_request (CORBA::ULong request_id)

Private Member Functions

void purge_requests (CORBA::ULong purge_first, CORBA::ULong purge_last)
Requestsoperator= (const Requests &rhs)
 Requests (const Requests &rhs)

Private Attributes

TAO_ECG_UDP_Request_Entry ** fragmented_requests_
size_t size_
 Size of <fragmented_requests_> array.
size_t min_purge_count_
 Minimum range shifting amount.
CORBA::ULong id_range_low_
CORBA::ULong id_range_high_

Detailed Description

Once init() has been called: Invariant: id_range_high_- id_range_low_ == size_ - 1

Definition at line 259 of file ECG_CDR_Message_Receiver.h.


Constructor & Destructor Documentation

TAO_ECG_CDR_Message_Receiver::Requests::Requests ( void   ) 

TAO_ECG_CDR_Message_Receiver::Requests::~Requests ( void   ) 

Definition at line 159 of file ECG_CDR_Message_Receiver.cpp.

References fragmented_requests_, id_range_high_, id_range_low_, TAO_ECG_CDR_Message_Receiver::Request_Completed_, and size_.

00160 {
00161   for (size_t i = 0; i < this->size_; ++i)
00162     {
00163       TAO_ECG_UDP_Request_Entry* request =
00164         this->fragmented_requests_[i];
00165 
00166       if (request != &TAO_ECG_CDR_Message_Receiver::Request_Completed_)
00167         delete request;
00168     }
00169 
00170   delete [] this->fragmented_requests_;
00171 
00172   this->fragmented_requests_ = 0;
00173   this->size_ = 0;
00174   this->id_range_low_ = 0;
00175   this->id_range_high_ = 0;
00176 }

TAO_ECG_CDR_Message_Receiver::Requests::Requests ( const Requests rhs  )  [private]


Member Function Documentation

TAO_ECG_UDP_Request_Entry ** TAO_ECG_CDR_Message_Receiver::Requests::get_request ( CORBA::ULong  request_id  ) 

If <request_id> < <id_range_low> return 0. If <request_id> > <id_range_high>, shift the range so it includes <request_id>, purging incomplete requests as needed.

Definition at line 179 of file ECG_CDR_Message_Receiver.cpp.

References fragmented_requests_, id_range_high_, id_range_low_, min_purge_count_, purge_requests(), and size_.

00180 {
00181   if (request_id < this->id_range_low_)
00182     // <request_id> is below the current range.
00183     {
00184       return 0;
00185     }
00186 
00187   if (request_id > this->id_range_high_)
00188     // <request_id> is above the current range - need to shift the range
00189     // to include it.
00190     {
00191       CORBA::ULong new_slots_needed = request_id - this->id_range_high_;
00192 
00193       if (new_slots_needed < this->min_purge_count_)
00194         new_slots_needed = this->min_purge_count_;
00195 
00196       if (new_slots_needed > this->size_)
00197         // Shifting the range by more than the size of array.
00198         {
00199           this->purge_requests (this->id_range_low_, this->id_range_high_);
00200           this->id_range_high_ = request_id;
00201           this->id_range_low_ = request_id - this->size_ + 1;
00202         }
00203       else
00204         {
00205           this->purge_requests (this->id_range_low_,
00206                                 this->id_range_low_ + new_slots_needed - 1);
00207           this->id_range_high_ += new_slots_needed;
00208           this->id_range_low_ += new_slots_needed;
00209         }
00210     }
00211 
00212   // Return array location for <request_id>.
00213   int index = request_id % this->size_;
00214   return this->fragmented_requests_ + index;
00215 }

int TAO_ECG_CDR_Message_Receiver::Requests::init ( size_t  size,
size_t  min_purge_count 
)

Allocates and initializes <fragmented_requests_>.

Definition at line 135 of file ECG_CDR_Message_Receiver.cpp.

References ACE_NEW_RETURN, id_range_high_, id_range_low_, min_purge_count_, and size_.

00137 {
00138   // Already initialized.
00139   if (this->fragmented_requests_)
00140     return -1;
00141 
00142   ACE_NEW_RETURN (this->fragmented_requests_,
00143                   TAO_ECG_UDP_Request_Entry*[size],
00144                   -1);
00145 
00146   this->size_ = size;
00147   this->id_range_low_ = 0;
00148   this->id_range_high_ = size - 1;
00149   this->min_purge_count_ = min_purge_count;
00150 
00151   for (size_t i = 0; i < size; ++i)
00152     {
00153       this->fragmented_requests_[i] = 0;
00154     }
00155 
00156   return 0;
00157 }

Requests& TAO_ECG_CDR_Message_Receiver::Requests::operator= ( const Requests rhs  )  [private]

void TAO_ECG_CDR_Message_Receiver::Requests::purge_requests ( CORBA::ULong  purge_first,
CORBA::ULong  purge_last 
) [private]

Delete any outstanding requests with ids in the range [<purge_first>, <purge_last>] from <fragmented_requests> and and reset their slots.

Definition at line 219 of file ECG_CDR_Message_Receiver.cpp.

References fragmented_requests_, and TAO_ECG_CDR_Message_Receiver::Request_Completed_.

Referenced by get_request().

00222 {
00223   for (CORBA::ULong i = purge_first; i <= purge_last; ++i)
00224     {
00225       size_t index = i % this->size_;
00226       if (this->fragmented_requests_[index]
00227           != &TAO_ECG_CDR_Message_Receiver::Request_Completed_)
00228         {
00229           delete this->fragmented_requests_[index];
00230         }
00231       this->fragmented_requests_[index] = 0;
00232     }
00233 }


Member Data Documentation

TAO_ECG_UDP_Request_Entry** TAO_ECG_CDR_Message_Receiver::Requests::fragmented_requests_ [private]

Array, used in a circular fashion, that stores partially received requests (and info on which requests have been fully received and processed) for a range of request ids.

Definition at line 293 of file ECG_CDR_Message_Receiver.h.

Referenced by get_request(), purge_requests(), and ~Requests().

CORBA::ULong TAO_ECG_CDR_Message_Receiver::Requests::id_range_high_ [private]

The range of request ids, currently represented in <fragmented_requests>.

Definition at line 302 of file ECG_CDR_Message_Receiver.h.

Referenced by get_request(), init(), and ~Requests().

CORBA::ULong TAO_ECG_CDR_Message_Receiver::Requests::id_range_low_ [private]

The range of request ids, currently represented in <fragmented_requests>.

Definition at line 301 of file ECG_CDR_Message_Receiver.h.

Referenced by get_request(), init(), and ~Requests().

size_t TAO_ECG_CDR_Message_Receiver::Requests::min_purge_count_ [private]

Minimum range shifting amount.

Definition at line 306 of file ECG_CDR_Message_Receiver.h.

Referenced by get_request(), and init().

size_t TAO_ECG_CDR_Message_Receiver::Requests::size_ [private]

Size of <fragmented_requests_> array.

Definition at line 296 of file ECG_CDR_Message_Receiver.h.

Referenced by get_request(), init(), and ~Requests().


The documentation for this class was generated from the following files:
Generated on Tue Feb 2 17:44:38 2010 for TAO_RTEvent by  doxygen 1.4.7