Remove memory allocation in olsr_timer_add()
authorHenning Rogge <hrogge@googlemail.com>
Sat, 25 Feb 2012 12:36:07 +0000 (13:36 +0100)
committerHenning Rogge <hrogge@googlemail.com>
Sat, 25 Feb 2012 12:36:07 +0000 (13:36 +0100)
src/core/olsr_interface.c
src/core/olsr_stream_socket.c
src/core/olsr_telnet.c
src/core/olsr_timer.c
src/core/olsr_timer.h
src/core/os_linux/os_system_linux.c

index 772b83e..0a24228 100644 (file)
@@ -34,7 +34,10 @@ struct avl_tree olsr_interface_tree;
 OLSR_SUBSYSTEM_STATE(_interface_state);
 
 static struct list_entity _interface_listener;
 OLSR_SUBSYSTEM_STATE(_interface_state);
 
 static struct list_entity _interface_listener;
-static struct olsr_timer_info *_change_timer_info;
+static struct olsr_timer_info _change_timer_info = {
+  .name = "Interface change",
+  .callback = _cb_change_handler,
+};
 
 /**
  * Initialize interface subsystem
 
 /**
  * Initialize interface subsystem
@@ -45,11 +48,7 @@ olsr_interface_init(void) {
   if (olsr_subsystem_is_initialized(&_interface_state))
     return 0;
 
   if (olsr_subsystem_is_initialized(&_interface_state))
     return 0;
 
-  _change_timer_info = olsr_timer_add(
-      "Interface change", _cb_change_handler, false);
-  if (_change_timer_info == NULL) {
-    return -1;
-  }
+  olsr_timer_add(&_change_timer_info);
 
   avl_init(&olsr_interface_tree, avl_comp_strcasecmp, false, NULL);
   list_init_head(&_interface_listener);
 
   avl_init(&olsr_interface_tree, avl_comp_strcasecmp, false, NULL);
   list_init_head(&_interface_listener);
@@ -72,7 +71,7 @@ olsr_interface_cleanup(void) {
     olsr_interface_remove_listener(listener);
   }
 
     olsr_interface_remove_listener(listener);
   }
 
-  olsr_timer_remove(_change_timer_info);
+  olsr_timer_remove(&_change_timer_info);
 }
 
 /**
 }
 
 /**
@@ -252,5 +251,5 @@ _cb_change_handler(void *ptr) {
 static void
 _trigger_change_timer(struct olsr_interface *interf) {
   olsr_timer_set(&interf->change_timer,
 static void
 _trigger_change_timer(struct olsr_interface *interf) {
   olsr_timer_set(&interf->change_timer,
-      OLSR_INTERFACE_CHANGE_INTERVAL, 0, interf, _change_timer_info);
+      OLSR_INTERFACE_CHANGE_INTERVAL, 0, interf, &_change_timer_info);
 }
 }
index bf6c83b..7d9d6eb 100644 (file)
 #include "olsr.h"
 #include "olsr_stream_socket.h"
 
 #include "olsr.h"
 #include "olsr_stream_socket.h"
 
-struct list_entity olsr_stream_head;
-
-/* server socket */
-static struct olsr_memcookie_info *connection_cookie;
-static struct olsr_timer_info *connection_timeout;
-
-/* remember if initialized or not */
-OLSR_SUBSYSTEM_STATE(_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, bool, bool);
 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, bool, bool);
@@ -77,6 +68,19 @@ static void _cb_parse_connection(int fd, void *data, bool r,bool w);
 
 static void _cb_timeout_handler(void *);
 
 
 static void _cb_timeout_handler(void *);
 
