34class GNet::FutureEventImp :
public EventHandler
37 FutureEventImp( FutureEventHandler & , EventState ) ;
40 ~FutureEventImp()
override ;
43 static bool send( HANDLE ,
bool ) noexcept ;
49 HANDLE handle() noexcept ;
53 FutureEventImp( const FutureEventImp & ) = delete ;
54 FutureEventImp( FutureEventImp && ) = delete ;
55 FutureEventImp & operator=( const FutureEventImp & ) = delete ;
56 FutureEventImp & operator=( FutureEventImp && ) = delete ;
59 void readEvent() override ;
62 static
int init(
int ) ;
68 ~Fd() {
if(fd!=-1) ::close(fd) ; }
69 Fd & operator=(
int fd_ ) { fd = fd_ ;
return *this ; }
71 Fd(
const Fd & ) = delete ;
72 Fd( Fd && ) = delete ;
73 Fd & operator=(
const Fd & ) = delete ;
74 Fd & operator=( Fd && ) = delete ;
78 FutureEventHandler & m_handler ;
81 bool m_triggered {
false} ;
84GNet::FutureEventImp::FutureEventImp( FutureEventHandler & handler , EventState es ) :
87 std::array<int,2U> fds {{ -1 , -1 }} ;
88 int rc = ::socketpair( AF_UNIX , SOCK_DGRAM , 0 , fds.data() ) ;
94 m_read = init( fds[0] ) ;
95 m_write = init( fds[1] ) ;
96 EventLoop::instance().addRead( Descriptor(m_read.fd) , *
this , es ) ;
99int GNet::FutureEventImp::init(
int fd )
101 GDEF_IGNORE_RETURN ::fcntl( fd , F_SETFL , ::fcntl(fd,F_GETFL) | O_NONBLOCK ) ;
105GNet::FutureEventImp::~FutureEventImp()
109 if( EventLoop::exists() )
110 EventLoop::instance().dropRead( Descriptor(m_read.fd) ) ;
114HANDLE GNet::FutureEventImp::handle() noexcept
117 std::swap( m_write.fd , fd ) ;
118 return static_cast<HANDLE
>(fd) ;
121void GNet::FutureEventImp::receive()
124 GDEF_IGNORE_RETURN ::recv( m_read.fd , &c , 1 , 0 ) ;
127bool GNet::FutureEventImp::send( HANDLE handle ,
bool close )
noexcept
129 int fd =
static_cast<int>(handle) ;
134 const bool ok = rc == 1 ;
144 m_handler.onFutureEvent() ;
151 m_imp(
std::make_unique<FutureEventImp>(handler,es))
160 return FutureEventImp::send( handle , close ) ;
165 return m_imp->handle() ;
virtual void readEvent()
Called for a read event.
A lightweight object containing an ExceptionHandler pointer, optional ExceptionSource pointer and opt...
A callback interface for GNet::FutureEvent.
FutureEvent(FutureEventHandler &, EventState)
Constructor. Installs itself in the event loop.
static bool send(HANDLE handle, bool close=true) noexcept
Pokes an event into the main event loop so that the FutureEventHandler callback is called asynchronou...
HANDLE handle() noexcept
Extracts a handle that can be passed between threads and used in send().
~FutureEvent()
Destructor.
static ssize_t send(SOCKET, const void *, std::size_t, int flags) noexcept
A send() wrapper.
static std::string strerror(int errno_)
Translates an 'errno' value into a meaningful diagnostic string.
static int errno_(const SignalSafe &=G::SignalSafe()) noexcept
Returns the process's current 'errno' value.