From: pk910 Date: Thu, 6 Mar 2014 14:50:39 +0000 (+0100) Subject: [IOMultiplexerV2] tidied up _IOSocket socket_flag definitions and added possibility... X-Git-Url: http://git.pk910.de/?p=NextIRCd.git;a=commitdiff_plain;h=6d94611a64ceef3401522a0ad404facd82146315 [IOMultiplexerV2] tidied up _IOSocket socket_flag definitions and added possibility to override want_read/write --- diff --git a/src/IOHandler/IOEngine_epoll.c b/src/IOHandler/IOEngine_epoll.c index 060f87f..5c5ab38 100644 --- a/src/IOHandler/IOEngine_epoll.c +++ b/src/IOHandler/IOEngine_epoll.c @@ -43,7 +43,7 @@ static void engine_epoll_add(struct _IOSocket *iosock) { struct epoll_event evt; int res; - evt.events = EPOLLHUP | EPOLLIN | (iosocket_wants_writes(iosock) ? EPOLLOUT : 0); + evt.events = EPOLLHUP | (iosocket_wants_reads(iosock) ? EPOLLIN : 0) | (iosocket_wants_writes(iosock) ? EPOLLOUT : 0); evt.data.ptr = iosock; res = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, iosock->fd, &evt); if(res < 0) @@ -59,7 +59,7 @@ static void engine_epoll_update(struct _IOSocket *iosock) { struct epoll_event evt; int res; - evt.events = EPOLLHUP | EPOLLIN | (iosocket_wants_writes(iosock) ? EPOLLOUT : 0); + evt.events = EPOLLHUP | (iosocket_wants_reads(iosock) ? EPOLLIN : 0) | (iosocket_wants_writes(iosock) ? EPOLLOUT : 0); evt.data.ptr = iosock; res = epoll_ctl(epoll_fd, EPOLL_CTL_MOD, iosock->fd, &evt); if(res < 0) diff --git a/src/IOHandler/IOEngine_kevent.c b/src/IOHandler/IOEngine_kevent.c index 1c39cc6..e654aa9 100644 --- a/src/IOHandler/IOEngine_kevent.c +++ b/src/IOHandler/IOEngine_kevent.c @@ -41,7 +41,8 @@ static void engine_kevent_add(struct _IOSocket *iosock) { int nchanges = 0; int res; - EV_SET(&changes[nchanges++], iosock->fd, EVFILT_READ, EV_ADD, 0, 0, iosock); + if (iosocket_wants_reads(iosock)) + EV_SET(&changes[nchanges++], iosock->fd, EVFILT_READ, EV_ADD, 0, 0, iosock); if (iosocket_wants_writes(iosock)) EV_SET(&changes[nchanges++], iosock->fd, EVFILT_WRITE, EV_ADD, 0, 0, iosock); @@ -64,7 +65,7 @@ static void engine_kevent_update(struct _IOSocket *iosock) { int nchanges = 0; int res; - EV_SET(&changes[nchanges++], iosock->fd, EVFILT_READ, EV_ADD, 0, 0, iosock); + EV_SET(&changes[nchanges++], iosock->fd, EVFILT_READ, iosocket_wants_reads(iosock) ? EV_ADD : EV_DELETE, 0, 0, iosock); EV_SET(&changes[nchanges++], iosock->fd, EVFILT_WRITE, iosocket_wants_writes(iosock) ? EV_ADD : EV_DELETE, 0, 0, iosock); res = kevent(kevent_fd, changes, nchanges, NULL, 0, NULL); diff --git a/src/IOHandler/IOEngine_select.c b/src/IOHandler/IOEngine_select.c index c0405f4..0d95116 100644 --- a/src/IOHandler/IOEngine_select.c +++ b/src/IOHandler/IOEngine_select.c @@ -93,8 +93,9 @@ static void engine_select_loop(struct timeval *timeout) { continue; if(iosock->fd > fds_size) fds_size = iosock->fd; - FD_SET(iosock->fd, &read_fds); select_result++; + if(iosocket_wants_reads(iosock)) + FD_SET(iosock->fd, &read_fds); if(iosocket_wants_writes(iosock)) FD_SET(iosock->fd, &write_fds); } diff --git a/src/IOHandler/IOEngine_win32.c b/src/IOHandler/IOEngine_win32.c index a5226ae..26ac0a6 100644 --- a/src/IOHandler/IOEngine_win32.c +++ b/src/IOHandler/IOEngine_win32.c @@ -118,7 +118,7 @@ static long engine_win32_events(struct _IOSocket *iosock) { if(iosock->socket_flags & IOSOCKETFLAG_CONNECTING) return FD_CONNECT; - return FD_READ | FD_CLOSE | (iosocket_wants_writes(iosock) ? FD_WRITE : 0); + return FD_CLOSE | (iosocket_wants_reads(iosock) ? FD_READ : 0) | (iosocket_wants_writes(iosock) ? FD_WRITE : 0); } static void engine_win32_update(struct _IOSocket *iosock) { diff --git a/src/IOHandler/IOSockets.h b/src/IOHandler/IOSockets.h index 2d8dd77..f2d01e2 100644 --- a/src/IOHandler/IOSockets.h +++ b/src/IOHandler/IOSockets.h @@ -58,27 +58,39 @@ extern struct _IOSocket *iosocket_first; extern struct _IOSocket *iosocket_last; /* _IOSocket socket_flags */ -#define IOSOCKETFLAG_ACTIVE 0x0001 -#define IOSOCKETFLAG_LISTENING 0x0002 -#define IOSOCKETFLAG_PENDING_BINDDNS 0x0004 -#define IOSOCKETFLAG_PENDING_DESTDNS 0x0008 -#define IOSOCKETFLAG_DNSDONE_BINDDNS 0x0010 -#define IOSOCKETFLAG_DNSDONE_DESTDNS 0x0020 -#define IOSOCKETFLAG_DNSERROR 0x0040 -#define IOSOCKETFLAG_IPV6SOCKET 0x0080 -#define IOSOCKETFLAG_PARENT_PUBLIC 0x0100 -#define IOSOCKETFLAG_PARENT_DNSENGINE 0x0200 -#define IOSOCKETFLAG_SSLSOCKET 0x0400 /* use ssl after connecting */ -#define IOSOCKETFLAG_SSL_HANDSHAKE 0x0800 /* SSL Handshake in progress */ -#define IOSOCKETFLAG_SSL_WANTWRITE 0x1000 -#define IOSOCKETFLAG_SSL_READHS 0x2000 /* ssl read rehandshake */ -#define IOSOCKETFLAG_SSL_WRITEHS 0x4000 /* ssl write rehandshake */ -#define IOSOCKETFLAG_SSL_ESTABLISHED 0x8000 -#define IOSOCKETFLAG_SHUTDOWN 0x10000 /* disconnect pending */ -#define IOSOCKETFLAG_CONNECTING 0x20000 -#define IOSOCKETFLAG_INCOMING 0x40000 /* incoming (accepted) connection */ -#define IOSOCKETFLAG_DEAD 0x80000 -#define IOSOCKETFLAG_RECONNECT_IPV4 0x100000 /* possible fallback to ipv4 connect if ipv6 fails */ +#define IOSOCKETFLAG_ACTIVE 0x00000001 +#define IOSOCKETFLAG_LISTENING 0x00000002 +#define IOSOCKETFLAG_IPV6SOCKET 0x00000004 +#define IOSOCKETFLAG_INCOMING 0x00000008 /* incoming (accepted) connection */ +#define IOSOCKETFLAG_CONNECTING 0x00000010 +#define IOSOCKETFLAG_SHUTDOWN 0x00000020 /* disconnect pending */ +#define IOSOCKETFLAG_DEAD 0x00000040 /* socket dead (disconnected) */ +#define IOSOCKETFLAG_RECONNECT_IPV4 0x00000080 /* possible fallback to ipv4 connect if ipv6 fails */ + +/* DNS Flags */ +#define IOSOCKETFLAG_PENDING_BINDDNS 0x00000100 +#define IOSOCKETFLAG_PENDING_DESTDNS 0x00000200 +#define IOSOCKETFLAG_DNSDONE_BINDDNS 0x00000400 +#define IOSOCKETFLAG_DNSDONE_DESTDNS 0x00000800 +#define IOSOCKETFLAG_DNSERROR 0x00001000 + +/* SSL Flags */ +#define IOSOCKETFLAG_SSLSOCKET 0x00002000 /* use ssl after connecting */ +#define IOSOCKETFLAG_SSL_HANDSHAKE 0x00004000 /* SSL Handshake in progress */ +#define IOSOCKETFLAG_SSL_WANTWRITE 0x00008000 /* ssl module wants write access */ +#define IOSOCKETFLAG_SSL_READHS 0x00010000 /* ssl read rehandshake */ +#define IOSOCKETFLAG_SSL_WRITEHS 0x00020000 /* ssl write rehandshake */ +#define IOSOCKETFLAG_SSL_ESTABLISHED 0x00040000 /* ssl connection established */ + +/* WANT_READ / WANT_WRITE override */ +#define IOSOCKETFLAG_OVERRIDE_WANT_RW 0x00080000 +#define IOSOCKETFLAG_OVERRIDE_WANT_R 0x00100000 +#define IOSOCKETFLAG_OVERRIDE_WANT_W 0x00200000 + +/* Parent descriptors */ +#define IOSOCKETFLAG_PARENT_PUBLIC 0x10000000 +#define IOSOCKETFLAG_PARENT_DNSENGINE 0x20000000 +/* reserved flags for additional descriptor types? */ struct IOSocketDNSLookup { unsigned int bindlookup : 1; @@ -91,7 +103,7 @@ struct IOSocketDNSLookup { struct _IOSocket { int fd; - unsigned int socket_flags : 24; + unsigned int socket_flags : 32; struct { struct IODNSAddress addr; @@ -118,8 +130,19 @@ void _init_sockets(); void iosocket_loop(int usec); void iosocket_lookup_callback(struct IOSocketDNSLookup *lookup, struct IODNSEvent *event); void iosocket_events_callback(struct _IOSocket *iosock, int readable, int writeable); - -#define iosocket_wants_writes(IOSOCK) ((IOSOCK->writebuf.bufpos && !(IOSOCK->socket_flags & (IOSOCKETFLAG_SSL_READHS | IOSOCKETFLAG_SSL_WRITEHS))) || (IOSOCK->socket_flags & (IOSOCKETFLAG_CONNECTING | IOSOCKETFLAG_SSL_WANTWRITE))) + +#define iosocket_wants_reads(IOSOCK) \ +(\ + ((IOSOCK->socket_flags & (IOSOCKETFLAG_SSL_READHS | IOSOCKETFLAG_SSL_WRITEHS)) && !(IOSOCK->socket_flags & IOSOCKETFLAG_SSL_WANTWRITE)) || \ + (!(IOSOCK->socket_flags & IOSOCKETFLAG_OVERRIDE_WANT_RW) || \ + (IOSOCK->socket_flags & (IOSOCKETFLAG_OVERRIDE_WANT_RW | IOSOCKETFLAG_OVERRIDE_WANT_R) == (IOSOCKETFLAG_OVERRIDE_WANT_RW | IOSOCKETFLAG_OVERRIDE_WANT_R)) \ +) +#define iosocket_wants_writes(IOSOCK) \ +(\ + (IOSOCK->socket_flags & (IOSOCKETFLAG_SSL_READHS | IOSOCKETFLAG_SSL_WRITEHS | IOSOCKETFLAG_SSL_WANTWRITE) > IOSOCKETFLAG_SSL_WANTWRITE) || \ + (!(IOSOCK->socket_flags & IOSOCKETFLAG_OVERRIDE_WANT_RW) && (IOSOCK->writebuf.bufpos || (IOSOCK->socket_flags & IOSOCKETFLAG_CONNECTING))) || \ + (IOSOCK->socket_flags & (IOSOCKETFLAG_OVERRIDE_WANT_RW | IOSOCKETFLAG_OVERRIDE_WANT_W) == (IOSOCKETFLAG_OVERRIDE_WANT_RW | IOSOCKETFLAG_OVERRIDE_WANT_W)) \ +) #endif