+/* list of olsr stream sockets */
+struct list_entity olsr_stream_head;
+
+/* server socket */
+static struct olsr_memcookie_info *connection_cookie;
+static struct olsr_timer_info connection_timeout = {
+  .name = "stream socket timout",
+  .callback = _cb_timeout_handler,
+};
+
+/* remember if initialized or not */
+OLSR_SUBSYSTEM_STATE(_stream_state);
+
 /**
  * Initialize the stream socket handlers
  * @return -1 if an error happened, 0 otherwise.
 /**
  * Initialize the stream socket handlers
  * @return -1 if an error happened, 0 otherwise.
@@ -93,13 +97,7 @@ olsr_stream_init(void) {
     return -1;
   }
 
     return -1;
   }
 
-  connection_timeout = olsr_timer_add("stream socket timout",
-      &_cb_timeout_handler, false);
-  if (connection_timeout == NULL) {
-    OLSR_WARN_OOM(LOG_SOCKET_STREAM);
-    olsr_memcookie_remove(connection_cookie);
-    return -1;
-  }
+  olsr_timer_add(&connection_timeout);
 
   list_init_head(&olsr_stream_head);
   olsr_subsystem_init(&_stream_state);
 
   list_init_head(&olsr_stream_head);
   olsr_subsystem_init(&_stream_state);
@@ -123,7 +121,7 @@ olsr_stream_cleanup(void) {
   }
 
   olsr_memcookie_remove(connection_cookie);
   }
 
   olsr_memcookie_remove(connection_cookie);
-  olsr_timer_remove(connection_timeout);
+  olsr_timer_remove(&connection_timeout);
 }
 
 /**
 }
 
 /**
@@ -294,7 +292,7 @@ connect_to_error:
  */
 void
 olsr_stream_set_timeout(struct olsr_stream_session *con, uint32_t timeout) {
  */
 void
 olsr_stream_set_timeout(struct olsr_stream_session *con, uint32_t timeout) {
-  olsr_timer_set(&con->timeout, timeout, 0, con, connection_timeout);
+  olsr_timer_set(&con->timeout, timeout, 0, con, &connection_timeout);
 }
 
 /**
 }
 
 /**
@@ -541,7 +539,7 @@ _create_session(struct olsr_stream_socket *stream_socket,
 
   if (stream_socket->config.session_timeout) {
     session->timeout = olsr_timer_start(
 
   if (stream_socket->config.session_timeout) {
     session->timeout = olsr_timer_start(
-        stream_socket->config.session_timeout, 0, session, connection_timeout);
+        stream_socket->config.session_timeout, 0, session, &connection_timeout);
   }
 
   if (stream_socket->config.init) {
   }
 
   if (stream_socket->config.init) {
index 0e0466d..b0bf488 100644 (file)
@@ -88,7 +88,11 @@ OLSR_SUBSYSTEM_STATE(_telnet_state);
 /* telnet session handling */
 static struct olsr_memcookie_info *_telnet_memcookie;
 static struct olsr_stream_managed _telnet_managed;
 /* telnet session handling */
 static struct olsr_memcookie_info *_telnet_memcookie;
 static struct olsr_stream_managed _telnet_managed;
-static struct olsr_timer_info *_telnet_repeat_timerinfo;
+static struct olsr_timer_info _telnet_repeat_timerinfo = {
+  .name = "txt repeat timer",
+  .callback = _cb_telnet_repeat_timer,
+  .periodic = true,
+};
 
 struct avl_tree telnet_cmd_tree;
 
 
 struct avl_tree telnet_cmd_tree;
 
@@ -109,11 +113,7 @@ olsr_telnet_init(void) {
     return -1;
   }
 
     return -1;
   }
 
-  _telnet_repeat_timerinfo = olsr_timer_add("txt repeat timer", _cb_telnet_repeat_timer, true);
-  if (_telnet_repeat_timerinfo == NULL) {
-    olsr_subsystem_cleanup(&_telnet_state);
-    return -1;
-  }
+  olsr_timer_add(&_telnet_repeat_timerinfo );
 
   cfg_schema_add_section(olsr_cfg_get_schema(), &telnet_section,
       telnet_entries, ARRAYSIZE(telnet_entries));
 
   cfg_schema_add_section(olsr_cfg_get_schema(), &telnet_section,
       telnet_entries, ARRAYSIZE(telnet_entries));
