Version 0.5.0 of tinydtls

Dependents:   tinydtls_test_cellular tinydtls_test_ethernet tiny-dtls

netq.c

Committer:
ashleymills
Date:
2014-02-12
Revision:
1:598a56fe116e
Parent:
0:ff9ebe0cf0e9

File content as of revision 1:598a56fe116e:

/* netq.h -- Simple packet queue
 *
 * Copyright (C) 2010--2012 Olaf Bergmann <bergmann@tzi.org>
 *
 * This file is part of the library tinyDTLS. Please see the file
 * LICENSE for terms of use.
 */

#include "debug.h"
#include "netq.h"

#ifdef HAVE_ASSERT_H
#include <assert.h>
#else
#ifndef assert
#warning "assertions are disabled"
#  define assert(x)
#endif
#endif

#include "t_list.h"

#ifndef WITH_CONTIKI
#include <stdlib.h>

static inline netq_t *
netq_malloc_node() {
  return (netq_t *)malloc(sizeof(netq_t));
}

static inline void
netq_free_node(netq_t *node) {
  free(node);
}

/* FIXME: implement Contiki's list functions using utlist.h */

#else /* WITH_CONTIKI */
#include "memb.h"

MEMB(netq_storage, netq_t, NETQ_MAXCNT);

static inline netq_t *
netq_malloc_node() {
  return (netq_t *)memb_alloc(&netq_storage);
}

static inline void
netq_free_node(netq_t *node) {
  memb_free(&netq_storage, node);
}

void
netq_init() {
  memb_init(&netq_storage);
}
#endif /* WITH_CONTIKI */

int 
netq_insert_node(netq_t **queue, netq_t *node) {
  netq_t *p;

  assert(queue);
  assert(node);

  p = (netq_t *)list_head((list_t)queue);
  while(p && p->t <= node->t)
    p = list_item_next(p);

  if (p)
    list_insert((list_t)queue, p, node);
  else
    list_push((list_t)queue, node);

  return 1;
}

netq_t *
netq_head(netq_t **queue) {
  if (!queue)
    return NULL;

  return list_head((list_t)queue);
}

netq_t *netq_pop_first(netq_t **queue) {
  if (!queue)
    return NULL;

  return list_pop((list_t)queue);
}

netq_t *
netq_node_new() {
  netq_t *node;
  node = netq_malloc_node();

#ifndef NDEBUG
  if (!node)
    dsrv_log(LOG_WARN, "netq_node_new: malloc\n");
#endif

  if (node)
    memset(node, 0, sizeof(netq_t));

  return node;  
}

void 
netq_node_free(netq_t *node) {
  if (node)
    netq_free_node(node);
}

void 
netq_delete_all(netq_t *queue) {
  netq_t *p;
  if (queue) {
    while((p = list_pop((list_t)&queue)))
      netq_free_node(p); 
  }
}