22 #include <sys/select.h>
48 : m_fd (-1), m_readCallback (0), m_stop (false),
82 if (fcntl (
m_evpipe[0], F_SETFL, tmp | O_NONBLOCK) == -1)
130 if (len !=
sizeof (
zero))
132 NS_LOG_WARN (
"incomplete write(): " << std::strerror (errno));
172 FD_SET (
m_fd, &rfds);
178 fd_set readfds = rfds;
180 r = select (nfds, &readfds, NULL, NULL, NULL);
181 if (r == -1 && errno != EINTR)
186 if (FD_ISSET (
m_evpipe[0], &readfds))
192 ssize_t len = read (
m_evpipe[0], buf,
sizeof (buf));
199 if (errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK)
217 if (FD_ISSET (
m_fd, &readfds))
227 else if (
data.m_len > 0)
void Nullify(void)
Discard the implementation, set it to null.
bool IsRunning(void) const
This method is syntactic sugar for !IsExpired().
int m_evpipe[2]
Pipe used to signal events between threads.
void Stop(void)
Stop the read thread and reset internal state.
bool m_stop
Signal the read thread to stop.
virtual FdReader::Data DoRead(void)=0
The read implementation.
void DestroyEvent(void)
Event handler scheduled for destroy time to halt the thread.
EventId m_destroyEvent
The event scheduled for destroy time which will invoke DestroyEvent and halt the thread.
void Start(int fd, Callback< void, uint8_t *, ssize_t > readCallback)
Start a new read thread.
void Run(void)
The asynchronous function which performs the read.
std::thread m_readThread
The thread doing the read, created and launched by Start().
int m_fd
The file descriptor to read from.
virtual ~FdReader()
Destructor.
Callback< void, uint8_t *, ssize_t > m_readCallback
The main thread callback function to invoke when we have data.
void Unref(void) const
Decrement the reference count.
void Ref(void) const
Increment the reference count.
static EventId ScheduleDestroy(FUNC f, Ts &&... args)
Schedule an event to run at the end of the simulation, when Simulator::Destroy() is called.
NS_FATAL_x macro definitions.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
ns3::SimpleRefCount declaration and template implementation.
ns3::Simulator declaration.
A structure representing data read.
ns3::FdReader declaration.