@@ -640,7 +640,7 @@ _cb_telnet_repeat(struct olsr_telnet_data *data) {
 
   interval = atoi(data->parameter);
 
 
   interval = atoi(data->parameter);
 
-  timer = olsr_timer_start(interval * 1000, 0, data, _telnet_repeat_timerinfo);
+  timer = olsr_timer_start(interval * 1000, 0, data, &_telnet_repeat_timerinfo);
   data->stop_handler = _cb_telnet_repeat_stophandler;
   data->stop_data[0] = timer;
   data->stop_data[1] = strdup(ptr);
   data->stop_handler = _cb_telnet_repeat_stophandler;
   data->stop_data[0] = timer;
   data->stop_data[1] = strdup(ptr);
index 69bdfb2..80944a3 100644 (file)
@@ -59,7 +59,6 @@ static uint32_t timer_last_run;        /* remember the last timeslot walk */
 /* Memory cookie for the timer manager */
 struct list_entity timerinfo_list;
 static struct olsr_memcookie_info *timer_mem_cookie = NULL;
 /* Memory cookie for the timer manager */
 struct list_entity timerinfo_list;
 static struct olsr_memcookie_info *timer_mem_cookie = NULL;
-static struct olsr_memcookie_info *timerinfo_cookie = NULL;
 
 /* remember if initialized or not */
 OLSR_SUBSYSTEM_STATE(_timer_state);
 
 /* remember if initialized or not */
 OLSR_SUBSYSTEM_STATE(_timer_state);
@@ -99,11 +98,6 @@ olsr_timer_init(void)
   }
 
   list_init_head(&timerinfo_list);
   }
 
   list_init_head(&timerinfo_list);
-  timerinfo_cookie = olsr_memcookie_add("timerinfo", sizeof(struct olsr_timer_info));
-  if (timerinfo_cookie == NULL) {
-    olsr_memcookie_remove(timer_mem_cookie);
-    return -1;
-  }
 
   olsr_subsystem_init(&_timer_state);
   return 0;
 
   olsr_subsystem_init(&_timer_state);
   return 0;
@@ -136,38 +130,20 @@ olsr_timer_cleanup(void)
 
   /* free all timerinfos */
   OLSR_FOR_ALL_TIMERS(ti, iterator) {
 
   /* free all timerinfos */
   OLSR_FOR_ALL_TIMERS(ti, iterator) {
-    list_remove(&ti->node);
-    free(ti->name);
-    olsr_memcookie_free(timerinfo_cookie, ti);
+    olsr_timer_remove(ti);
   }
 
   /* release memory cookie for timers */
   }
 
   /* release memory cookie for timers */
-  olsr_memcookie_remove(timerinfo_cookie);
+  olsr_memcookie_remove(timer_mem_cookie);
 }
 
 }
 
-// TODO: remove malloc by using pointer to initialized timer_info?
 /**
  * Add a new group of timers to the scheduler
 /**
  * Add a new group of timers to the scheduler
- * @param name name of timer
- * @param callback timer event function
- * @param periodic true if the timer is periodic, false otherwise
- * @return new timer info
+ * @param ti pointer to uninitialized timer info
  */
  */
