123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- #include <string.h>
- #include <stdlib.h>
- #include "node.h"
- static inline coap_queue_t *
- coap_malloc_node(void) {
- return (coap_queue_t *)calloc(1,sizeof(coap_queue_t));
- }
- void coap_free_node(coap_queue_t *node) {
- free(node);
- }
- int coap_insert_node(coap_queue_t **queue, coap_queue_t *node) {
- coap_queue_t *p, *q;
- if ( !queue || !node )
- return 0;
- /* set queue head if empty */
- if ( !*queue ) {
- *queue = node;
- return 1;
- }
- /* replace queue head if PDU's time is less than head's time */
- q = *queue;
- if (node->t < q->t) {
- node->next = q;
- *queue = node;
- q->t -= node->t; /* make q->t relative to node->t */
- return 1;
- }
- /* search for right place to insert */
- do {
- node->t -= q->t; /* make node-> relative to q->t */
- p = q;
- q = q->next;
- } while (q && q->t <= node->t);
- /* insert new item */
- if (q) {
- q->t -= node->t; /* make q->t relative to node->t */
- }
- node->next = q;
- p->next = node;
- return 1;
- }
- int coap_delete_node(coap_queue_t *node) {
- if ( !node )
- return 0;
- coap_delete_pdu(node->pdu);
- coap_free_node(node);
- return 1;
- }
- void coap_delete_all(coap_queue_t *queue) {
- if ( !queue )
- return;
- coap_delete_all( queue->next );
- coap_delete_node( queue );
- }
- coap_queue_t * coap_new_node(void) {
- coap_queue_t *node;
- node = coap_malloc_node();
- if ( ! node ) {
- return NULL;
- }
- memset(node, 0, sizeof(*node));
- return node;
- }
- coap_queue_t * coap_peek_next( coap_queue_t *queue ) {
- if ( !queue )
- return NULL;
- return queue;
- }
- coap_queue_t * coap_pop_next( coap_queue_t **queue ) { // this function is called inside timeout callback only.
- coap_queue_t *next;
- if ( !(*queue) )
- return NULL;
- next = *queue;
- *queue = (*queue)->next;
- // if (queue) {
- // queue->t += next->t;
- // }
- next->next = NULL;
- return next;
- }
- int coap_remove_node( coap_queue_t **queue, const coap_tid_t id){
- coap_queue_t *p, *q, *node;
- if ( !queue )
- return 0;
- if ( !*queue ) // if empty
- return 0;
- q = *queue;
- if (q->id == id) {
- node = q;
- *queue = q->next;
- node->next = NULL;
- if(*queue){
- (*queue)->t += node->t;
- }
- coap_delete_node(node);
- return 1;
- }
- /* search for right node to remove */
- while (q && q->id != id) {
- p = q;
- q = q->next;
- }
- /* find the node */
- if (q) {
- node = q; /* save the node */
- p->next = q->next; /* remove the node */
- q = q->next;
- node->next = NULL;
- if (q) // add node->t to the node after.
- {
- q->t += node->t;
- }
- coap_delete_node(node);
- return 1;
- }
- return 0;
- }
|