[IOMultiplexerV2] tidied up _IOSocket socket_flag definitions and added possibility...
authorpk910 <pk910@pk910-laptop.(none)>
Thu, 6 Mar 2014 14:50:39 +0000 (15:50 +0100)
committerpk910 <pk910@pk910-laptop.(none)>
Thu, 6 Mar 2014 14:50:39 +0000 (15:50 +0100)
src/IOHandler/IOEngine_epoll.c
src/IOHandler/IOEngine_kevent.c
src/IOHandler/IOEngine_select.c
src/IOHandler/IOEngine_win32.c
src/IOHandler/IOSockets.h

index 060f87ff4c14d13d37cfde04457371576f79d6c3..5c5ab38710d357b25e902602018bc3ffc1c9d68e 100644 (file)
@@ -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)
index 1c39cc63b4515c628b9f8ba8b16860f5eef8fe45..e654aa9c94f5332615257ad628400ec66e481ed0 100644 (file)
@@ -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);
index c0405f4f89e50c93e42ebc8a4c2d5e2bd211b06c..0d95116cd1303b2c15f5e10c2fa57d2a75345f57 100644 (file)
@@ -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);
        }
index a5226ae792c0f16ea8f121dc66a1eff142cdbabf..26ac0a64d6f484e38efeeb1112eb777d661cee18 100644 (file)
@@ -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) {
index 2d8dd7738fac1acd0dc6beeff97f90d911a323a9..f2d01e2afbe7f338f1dc74e9af7f3eeb5b6da04f 100644 (file)
@@ -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\r
-#define IOSOCKETFLAG_SSL_READHS       0x2000 /* ssl read rehandshake */\r
-#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);
-\r
-#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)) \
+)\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