-struct olsr_timer_info *
-olsr_timer_add(const char *name, timer_cb_func callback, bool periodic) {
-  struct olsr_timer_info *ti;
-
-  ti = olsr_memcookie_malloc(timerinfo_cookie);
-  if (ti == NULL) {
-    OLSR_WARN_OOM(LOG_MEMCOOKIE);
-    return NULL;
-  }
-  ti->name = strdup(name);
-  ti->callback = callback;
-  ti->periodic = periodic;
-
+void
+olsr_timer_add(struct olsr_timer_info *ti) {
   list_add_tail(&timerinfo_list, &ti->node);
   list_add_tail(&timerinfo_list, &ti->node);
-  return ti;
 }
 
 /**
 }
 
 /**
@@ -190,9 +166,6 @@ olsr_timer_remove(struct olsr_timer_info *info) {
   }
 
   list_remove(&info->node);
   }
 
   list_remove(&info->node);
-  free (info->name);
-
-  olsr_memcookie_free(timerinfo_cookie, info);
 }
 
 /**
 }
 
 /**
index 25ffe56..624a674 100644 (file)
@@ -61,7 +61,7 @@ struct olsr_timer_info {
   struct list_entity node;
 
   /* name of this timer class */
   struct list_entity node;
 
   /* name of this timer class */
-  char *name;
+  const char *name;
 
   /* callback function */
   timer_cb_func callback;
 
   /* callback function */
   timer_cb_func callback;
@@ -121,8 +121,7 @@ EXPORT int olsr_timer_init(void) __attribute__((warn_unused_result));
 EXPORT void olsr_timer_cleanup(void);
 EXPORT void olsr_timer_walk(void);
 
 EXPORT void olsr_timer_cleanup(void);
 EXPORT void olsr_timer_walk(void);
 
-EXPORT struct olsr_timer_info *olsr_timer_add(
-    const char *name, timer_cb_func callback, bool periodic) __attribute__((warn_unused_result));
+EXPORT void olsr_timer_add(struct olsr_timer_info *ti);
 EXPORT void olsr_timer_remove(struct olsr_timer_info *);
 
 EXPORT void olsr_timer_set(struct olsr_timer_entry **, uint32_t, uint8_t,
 EXPORT void olsr_timer_remove(struct olsr_timer_info *);
 
 EXPORT void olsr_timer_set(struct olsr_timer_entry **, uint32_t, uint8_t,
index 328cc07..1c7a15e 100644 (file)
@@ -107,7 +107,10 @@ static struct msghdr _netlink_send_msg = {
 };
 
 /* netlink timeout handling */
 };
 
 /* netlink timeout handling */
-static struct olsr_timer_info *_netlink_timer;
+static struct olsr_timer_info _netlink_timer= {
+  .name = "rtnetlink feedback timer",
+  .callback = _cb_handle_netlink_timerout,
+};
 
 /* built in rtnetlink multicast receiver */
 static struct os_system_netlink _rtnetlink_receiver;
 
 /* built in rtnetlink multicast receiver */
 static struct os_system_netlink _rtnetlink_receiver;
@@ -124,27 +127,22 @@ os_system_init(void) {
     return 0;
   }
 
     return 0;
   }
 
-  if ((_netlink_timer =
-      olsr_timer_add("rtnetlink feedback timer", _cb_handle_netlink_timerout, false)) == NULL) {
-    OLSR_WARN(LOG_OS_SYSTEM, "Cannot allocate timer class for netlink timeout");
-    return -1;
-  }
-
   _ioctl_fd = socket(AF_INET, SOCK_DGRAM, 0);
   if (_ioctl_fd == -1) {
     OLSR_WARN(LOG_OS_SYSTEM, "Cannot open ioctl socket: %s (%d)",
         strerror(errno), errno);
   _ioctl_fd = socket(AF_INET, SOCK_DGRAM, 0);
   if (_ioctl_fd == -1) {
     OLSR_WARN(LOG_OS_SYSTEM, "Cannot open ioctl socket: %s (%d)",
         strerror(errno), errno);
-    olsr_timer_remove(_netlink_timer);
     return -1;
   }
 
   if (os_system_netlink_add(&_rtnetlink_receiver, NETLINK_ROUTE,
       RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR)) {
     return -1;
   }
 
   if (os_system_netlink_add(&_rtnetlink_receiver, NETLINK_ROUTE,
       RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR)) {
-    olsr_timer_remove(_netlink_timer);
     close(_ioctl_fd);
     return -1;
   }
   _rtnetlink_receiver.cb_message = _handle_rtnetlink;
     close(_ioctl_fd);
     return -1;
   }
   _rtnetlink_receiver.cb_message = _handle_rtnetlink;
+
+  olsr_timer_add(&_netlink_timer);
+
   olsr_subsystem_init(&_os_system_state);
   return 0;
 }
   olsr_subsystem_init(&_os_system_state);
   return 0;
 }
@@ -157,8 +155,8 @@ os_system_cleanup(void) {
   if (olsr_subsystem_cleanup(&_os_system_state))
     return;
 
   if (olsr_subsystem_cleanup(&_os_system_state))
     return;
 
+  olsr_timer_remove(&_netlink_timer);
   os_system_netlink_remove(&_rtnetlink_receiver);
   os_system_netlink_remove(&_rtnetlink_receiver);
-  olsr_timer_remove(_netlink_timer);
   close(_ioctl_fd);
 }
 
   close(_ioctl_fd);
 }
 
@@ -359,7 +357,7 @@ _flush_netlink_buffer(struct os_system_netlink *nl) {
   ssize_t ret;
 
   /* start feedback timer */
   ssize_t ret;
 
   /* start feedback timer */
-  olsr_timer_set(&nl->timeout, OS_SYSTEM_NETLINK_TIMEOUT*10, 0, nl, _netlink_timer);
+  olsr_timer_set(&nl->timeout, OS_SYSTEM_NETLINK_TIMEOUT, 0, nl, &_netlink_timer);
 
   /* send outgoing message */
   _netlink_send_iov[0].iov_base = abuf_getptr(&nl->out);
 
   /* send outgoing message */
   _netlink_send_iov[0].iov_base = abuf_getptr(&nl->out);