mbed port of tinydtls

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers netq.c Source File

netq.c

00001 /* netq.h -- Simple packet queue
00002  *
00003  * Copyright (C) 2010--2012 Olaf Bergmann <bergmann@tzi.org>
00004  *
00005  * This file is part of the library tinyDTLS. Please see the file
00006  * LICENSE for terms of use.
00007  */
00008 
00009 //#include "netinet/in.h"
00010 #include "debug.h"
00011 #include "netq.h"
00012 
00013 
00014 #ifdef HAVE_ASSERT_H
00015 #include <assert.h>
00016 #else
00017 #ifndef assert
00018 #warning "assertions are disabled"
00019 #  define assert(x)
00020 #endif
00021 #endif
00022 
00023 #include "t_list.h"
00024 
00025 #ifndef WITH_CONTIKI
00026 #include <stdlib.h>
00027 
00028 static inline netq_t *
00029 netq_malloc_node() {
00030   return (netq_t *)malloc(sizeof(netq_t));
00031 }
00032 
00033 static inline void
00034 netq_free_node(netq_t *node) {
00035   free(node);
00036 }
00037 
00038 /* FIXME: implement Contiki's list functions using utlist.h */
00039 
00040 #else /* WITH_CONTIKI */
00041 #include "memb.h"
00042 
00043 MEMB(netq_storage, netq_t, NETQ_MAXCNT);
00044 
00045 static inline netq_t *
00046 netq_malloc_node() {
00047   return (netq_t *)memb_alloc(&netq_storage);
00048 }
00049 
00050 static inline void
00051 netq_free_node(netq_t *node) {
00052   memb_free(&netq_storage, node);
00053 }
00054 #endif /* WITH_CONTIKI */
00055 
00056 void
00057 netq_init() {
00058 #ifdef WITH_CONTIKI
00059   memb_init(&netq_storage);
00060 #endif /* WITH_CONTIKI */
00061 }
00062 
00063 int 
00064 netq_insert_node(netq_t **queue, netq_t *node) {
00065   netq_t *p;
00066 
00067   assert(queue);
00068   assert(node);
00069 
00070   p = (netq_t *)list_head((list_t)queue);
00071   while(p && p->t <= node->t)
00072     p = list_item_next(p);
00073 
00074   if (p)
00075     list_insert((list_t)queue, p, node);
00076   else
00077     list_push((list_t)queue, node);
00078 
00079   return 1;
00080 }
00081 
00082 netq_t *
00083 netq_head(netq_t **queue) {
00084   if (!queue)
00085     return NULL;
00086 
00087   return list_head((list_t)queue);
00088 }
00089 
00090 netq_t *netq_pop_first(netq_t **queue) {
00091   if (!queue)
00092     return NULL;
00093 
00094   return list_pop((list_t)queue);
00095 }
00096 
00097 netq_t *
00098 netq_node_new() {
00099   netq_t *node;
00100   node = netq_malloc_node();
00101 
00102 #ifndef NDEBUG
00103   if (!node)
00104     dsrv_log(LOG_WARN, "netq_node_new: malloc\n");
00105 #endif
00106 
00107   if (node)
00108     memset(node, 0, sizeof(netq_t));
00109 
00110   return node;  
00111 }
00112 
00113 void 
00114 netq_node_free(netq_t *node) {
00115   if (node)
00116     netq_free_node(node);
00117 }
00118 
00119 void 
00120 netq_delete_all(netq_t *queue) {
00121   netq_t *p;
00122   if (queue) {
00123     while((p = list_pop((list_t)&queue)))
00124       netq_free_node(p); 
00125   }
00126 }
00127