IOSource API changes for new loop architecture

- Removed GetFD and NextTimestamp methods
- Removed concept of idle sources
- Renamed Init to InitSource to avoid a name clash with the thread code
- Added GetNextTimeout method

This commit also removes the FD_Set file since it's no longer used
This commit is contained in:
Tim Wojtulewicz 2019-11-26 12:03:45 -07:00
parent eee2abf729
commit a00d11e44d
2 changed files with 23 additions and 155 deletions

View file

@ -1,101 +0,0 @@
#pragma once
#include <set>
#include <sys/select.h>
namespace iosource {
/**
* A container holding a set of file descriptors.
*/
class FD_Set {
public:
/**
* Constructor. The set is initially empty.
*/
FD_Set() : max(-1), fds()
{ }
/**
* Insert a file descriptor in to the set.
* @param fd the fd to insert in the set.
* @return false if fd was already in the set, else true.
*/
bool Insert(int fd)
{
if ( max < fd )
max = fd;
return fds.insert(fd).second;
}
/**
* Inserts all the file descriptors from another set in to this one.
* @param other a file descriptor set to merge in to this one.
*/
void Insert(const FD_Set& other)
{
for ( std::set<int>::const_iterator it = other.fds.begin();
it != other.fds.end(); ++it )
Insert(*it);
}
/**
* Empties the set.
*/
void Clear()
{ max = -1; fds.clear(); }
/**
* Insert file descriptors in to a fd_set for use with select().
* @return the greatest file descriptor inserted.
*/
int Set(fd_set* set) const
{
for ( std::set<int>::const_iterator it = fds.begin(); it != fds.end();
++it )
FD_SET(*it, set);
return max;
}
/**
* @return Whether a file descriptor belonging to this set is within the
* fd_set arugment.
*/
bool Ready(fd_set* set) const
{
for ( std::set<int>::const_iterator it = fds.begin(); it != fds.end();
++it )
{
if ( FD_ISSET(*it, set) )
return true;
}
return false;
}
/**
* @return whether any file descriptors have been added to the set.
*/
bool Empty() const
{
return fds.empty();
}
/**
* @return the greatest file descriptor of all that have been added to the
* set, or -1 if the set is empty.
*/
int Max() const
{
return max;
}
private:
int max;
std::set<int> fds;
};
} // namespace bro

View file

@ -7,8 +7,6 @@ extern "C" {
} }
#include <string> #include <string>
#include "FD_Set.h"
#include "Timer.h"
namespace iosource { namespace iosource {
@ -21,28 +19,28 @@ public:
/** /**
* Constructor. * Constructor.
*/ */
IOSource() { idle = false; closed = false; } IOSource() { closed = false; }
/** /**
* Destructor. * Destructor.
*/ */
virtual ~IOSource() {} virtual ~IOSource() {}
/**
* Returns true if source has nothing ready to process.
*/
bool IsIdle() const { return idle; }
/** /**
* Returns true if more data is to be expected in the future. * Returns true if more data is to be expected in the future.
* Otherwise, source may be removed. * Otherwise, source may be removed.
*/ */
bool IsOpen() const { return ! closed; } bool IsOpen() const { return ! closed; }
/**
* Returns true if this is a packet source.
*/
virtual bool IsPacketSource() const { return false; }
/** /**
* Initializes the source. Can be overwritten by derived classes. * Initializes the source. Can be overwritten by derived classes.
*/ */
virtual void Init() { } virtual void InitSource() { }
/** /**
* Finalizes the source when it's being closed. Can be overwritten by * Finalizes the source when it's being closed. Can be overwritten by
@ -51,50 +49,29 @@ public:
virtual void Done() { } virtual void Done() { }
/** /**
* Returns select'able file descriptors for this source. Leaves the * Return the next timeout value for this source. This should be
* passed values untouched if not available. * overridden by source classes where they have a timeout value
* that can wake up the poll.
* *
* @param read Pointer to container where to insert a read descriptor. * Must be overriden by derived classes.
* *
* @param write Pointer to container where to insert a write descriptor. * @return A value for the next time that the source thinks the
* * poll should time out in seconds from the current time. Return
* @param except Pointer to container where to insert a except descriptor. * -1 if this source should not be considered. This should be a
* a value relative to network_time, not an absolute time.
*/ */
virtual void GetFds(FD_Set* read, FD_Set* write, FD_Set* except) = 0; virtual double GetNextTimeout() = 0;
/** /**
* Returns the timestamp (in \a global network time) associated with * Processes and consumes next data item. This will be called by
* next data item from this source. If the source wants the data * net_run when this IOSource has been marked ready.
* item to be processed with a local network time, it sets the
* argument accordingly.
*
* This method will be called only when either IsIdle() returns
* false, or select() on one of the fds returned by GetFDs()
* indicates that there's data to process.
*
* Must be overridden by derived classes.
*
* @param network_time A pointer to store the \a local network time
* associated with the next item (as opposed to global network time).
*
* @return The global network time of the next entry, or a value
* smaller than zero if none is available currently.
*/
virtual double NextTimestamp(double* network_time) = 0;
/**
* Processes and consumes next data item.
*
* This method will be called only when either IsIdle() returns
* false, or select() on one of the fds returned by GetFDs()
* indicates that there's data to process.
* *
* Must be overridden by derived classes. * Must be overridden by derived classes.
*/ */
virtual void Process() = 0; virtual void Process() = 0;
/** /**
* Returns the tag of the timer manafger associated with the last * Returns the tag of the timer manager associated with the last
* procesees data item. * procesees data item.
* *
* Can be overridden by derived classes. * Can be overridden by derived classes.
@ -102,25 +79,18 @@ public:
* @return The tag, or null for the global timer manager. * @return The tag, or null for the global timer manager.
* *
*/ */
virtual TimerMgr::Tag* GetCurrentTag() { return 0; } virtual std::string* GetCurrentTag() { return 0; }
/** /**
* Returns a descriptual tag representing the source for debugging. * Returns a descriptive tag representing the source for debugging.
* *
* Can be overridden by derived classes. * Must be overridden by derived classes.
* *
* @return The debugging name. * @return The debugging name.
*/ */
virtual const char* Tag() = 0; virtual const char* Tag() = 0;
protected: protected:
/*
* Callback for derived classes to call when they have gone dry
* temporarily.
*
* @param is_idle True if the source is idle currently.
*/
void SetIdle(bool is_idle) { idle = is_idle; }
/* /*
* Callback for derived class to call when they have shutdown. * Callback for derived class to call when they have shutdown.
@ -130,7 +100,6 @@ protected:
void SetClosed(bool is_closed) { closed = is_closed; } void SetClosed(bool is_closed) { closed = is_closed; }
private: private:
bool idle;
bool closed; bool closed;
}; };