Cleanup of socket flags
authorHenning Rogge <hrogge@googlemail.com>
Sat, 15 Oct 2011 14:33:04 +0000 (16:33 +0200)
committerHenning Rogge <hrogge@googlemail.com>
Sat, 15 Oct 2011 14:33:04 +0000 (16:33 +0200)
src/core/olsr_packet_socket.c
src/core/olsr_socket.c
src/core/olsr_socket.h
src/core/olsr_stream_socket.c

index 7d0d2fc..b4e47d0 100644 (file)
@@ -57,7 +57,7 @@ static char input_buffer[65536];
 /* remember if initialized or not */
 OLSR_SUBSYSTEM_STATE(olsr_packet_state);
 
-static void _cb_packet_event(int fd, void *data, enum olsr_sockethandler_flags flags);
+static void _cb_packet_event(int fd, void *data, bool r, bool w);
 
 /**
  * Initialize packet socket handler
@@ -110,7 +110,7 @@ olsr_packet_add(struct olsr_packet_socket *pktsocket,
   }
 
   if ((pktsocket->scheduler_entry = olsr_socket_add(
-      s, _cb_packet_event, pktsocket, OLSR_SOCKET_READ)) == NULL) {
+      s, _cb_packet_event, pktsocket, true, false)) == NULL) {
     OLSR_WARN(LOG_SOCKET_PACKET, "Packet socket hookup to scheduler failed for %s\n",
         netaddr_socket_to_string(&buf, local));
     goto open_comport_error;
@@ -192,7 +192,7 @@ olsr_packet_send(struct olsr_packet_socket *pktsocket, union netaddr_socket *rem
   abuf_memcpy(&pktsocket->out, data, length);
 
   /* activate outgoing socket scheduler */
-  olsr_socket_enable(pktsocket->scheduler_entry, OLSR_SOCKET_WRITE);
+  olsr_socket_set_write(pktsocket->scheduler_entry, true);
   return 0;
 }
 
