tinydtls  0.8.6
netq.c
Go to the documentation of this file.
1 /*******************************************************************************
2  *
3  * Copyright (c) 2011, 2012, 2013, 2014, 2015 Olaf Bergmann (TZI) and others.
4  * All rights reserved. This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License v1.0
6  * and Eclipse Distribution License v. 1.0 which accompanies this distribution.
7  *
8  * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
9  * and the Eclipse Distribution License is available at
10  * http://www.eclipse.org/org/documents/edl-v10.php.
11  *
12  * Contributors:
13  * Olaf Bergmann - initial API and implementation
14  * Hauke Mehrtens - memory optimization, ECC integration
15  *
16  *******************************************************************************/
17 
18 #include "dtls_debug.h"
19 #include "netq.h"
20 #include "utlist.h"
21 
22 #ifdef HAVE_ASSERT_H
23 #include <assert.h>
24 #else
25 #ifndef assert
26 #warning "assertions are disabled"
27 # define assert(x)
28 #endif
29 #endif
30 
31 #ifndef WITH_CONTIKI
32 #include <stdlib.h>
33 
34 static inline netq_t *
35 netq_malloc_node(size_t size) {
36  return (netq_t *)malloc(sizeof(netq_t) + size);
37 }
38 
39 static inline void
41  free(node);
42 }
43 
44 #else /* WITH_CONTIKI */
45 #include "memb.h"
46 
47 MEMB(netq_storage, netq_t, NETQ_MAXCNT);
48 
49 static inline netq_t *
50 netq_malloc_node(size_t size) {
51  return (netq_t *)memb_alloc(&netq_storage);
52 }
53 
54 static inline void
55 netq_free_node(netq_t *node) {
56  memb_free(&netq_storage, node);
57 }
58 
59 void
60 netq_init() {
61  memb_init(&netq_storage);
62 }
63 #endif /* WITH_CONTIKI */
64 
65 int
66 netq_insert_node(netq_t **queue, netq_t *node) {
67  netq_t *p;
68 
69  assert(queue);
70  assert(node);
71 
72  p = *queue;
73  while(p && p->t <= node->t) {
74  assert(p != node);
75  if (p == node)
76  return 0;
77  p = p->next;
78  }
79 
80  if (p)
81  LL_PREPEND_ELEM(*queue, p, node);
82  else
83  LL_APPEND(*queue, node);
84 
85  return 1;
86 }
87 
88 netq_t *
89 netq_head(netq_t **queue) {
90  return queue ? *queue : NULL;
91 }
92 
93 netq_t *
95  if (!p)
96  return NULL;
97 
98  return p->next;
99 }
100 
101 void
102 netq_remove(netq_t **queue, netq_t *p) {
103  if (!queue || !p)
104  return;
105 
106  LL_DELETE(*queue, p);
107 }
108 
110  netq_t *p = netq_head(queue);
111 
112  if (p)
113  LL_DELETE(*queue, p);
114 
115  return p;
116 }
117 
118 netq_t *
119 netq_node_new(size_t size) {
120  netq_t *node;
121  node = netq_malloc_node(size);
122 
123 #ifndef NDEBUG
124  if (!node)
125  dtls_warn("netq_node_new: malloc\n");
126 #endif
127 
128  if (node)
129  memset(node, 0, sizeof(netq_t));
130 
131  return node;
132 }
133 
134 void
136  if (node)
137  netq_free_node(node);
138 }
139 
140 void
142  netq_t *p, *tmp;
143  if (queue) {
144  LL_FOREACH_SAFE(*queue,p,tmp) {
145  netq_free_node(p);
146  }
147 
148  *queue = NULL;
149  }
150 }
int netq_insert_node(netq_t **queue, netq_t *node)
Definition: netq.c:66
netq_t * netq_pop_first(netq_t **queue)
Definition: netq.c:109
struct netq_t * next
Definition: netq.h:48
netq_t * netq_next(netq_t *p)
Definition: netq.c:94
Definition: netq.h:47
netq_t * netq_node_new(size_t size)
Definition: netq.c:119
static void netq_init(void)
Definition: netq.h:67
void netq_delete_all(netq_t **queue)
Definition: netq.c:141
netq_t * netq_head(netq_t **queue)
Definition: netq.c:89
#define assert(x)
Definition: hmac.c:25
#define dtls_warn(...)
Definition: dtls_debug.h:115
clock_time_t t
Definition: netq.h:50
static void netq_free_node(netq_t *node)
Definition: netq.c:40
#define NETQ_MAXCNT
Definition: netq.h:36
#define LL_APPEND(head, add)
Definition: utlist.h:338
static netq_t * netq_malloc_node(size_t size)
Definition: netq.c:35
#define LL_FOREACH_SAFE(head, el, tmp)
Definition: utlist.h:419
void netq_remove(netq_t **queue, netq_t *p)
Definition: netq.c:102
#define LL_DELETE(head, del)
Definition: utlist.h:385
void netq_node_free(netq_t *node)
Definition: netq.c:135
#define LL_PREPEND_ELEM(head, el, add)
Definition: utlist.h:491