Files
cdev-1.7.2n/include/cdevFdSet.h
2022-12-13 12:44:04 +01:00

182 lines
4.3 KiB
C++

//-----------------------------------------------------------------------------
// Copyright (c) 1994,1995 Southeastern Universities Research Association,
// Continuous Electron Beam Accelerator Facility
//
// This software was developed under a United States Government license
// described in the NOTICE file included as part of this distribution.
//
//-----------------------------------------------------------------------------
//
// Description:
// File Descriptor Mask Class (Based On ACE Handler_Set)
//
// Author: Jie Chen
//
// Revision History:
// cdevFdSet.h,v
// Revision 1.6 1997/03/26 18:34:58 akers
// Ongoing development
//
// Revision 1.5 1996/10/01 13:58:23 akers
// Changes to support AIX
//
// Revision 1.4 1996/09/19 18:50:06 akers
// Included time.h in order to match redefinition of fd_set to __fd_set.
//
// Revision 1.3 1995/12/15 15:08:06 chen
// Add VMS Fix
//
// Revision 1.2 1995/10/05 16:30:12 chen
// Fix for VMS
//
// Revision 1.1.1.1 1995/06/16 17:14:02 epics
// initial import of cdev
//
//
#ifndef _CDEV_FDSET_H
#define _CDEV_FDSET_H
#include <stdio.h>
#include <string.h>
#include <cdevSpec.h>
#ifdef _WIN32
#include <winsock2.h>
#include <time.h>
#else
#include <sys/time.h>
#ifdef __VMS
#ifdef _TGV_MULTINET
// Under TGV multinet and VMS, if you want sys/types.h you need to have
// types.h already pulled in because sys/types.h makes it look like types.h
// is loaded. Then when types.h does get loaded, it is ignored because it
// looks like it is already loaded -- Mr. Danial Van Olst
#include <types.h>
#endif
#endif
#ifdef __VMS
#ifdef _TGV_MULTINET
// Under TGV Multinet and VMS, the file sys/param.h does not define
// NOFILE (max number of open files per process).
// FD_SETSIZE seems to be the correct value for NOFILE.
// See Multinet's sys/types.h file for more info on FD_SETSIZE.
// - Daniel Van Olst
#ifndef NOFILE
#define NOFILE FD_SETSIZE
#endif /* NOFILE not defined. */
#endif /* _TGV_MULTINET defined. */
#endif /* __VMS defined. */
#include <sys/types.h>
#include <sys/param.h>
/* The header sys/select.h must be included on AIX machines */
/* in order to define the FD_ZERO macro. */
#ifdef _AIX
#include <sys/select.h>
#endif
/* This wrapper design is not very portable to DEC OSF/1 */
/* I had to redefine NFDBITS to 32. On OSF/1 NFDBITS is a */
/* macro that expands to (sizeof(fd_mask)*8) which is 4096 by */
/* default. This was an inappropriate value for defining the */
/* MSB_MASK default value. Any ideas? The workaround is a */
/* pretty severe restriction for OSF/1. DJT */
/*#if defined (__osf__) */
/*#define NFDBITS 32 */
/*#endif */
#endif
class CDEV_CLASS_SPEC cdevFdSet
{
// = TITLE
// C++ wrapper for the BSD fd_set abstraction.
//
// = DESCRIPTION
//
friend class cdevFdSet_Iterator;
public:
// = Initialization and termination.
cdevFdSet (void);
cdevFdSet (const fd_set &mask);
// = Methods for manipulating bitsets.
void reset (void);
int is_set (int) const;
void set_bit (int);
void clr_bit (int);
int num_set (void) const;
int max_set (void) const;
int pr_mask ( FILE * fp = stdout );
void sync (int max = FD_SETSIZE);
operator fd_set *( void ) { return &mask_; }
private:
int size_;
int max_handle_;
fd_set mask_;
enum
{
#ifdef _WIN32
MAX_SIZE = FD_SETSIZE,
#else
MAX_SIZE = NOFILE,
WORD_SIZE = NFDBITS,
NUM_WORDS = howmany (NOFILE, NFDBITS),
#ifdef __DECCXX
// DECC warns about integer overflow if 1 used because 1 is signed
MSB_MASK = ~(1U << (NFDBITS - 1))
#elif defined (CDEV_HAS_64BIT_LONGS)
MSB_MASK = ~(1UL << (NFDBITS - 1))
#else
MSB_MASK = ~(1 << (NFDBITS - 1))
#endif
#endif
};
int count_bits (unsigned long n) const;
void set_max (int max);
static const char nbits_[256];
};
class cdevFdSet_Iterator
// = TITLE
// Iterator for the cdevFdSet abstraction.
//
// = DESCRIPTION
//
{
public:
cdevFdSet_Iterator (cdevFdSet &);
int operator ()(void);
void operator++ (void);
private:
cdevFdSet &fds_;
#ifdef _WIN32
/* index into fd_array[FD_SETSIZE] */
unsigned int index_;
#else
/* index into fd_mask array */
int index_;
#endif
/* current FD value = bit number in the long mask */
/* not used in the WIN32 platform */
int num_;
#ifndef _WIN32
fd_mask val_;
#endif
};
#endif