@@ -200,10 +200,11 @@ olsr_packet_send(struct olsr_packet_socket *pktsocket, union netaddr_socket *rem
  * Callback to handle data from the olsr socket scheduler
  * @param fd filedescriptor to read data from
  * @param data custom data pointer
- * @param flags socket handler flags about event (read and/or write)
+ * @param event_read true if read-event is incoming
+ * @param event_write true if write-event is incoming
  */
 static void
-_cb_packet_event(int fd, void *data, enum olsr_sockethandler_flags flags) {
+_cb_packet_event(int fd, void *data, bool event_read, bool event_write) {
   struct olsr_packet_socket *pktsocket = data;
   union netaddr_socket *skt, sock;
   uint16_t length;
@@ -213,7 +214,7 @@ _cb_packet_event(int fd, void *data, enum olsr_sockethandler_flags flags) {
   struct netaddr_str buf;
 #endif
 
-  if ((flags & OLSR_SOCKET_READ) != 0) {
+  if (event_read) {
     /* handle incoming data */
     result = os_recvfrom(fd, pktsocket->input_buffer, pktsocket->input_buffer_length-1, &sock);
     if (result > 0 && pktsocket->receive_data != NULL) {
@@ -229,7 +230,7 @@ _cb_packet_event(int fd, void *data, enum olsr_sockethandler_flags flags) {
     }
   }
 
-  if ((flags & OLSR_SOCKET_WRITE) != 0 && pktsocket->out.len == 0) {
+  if (event_write && pktsocket->out.len == 0) {
     /* handle outgoing data */
 
     /* pointer to remote socket */
@@ -261,6 +262,6 @@ _cb_packet_event(int fd, void *data, enum olsr_sockethandler_flags flags) {
 
   if (pktsocket->out.len == 0) {
     /* nothing left to send, disable outgoing events */
-    olsr_socket_disable(pktsocket->scheduler_entry, OLSR_SOCKET_WRITE);
+    olsr_socket_set_write(pktsocket->scheduler_entry, false);
   }
 }
index 3565fdc..471332e 100644 (file)
@@ -117,12 +117,13 @@ olsr_socket_cleanup(void)
  * @param fd file descriptor for socket
  * @param pf_imm processing callback
  * @param data custom data
- * @param flags OLSR_SOCKET_READ/OLSR_SOCKET_WRITE (or both)
+ * @param event_read true if socket is waiting for read-event
+ * @param event_write true if socket is waiting for write-event
  * @return pointer to socket_entry
  */
 struct olsr_socket_entry *
 olsr_socket_add(int fd, socket_handler_func pf_imm, void *data,
-    enum olsr_sockethandler_flags flags)
+    bool event_read, bool event_write)
 {
   struct olsr_socket_entry *new_entry;
 
@@ -136,7 +137,8 @@ olsr_socket_add(int fd, socket_handler_func pf_imm, void *data,
     new_entry->fd = fd;
     new_entry->process = pf_imm;
     new_entry->data = data;
-    new_entry->flags = flags;
+    new_entry->event_read = event_read;
+    new_entry->event_write = event_write;
 
     /* Queue */
     list_add_before(&socket_head, &new_entry->node);
@@ -155,7 +157,8 @@ olsr_socket_remove(struct olsr_socket_entry *entry)
   OLSR_DEBUG(LOG_SOCKET, "Trigger removing socket entry %d\n", entry->fd);
 
   entry->process = NULL;
-  entry->flags = 0;
+  entry->event_read = false;
+  entry->event_write = false;
 }
 
 /**
@@ -170,6 +173,8 @@ olsr_socket_handle(uint32_t until_time)
   struct timeval tvp;
   int32_t remaining;
   int n = 0;
+  bool fd_read;
+  bool fd_write;
 
   /* Update time since this is much used by the parsing functions */
   if (olsr_clock_update()) {
@@ -194,7 +199,11 @@ olsr_socket_handle(uint32_t until_time)
   /* do at least one select */
   for (;;) {
     fd_set ibits, obits;
-    int hfd = 0, fdsets = 0;
+    int hfd = 0;
+
+    fd_read = false;
+    fd_write = false;
+
     FD_ZERO(&ibits);
     FD_ZERO(&obits);
 
@@ -203,15 +212,15 @@ olsr_socket_handle(uint32_t until_time)
       if (entry->process == NULL) {
         continue;
       }
-      if ((entry->flags & OLSR_SOCKET_READ) != 0) {
-        fdsets |= OLSR_SOCKET_READ;
+      if (entry->event_read) {
+        fd_read = true;
         FD_SET((unsigned int)entry->fd, &ibits);        /* And we cast here since we get a warning on Win32 */
       }
-      if ((entry->flags & OLSR_SOCKET_WRITE) != 0) {
-        fdsets |= OLSR_SOCKET_WRITE;
+      if (entry->event_write) {
+        fd_write = true;
         FD_SET((unsigned int)entry->fd, &obits);        /* And we cast here since we get a warning on Win32 */
       }
-      if ((entry->flags & (OLSR_SOCKET_READ | OLSR_SOCKET_WRITE)) != 0 && entry->fd >= hfd) {
+      if ((entry->event_read || entry->event_write) != 0 && entry->fd >= hfd) {
         hfd = entry->fd + 1;
       }
     }
@@ -223,8 +232,8 @@ olsr_socket_handle(uint32_t until_time)
 
     do {
       n = os_select(hfd,
-          fdsets & OLSR_SOCKET_READ ? &ibits : NULL,
-          fdsets & OLSR_SOCKET_WRITE ? &obits : NULL,
+          fd_read ? &ibits : NULL,
+          fd_write ? &obits : NULL,
           NULL, &tvp);
     } while (n == -1 && errno == EINTR);
 
@@ -242,19 +251,14 @@ olsr_socket_handle(uint32_t until_time)
       break;
     }
     OLSR_FOR_ALL_SOCKETS(entry, iterator) {
-      enum olsr_sockethandler_flags flags;
       if (entry->process == NULL) {
         continue;
       }
-      flags = 0;
-      if (FD_ISSET(entry->fd, &ibits)) {
-        flags |= OLSR_SOCKET_READ;
-      }
-      if (FD_ISSET(entry->fd, &obits)) {
-        flags |= OLSR_SOCKET_WRITE;
-      }
-      if (flags != 0) {
-        entry->process(entry->fd, entry->data, flags);
+
+      fd_read = FD_ISSET(entry->fd, &ibits) != 0;
+      fd_write = FD_ISSET(entry->fd, &obits) != 0;
+      if (fd_read || fd_write) {
+        entry->process(entry->fd, entry->data, fd_read, fd_write);
       }
     }
 
index fcc0b7a..36a8296 100644 (file)
 #include "common/list.h"
 #include "common/avl.h"
 
-/* flags for socket handler */
-enum olsr_sockethandler_flags {
-  OLSR_SOCKET_READ = 0x04,
-  OLSR_SOCKET_WRITE = 0x08,
-};
-
 /* prototype for socket handler */
 typedef void (*socket_handler_func) (int fd, void *data,
-    enum olsr_sockethandler_flags);
+    bool event_read, bool event_write);
 
 /* This struct represents a single registered socket handler */
 struct olsr_socket_entry {
@@ -70,9 +64,8 @@ struct olsr_socket_entry {
   /* custom data pointer for sockets */
   void *data;
 
-  // TODO: convert into two booleans
-  /* flags (OLSR_SOCKET_READ and OLSR_SOCKET_WRITE) */
-  enum olsr_sockethandler_flags flags;
+  /* event mask for socket handler */
+  bool event_read, event_write;
 };
 
 /* deletion safe macro for socket list traversal */
@@ -85,7 +78,7 @@ int olsr_socket_handle(uint32_t until_time) __attribute__((warn_unused_result));
 
 
 EXPORT struct olsr_socket_entry *olsr_socket_add(int fd,
-    socket_handler_func pf_imm, void *data, unsigned int flags);
+    socket_handler_func pf_imm, void *data, bool event_read, bool event_write);
 EXPORT void olsr_socket_remove(struct olsr_socket_entry *);
 
 /**
@@ -93,9 +86,9 @@ EXPORT void olsr_socket_remove(struct olsr_socket_entry *);
  * @param sock pointer to socket entry
  */
 static inline void
-olsr_socket_enable(struct olsr_socket_entry *entry, unsigned int flags)
+olsr_socket_set_read(struct olsr_socket_entry *entry, bool event_read)
 {
-  entry->flags |= flags;
+  entry->event_read = event_read;
 }
 
 /**
@@ -103,9 +96,9 @@ olsr_socket_enable(struct olsr_socket_entry *entry, unsigned int flags)
  * @param sock pointer to socket entry
  */
 static inline void
-olsr_socket_disable(struct olsr_socket_entry *entry, unsigned int flags)
+olsr_socket_set_write(struct olsr_socket_entry *entry, bool event_write)
 {
-  entry->flags &= ~flags;
+  entry->event_write = event_write;
 }
 
 #endif
index 0d85d88..5af384a 100644 (file)
@@ -70,11 +70,10 @@ OLSR_SUBSYSTEM_STATE(olsr_stream_state);
 
 static int _apply_managed_socket(struct olsr_stream_managed *managed,
     struct olsr_stream_socket *stream, struct netaddr *bindto, uint16_t port);
-static void _cb_parse_request(int fd, void *data, unsigned int flags);
+static void _cb_parse_request(int fd, void *data, bool, bool);
 static struct olsr_stream_session *_create_session(
     struct olsr_stream_socket *stream_socket, int sock, struct netaddr *remote_addr);
-static void _cb_parse_connection(int fd, void *data,
-        enum olsr_sockethandler_flags flags);
+static void _cb_parse_connection(int fd, void *data, bool r,bool w);
 
 static void _cb_timeout_handler(void *);
 
@@ -134,7 +133,7 @@ olsr_stream_cleanup(void) {
  */
 void
 olsr_stream_flush(struct olsr_stream_session *con) {
-  olsr_socket_enable(con->scheduler_entry, OLSR_SOCKET_WRITE);
+  olsr_socket_set_write(con->scheduler_entry, true);
 }
 
 /**
@@ -167,7 +166,7 @@ olsr_stream_add(struct olsr_stream_socket *stream_socket,
   }
 
   if ((stream_socket->scheduler_entry = olsr_socket_add(s,
-      _cb_parse_request, stream_socket, OLSR_SOCKET_READ)) == NULL) {
+      _cb_parse_request, stream_socket, true, false)) == NULL) {
     OLSR_WARN(LOG_SOCKET_STREAM, "tcp socket hookup to scheduler failed for %s\n",
         netaddr_socket_to_string(&buf, local));
     goto add_stream_error;
@@ -404,10 +403,12 @@ _apply_managed_socket(struct olsr_stream_managed *managed,
  * Handle incoming server socket event from socket scheduler.
  * @param fd filedescriptor for event
  * @param data custom user data
- * @param flags OLSR_SOCKET_(READ|WRITE)
+ * @param event_read true if read-event is incoming
+ * @param event_write true if write-event is incoming
  */
 static void
-_cb_parse_request(int fd, void *data, unsigned int flags) {
+_cb_parse_request(int fd, void *data, bool event_read,
+    bool event_write __attribute__((unused))) {
   struct olsr_stream_socket *comport;
   union netaddr_socket remote_socket;
   struct netaddr remote_addr;
@@ -417,7 +418,7 @@ _cb_parse_request(int fd, void *data, unsigned int flags) {
       struct netaddr_str buf1, buf2;
 #endif
 
-  if ((flags & OLSR_SOCKET_READ) == 0) {
+  if (!event_read) {
     return;
   }
 
@@ -481,8 +482,7 @@ _create_session(struct olsr_stream_socket *stream_socket,
   }
 
   if ((session->scheduler_entry = olsr_socket_add(sock,
-      &_cb_parse_connection, session,
-      OLSR_SOCKET_READ | OLSR_SOCKET_WRITE)) == NULL) {
+      &_cb_parse_connection, session, true, true)) == NULL) {
     OLSR_WARN(LOG_SOCKET_STREAM, "Cannot hook incoming session into scheduler");
     goto parse_request_error;
   }
@@ -542,11 +542,11 @@ _cb_timeout_handler(void *data) {
  * Handle events for TCP session from network scheduler
  * @param fd filedescriptor of TCP session
  * @param data custom data
- * @param flags OLSR_SOCKET_(READ|WRITE)
+ * @param event_read true if read-event is incoming
+ * @param event_write true if write-event is incoming
  */
 static void
-_cb_parse_connection(int fd, void *data,
-    enum olsr_sockethandler_flags flags) {
+_cb_parse_connection(int fd, void *data, bool event_read, bool event_write) {
   struct olsr_stream_session *session;
   struct olsr_stream_socket *comport;
   int len;
@@ -561,7 +561,7 @@ _cb_parse_connection(int fd, void *data,
   OLSR_DEBUG(LOG_SOCKET_STREAM, "Parsing connection of socket %d\n", fd);
 
   if (session->wait_for_connect) {
-    if (flags & OLSR_SOCKET_WRITE) {
+    if (event_write) {
       int value;
       socklen_t value_len;
 
@@ -588,8 +588,7 @@ _cb_parse_connection(int fd, void *data,
   }
 
   /* read data if necessary */
-  if (session->state == STREAM_SESSION_ACTIVE && (flags & OLSR_SOCKET_READ)
-      != 0) {
+  if (session->state == STREAM_SESSION_ACTIVE && event_read) {
     len = recv(fd, buffer, sizeof(buffer), 0);
     if (len > 0) {
       OLSR_DEBUG(LOG_SOCKET_STREAM, "  recv returned %d\n", len);
@@ -627,7 +626,7 @@ _cb_parse_connection(int fd, void *data,
 
   /* send data if necessary */
   if (session->state != STREAM_SESSION_CLEANUP && session->out.len > 0) {
-    if (flags & OLSR_SOCKET_WRITE) {
+    if (event_write) {
       len = send(fd, session->out.buf, session->out.len, 0);
 
       if (len > 0) {
@@ -642,14 +641,14 @@ _cb_parse_connection(int fd, void *data,
       }
     } else {
       OLSR_DEBUG(LOG_SOCKET_STREAM, "  activating output in scheduler\n");
-      olsr_socket_enable(session->scheduler_entry, OLSR_SOCKET_WRITE);
+      olsr_socket_set_write(session->scheduler_entry, true);
     }
   }
 
   if (session->out.len == 0) {
     /* nothing to send anymore */
     OLSR_DEBUG(LOG_SOCKET_STREAM, "  deactivating output in scheduler\n");
-    olsr_socket_disable(session->scheduler_entry, OLSR_SOCKET_WRITE);
+    olsr_socket_set_write(session->scheduler_entry, false);
     if (session->state == STREAM_SESSION_SEND_AND_QUIT) {
       session->state = STREAM_SESSION_CLEANUP;
     }