diff options
Diffstat (limited to 'ace/Handle_Set.inl')
-rw-r--r-- | ace/Handle_Set.inl | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/ace/Handle_Set.inl b/ace/Handle_Set.inl new file mode 100644 index 00000000000..d00fb384863 --- /dev/null +++ b/ace/Handle_Set.inl @@ -0,0 +1,186 @@ +/* -*- C++ -*- */ +// $Id$ + +// Handle_Set.i +#include "ace/Log_Msg.h" + +// todo: This should be cleaned up a bit. +// memset for FD_ZERO on OpenBSD and Solaris w/ gcc 2.95.3 +#include "ace/os_include/os_string.h" + +// FreeBSD 4.8-RC? for bzero() used by FD_ZERO +#include "ace/os_include/os_strings.h" + +// IRIX5 defines bzero() in this odd file... used by FD_ZERO +#if defined (ACE_HAS_BSTRING) +# include /**/ <bstring.h> +#endif /* ACE_HAS_BSTRING */ + +// AIX defines bzero() in this odd file... used by FD_ZERO +#if defined (ACE_HAS_STRINGS) +# include "ace/os_include/os_strings.h" +#endif /* ACE_HAS_STRINGS */ + +// Initialize the bitmask to all 0s and reset the associated fields. + +ACE_INLINE void +ACE_Handle_Set::reset (void) +{ + ACE_TRACE ("ACE_Handle_Set::reset"); + this->max_handle_ = + ACE_INVALID_HANDLE; +#if defined (ACE_HAS_BIG_FD_SET) + this->min_handle_ = + NUM_WORDS * WORDSIZE; +#endif /* ACE_HAS_BIG_FD_SET */ + this->size_ = 0; + // #if !defined (ACE_HAS_BIG_FD_SET) Why is this here? -Steve Huston + FD_ZERO (&this->mask_); + // #endif /* ACE_HAS_BIG_FD_SET */ +} + +#if defined (ACE_HAS_BIG_FD_SET) +ACE_INLINE ACE_Handle_Set & +ACE_Handle_Set::operator = (const ACE_Handle_Set &rhs) +{ + ACE_TRACE ("ACE_Handle_Set::operator ="); + + if (rhs.size_ > 0) + { + this->size_ = + rhs.size_; + this->max_handle_ = + rhs.max_handle_; + this->min_handle_ = + rhs.min_handle_; + this->mask_ = + rhs.mask_; + } + else + this->reset (); + + return *this; +} +#endif /* ACE_HAS_BIG_FD_SET */ + +// Returns the number of the large bit. + +ACE_INLINE ACE_HANDLE +ACE_Handle_Set::max_set (void) const +{ + ACE_TRACE ("ACE_Handle_Set::max_set"); + return this->max_handle_; +} + +// Checks whether handle is enabled. + +ACE_INLINE int +ACE_Handle_Set::is_set (ACE_HANDLE handle) const +{ + ACE_TRACE ("ACE_Handle_Set::is_set"); +#if defined (ACE_HAS_BIG_FD_SET) + return FD_ISSET (handle, + &this->mask_) + && this->size_ > 0; +#else + return FD_ISSET (handle, + &this->mask_); +#endif /* ACE_HAS_BIG_FD_SET */ +} + +// Enables the handle. + +ACE_INLINE void +ACE_Handle_Set::set_bit (ACE_HANDLE handle) +{ + ACE_TRACE ("ACE_Handle_Set::set_bit"); + if ((handle != ACE_INVALID_HANDLE) + && (!this->is_set (handle))) + { +#if defined (ACE_WIN32) + FD_SET ((SOCKET) handle, + &this->mask_); + this->size_++; +#else /* ACE_WIN32 */ +#if defined (ACE_HAS_BIG_FD_SET) + if (this->size_ == 0) + FD_ZERO (&this->mask_); + + if (handle < this->min_handle_) + this->min_handle_ = handle; +#endif /* ACE_HAS_BIG_FD_SET */ + + FD_SET (handle, + &this->mask_); + this->size_++; + + if (handle > this->max_handle_) + this->max_handle_ = handle; +#endif /* ACE_WIN32 */ + } +} + +// Disables the handle. + +ACE_INLINE void +ACE_Handle_Set::clr_bit (ACE_HANDLE handle) +{ + ACE_TRACE ("ACE_Handle_Set::clr_bit"); + + if ((handle != ACE_INVALID_HANDLE) && + (this->is_set (handle))) + { + FD_CLR ((ACE_SOCKET) handle, + &this->mask_); + this->size_--; + +#if !defined (ACE_WIN32) + if (handle == this->max_handle_) + this->set_max (this->max_handle_); +#endif /* !ACE_WIN32 */ + } +} + +// Returns a count of the number of enabled bits. + +ACE_INLINE int +ACE_Handle_Set::num_set (void) const +{ + ACE_TRACE ("ACE_Handle_Set::num_set"); +#if defined (ACE_WIN32) + return this->mask_.fd_count; +#else /* !ACE_WIN32 */ + return this->size_; +#endif /* ACE_WIN32 */ +} + +// Returns a pointer to the underlying fd_set. + +ACE_INLINE +ACE_Handle_Set::operator fd_set *() +{ + ACE_TRACE ("ACE_Handle_Set::operator fd_set *"); + + if (this->size_ > 0) + return (fd_set *) &this->mask_; + else + return (fd_set *) 0; +} + +// Returns a pointer to the underlying fd_set. + +ACE_INLINE fd_set * +ACE_Handle_Set::fdset (void) +{ + ACE_TRACE ("ACE_Handle_Set::fdset"); + + if (this->size_ > 0) + return (fd_set *) &this->mask_; + else + return (fd_set *) 0; +} + +ACE_INLINE +ACE_Handle_Set_Iterator::~ACE_Handle_Set_Iterator (void) +{ +} |