Update socket API to "initialized struct as parameter" pattern
authorHenning Rogge <hrogge@googlemail.com>
Sat, 15 Oct 2011 14:53:41 +0000 (16:53 +0200)
committerHenning Rogge <hrogge@googlemail.com>
Sat, 15 Oct 2011 14:53:41 +0000 (16:53 +0200)
src/core/olsr_packet_socket.c
src/core/olsr_packet_socket.h
src/core/olsr_socket.c
src/core/olsr_socket.h
src/core/olsr_stream_socket.c
src/core/olsr_stream_socket.h
src/olsr.c

index b4e47d0..5cda971 100644 (file)
@@ -97,9 +97,6 @@ int
 olsr_packet_add(struct olsr_packet_socket *pktsocket,
     union netaddr_socket *local) {
   int s = -1;
-#if !defined(REMOVE_LOG_WARN)
-  struct netaddr_str buf;
-#endif
 
   memset(pktsocket, 0, sizeof(*pktsocket));
 
@@ -109,12 +106,12 @@ olsr_packet_add(struct olsr_packet_socket *pktsocket,
     return -1;
   }
 
-  if ((pktsocket->scheduler_entry = olsr_socket_add(
-      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;
-  }
+  pktsocket->scheduler_entry.fd = s;
+  pktsocket->scheduler_entry.process = _cb_packet_event;
+  pktsocket->scheduler_entry.event_read = true;
+  pktsocket->scheduler_entry.event_write = true;
+
+  olsr_socket_add(&pktsocket->scheduler_entry);
 
   abuf_init(&pktsocket->out, 2048);
   list_add_tail(&packet_sockets, &pktsocket->node);
@@ -123,16 +120,6 @@ olsr_packet_add(struct olsr_packet_socket *pktsocket,
   pktsocket->input_buffer = input_buffer;
   pktsocket->input_buffer_length = sizeof(input_buffer);
   return 0;
-
-open_comport_error:
-  if (s != -1) {
-    os_close(s);
-  }
-  if (pktsocket->scheduler_entry) {
-    olsr_socket_remove(pktsocket->scheduler_entry);
-  }
-  abuf_free(&pktsocket->out);
-  return -1;
 }
 
 /**
@@ -142,8 +129,8 @@ open_comport_error:
 void
 olsr_packet_remove(struct olsr_packet_socket *pktsocket) {
   if (list_node_added(&pktsocket->node)) {
-    os_close(pktsocket->scheduler_entry->fd);
-    olsr_socket_remove(pktsocket->scheduler_entry);
+    olsr_socket_remove(&pktsocket->scheduler_entry);
+    os_close(pktsocket->scheduler_entry.fd);
     list_remove(&pktsocket->node);
 
     abuf_free(&pktsocket->out);
@@ -169,7 +156,7 @@ olsr_packet_send(struct olsr_packet_socket *pktsocket, union netaddr_socket *rem
 
   if (pktsocket->out.len == 0) {
     /* no backlog of outgoing packets, try to send directly */
-    result = os_sendto(pktsocket->scheduler_entry->fd, data, length, remote);
+    result = os_sendto(pktsocket->scheduler_entry.fd, data, length, remote);
     if (result > 0) {
       /* successful */
       return 0;
@@ -192,7 +179,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_set_write(pktsocket->scheduler_entry, true);
+  olsr_socket_set_write(&pktsocket->scheduler_entry, true);
   return 0;
 }
 
@@ -262,6 +249,6 @@ _cb_packet_event(int fd, void *data, bool event_read, bool event_write) {
 
   if (pktsocket->out.len == 0) {
     /* nothing left to send, disable outgoing events */
-    olsr_socket_set_write(pktsocket->scheduler_entry, false);
+    olsr_socket_set_write(&pktsocket->scheduler_entry, false);
   }
 }
index af9125c..9eaf2cc 100644 (file)
@@ -57,7 +57,7 @@ struct olsr_packet_socket {
   char *input_buffer;
   size_t input_buffer_length;
 
-  struct olsr_socket_entry *scheduler_entry;
+  struct olsr_socket_entry scheduler_entry;
   void (*receive_data)(struct olsr_packet_socket *,
       union netaddr_socket *from, size_t length);
 };
index 471332e..136b5ae 100644 (file)
 /* List of all active sockets in scheduler */
 struct list_entity socket_head;
 
-static struct olsr_memcookie_info *socket_memcookie;
-
 /* remember if initialized or not */
 OLSR_SUBSYSTEM_STATE(olsr_socket_state);
 
-/* helper function to free socket entry */
-static inline void
-olsr_socket_intfree(struct olsr_socket_entry *sock) {
-  list_remove(&sock->node);
-  olsr_memcookie_free(socket_memcookie, sock);
-}
-
 /**
  * Initialize olsr socket scheduler
- * @return -1 if an error happened, 0 otherwise
  */
-int
+void
 olsr_socket_init(void) {
   if (olsr_subsystem_init(&olsr_socket_state))
-    return 0;
+    return;
 
   list_init_head(&socket_head);
-
-  socket_memcookie = olsr_memcookie_add("socket entry", sizeof(struct olsr_socket_entry));
-  if (socket_memcookie == NULL) {
-    OLSR_WARN_OOM(LOG_SOCKET);
-    olsr_socket_state--;
-    return -1;
-  }
-  return 0;
 }
 
 /**
@@ -102,63 +84,37 @@ olsr_socket_cleanup(void)
     return;
 
   OLSR_FOR_ALL_SOCKETS(entry, iterator) {
+    list_remove(&entry->node);
     os_close(entry->fd);
-    olsr_socket_intfree(entry);
   }
-
-  olsr_memcookie_remove(socket_memcookie);
 }
 
-// TODO: remove malloc by giving function initialized socket entry
 /**
- * Add a socket handler to the list of sockets
- * being used in the main select(2) loop
+ * Add a socket handler to the scheduler
  *
- * @param fd file descriptor for socket
- * @param pf_imm processing callback
- * @param data custom data
- * @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
+ * @param handler pointer to initialized socket entry
+ * @return -1 if an error happened, 0 otherwise
  */
-struct olsr_socket_entry *
-olsr_socket_add(int fd, socket_handler_func pf_imm, void *data,
-    bool event_read, bool event_write)
+void
+olsr_socket_add(struct olsr_socket_entry *entry)
 {
-  struct olsr_socket_entry *new_entry;
-
-  assert (fd);
-  assert (pf_imm);
+  assert (entry->fd);
+  assert (entry->process);
 
-  OLSR_DEBUG(LOG_SOCKET, "Adding socket entry %d to scheduler\n", fd);
-
-  new_entry = olsr_memcookie_malloc(socket_memcookie);
-  if (new_entry) {
-    new_entry->fd = fd;
-    new_entry->process = pf_imm;
-    new_entry->data = data;
-    new_entry->event_read = event_read;
-    new_entry->event_write = event_write;
-
-    /* Queue */
-    list_add_before(&socket_head, &new_entry->node);
-  }
+  OLSR_DEBUG(LOG_SOCKET, "Adding socket entry %d to scheduler\n", entry->fd);
 
-  return new_entry;
+  list_add_before(&socket_head, &entry->node);
 }
 
 /**
- * Mark a socket and handler for removal from the socket scheduler
+ * Remove a socket from the socket scheduler
  * @param entry pointer to socket entry
  */
 void
 olsr_socket_remove(struct olsr_socket_entry *entry)
 {
-  OLSR_DEBUG(LOG_SOCKET, "Trigger removing socket entry %d\n", entry->fd);
-
-  entry->process = NULL;
-  entry->event_read = false;
-  entry->event_write = false;
+  OLSR_DEBUG(LOG_SOCKET, "Removing socket entry %d\n", entry->fd);
+  list_remove(&entry->node);
 }
 
 /**
@@ -273,12 +229,6 @@ olsr_socket_handle(uint32_t until_time)
     tvp.tv_usec = (remaining % MSEC_PER_SEC) * USEC_PER_MSEC;
   }
 
-  OLSR_FOR_ALL_SOCKETS(entry, iterator) {
-    if (entry->process == NULL) {
-      olsr_socket_intfree(entry);
-    }
-  }
-
   if (n<0)
     return -1;
   return 0;
index 36a8296..e45f2f7 100644 (file)
@@ -72,20 +72,18 @@ struct olsr_socket_entry {
 EXPORT extern struct list_entity socket_head;
 #define OLSR_FOR_ALL_SOCKETS(socket, iterator) list_for_each_element_safe(&socket_head, socket, node, iterator)
 
-int olsr_socket_init(void) __attribute__((warn_unused_result));
+void olsr_socket_init(void);
 void olsr_socket_cleanup(void);
 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, bool event_read, bool event_write);
+EXPORT void olsr_socket_add(struct olsr_socket_entry *);
 EXPORT void olsr_socket_remove(struct olsr_socket_entry *);
 
 /**
  * Enable one or both flags of a socket handler
  * @param sock pointer to socket entry
  */
-static inline void
+static INLINE void
 olsr_socket_set_read(struct olsr_socket_entry *entry, bool event_read)
 {
   entry->event_read = event_read;
@@ -95,7 +93,7 @@ olsr_socket_set_read(struct olsr_socket_entry *entry, bool event_read)
  * Disable one or both flags of a socket handler
  * @param sock pointer to socket entry
  */
-static inline void
+static INLINE void
 olsr_socket_set_write(struct olsr_socket_entry *entry, bool event_write)
 {
   entry->event_write = event_write;
index 5af384a..7abef25 100644 (file)
@@ -133,7 +133,7 @@ olsr_stream_cleanup(void) {
  */
 void
 olsr_stream_flush(struct olsr_stream_session *con) {
-  olsr_socket_set_write(con->scheduler_entry, true);
+  olsr_socket_set_write(&con->scheduler_entry, true);
 }
 
 /**
@@ -165,12 +165,12 @@ olsr_stream_add(struct olsr_stream_socket *stream_socket,
     goto add_stream_error;
   }
 
-  if ((stream_socket->scheduler_entry = olsr_socket_add(s,
-      _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;
-  }
+  stream_socket->scheduler_entry.fd = s;
+  stream_socket->scheduler_entry.process = _cb_parse_request;
+  stream_socket->scheduler_entry.data = stream_socket;
+  stream_socket->scheduler_entry.event_read = true;
+
+  olsr_socket_add(&stream_socket->scheduler_entry);
   memcpy(&stream_socket->local_socket, local, sizeof(stream_socket->local_socket));
 
   if (stream_socket->config.memcookie == NULL) {
@@ -189,12 +189,12 @@ olsr_stream_add(struct olsr_stream_socket *stream_socket,
   return 0;
 
 add_stream_error:
+  if (stream_socket->scheduler_entry.fd) {
+    olsr_socket_remove(&stream_socket->scheduler_entry);
+  }
   if (s != -1) {
     os_close(s);
   }
-  if (stream_socket->scheduler_entry) {
-    olsr_socket_remove(stream_socket->scheduler_entry);
-  }
   return -1;
 }
 
@@ -215,10 +215,8 @@ olsr_stream_remove(struct olsr_stream_socket *stream_socket) {
 
     list_remove(&stream_socket->node);
 
-    if (stream_socket->scheduler_entry) {
-      os_close(stream_socket->scheduler_entry->fd);
-      olsr_socket_remove(stream_socket->scheduler_entry);
-    }
+    os_close(stream_socket->scheduler_entry.fd);
+    olsr_socket_remove(&stream_socket->scheduler_entry);
   }
 }
 
@@ -291,8 +289,8 @@ olsr_stream_close(struct olsr_stream_session *session) {
   session->comport->config.allowed_sessions++;
   list_remove(&session->node);
 
-  os_close(session->scheduler_entry->fd);
-  olsr_socket_remove(session->scheduler_entry);
+  os_close(session->scheduler_entry.fd);
+  olsr_socket_remove(&session->scheduler_entry);
 
   abuf_free(&session->in);
   abuf_free(&session->out);
@@ -481,11 +479,12 @@ _create_session(struct olsr_stream_socket *stream_socket,
     goto parse_request_error;
   }
 
-  if ((session->scheduler_entry = olsr_socket_add(sock,
-      &_cb_parse_connection, session, true, true)) == NULL) {
-    OLSR_WARN(LOG_SOCKET_STREAM, "Cannot hook incoming session into scheduler");
-    goto parse_request_error;
-  }
+  session->scheduler_entry.fd = sock;
+  session->scheduler_entry.process = _cb_parse_connection;
+  session->scheduler_entry.data = session;
+  session->scheduler_entry.event_read = true;
+  session->scheduler_entry.event_write = true;
+  olsr_socket_add(&session->scheduler_entry);
 
   session->send_first = stream_socket->config.send_first;
   session->comport = stream_socket;
@@ -641,14 +640,14 @@ _cb_parse_connection(int fd, void *data, bool event_read, bool event_write) {
       }
     } else {
       OLSR_DEBUG(LOG_SOCKET_STREAM, "  activating output in scheduler\n");
-      olsr_socket_set_write(session->scheduler_entry, true);
+      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_set_write(session->scheduler_entry, false);
+    olsr_socket_set_write(&session->scheduler_entry, false);
     if (session->state == STREAM_SESSION_SEND_AND_QUIT) {
       session->state = STREAM_SESSION_CLEANUP;
     }
index 4d70d5c..4dd3fd5 100644 (file)
@@ -49,6 +49,7 @@
 
 #include "olsr_memcookie.h"
 #include "olsr_netaddr_acl.h"
+#include "olsr_socket.h"
 
 enum olsr_stream_session_state {
   STREAM_SESSION_ACTIVE,
@@ -87,7 +88,7 @@ struct olsr_stream_session {
   struct olsr_stream_socket *comport;
 
   /* scheduler handler for the session */
-  struct olsr_socket_entry *scheduler_entry;
+  struct olsr_socket_entry scheduler_entry;
 
   /* timer for handling session timeout */
   struct olsr_timer_entry *timeout;
@@ -160,11 +161,7 @@ struct olsr_stream_socket {
 
   struct list_entity session;
 
-  /*
-   * represents the scheduler handler for the server socket,
-   * NULL for outgoing streams
-   */
-  struct olsr_socket_entry *scheduler_entry;
+  struct olsr_socket_entry scheduler_entry;
 
   struct olsr_stream_config config;
 };
index 25538ee..58df839 100644 (file)
@@ -229,9 +229,7 @@ main(int argc, char **argv) {
   if (olsr_timer_init()) {
     goto olsrd_cleanup;
   }
-  if (olsr_socket_init()) {
-    goto olsrd_cleanup;
-  }
+  olsr_socket_init();
   olsr_packet_init();
   if (olsr_stream_init()) {
     goto olsrd_cleanup;