30#include <sys/select.h>
82 if (fcntl(
m_evpipe[0], F_SETFL, tmp | O_NONBLOCK) == -1)
131 if (len !=
sizeof(
zero))
133 NS_LOG_WARN(
"incomplete write(): " << std::strerror(errno));
180 fd_set readfds = rfds;
182 r = select(nfds, &readfds,
nullptr,
nullptr,
nullptr);
183 if (r == -1 && errno != EINTR)
188 if (FD_ISSET(
m_evpipe[0], &readfds))
194 ssize_t len = read(
m_evpipe[0], buf,
sizeof(buf));
201 if (errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK)
219 if (FD_ISSET(
m_fd, &readfds))
229 else if (
data.m_len > 0)
void Nullify()
Discard the implementation, set it to null.
bool IsRunning() const
This method is syntactic sugar for !IsExpired().
int m_evpipe[2]
Pipe used to signal events between threads.
void Run()
The asynchronous function which performs the read.
void Stop()
Stop the read thread and reset internal state.
bool m_stop
Signal the read thread to stop.
EventId m_destroyEvent
The event scheduled for destroy time which will invoke DestroyEvent and halt the thread.
virtual FdReader::Data DoRead()=0
The read implementation.
void Start(int fd, Callback< void, uint8_t *, ssize_t > readCallback)
Start a new read thread.
void DestroyEvent()
Event handler scheduled for destroy time to halt the thread.
Callback< void, uint8_t *, ssize_t > m_readCallback
The main thread callback function to invoke when we have data.
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.
void Ref() const
Increment the reference count.
void Unref() const
Decrement 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.
ns3::FdReader declaration.
#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.