]>
git.proxmox.com Git - mirror_frr.git/blob - pceplib/pcep_utils_queue.c
1 // SPDX-License-Identifier: LGPL-2.1-or-later
3 * This file is part of the PCEPlib, a PCEP protocol library.
5 * Copyright (C) 2020 Volta Networks https://voltanet.io/
7 * Author : Brady Johnson <brady@voltanet.io>
20 #include "pcep_utils_logging.h"
21 #include "pcep_utils_memory.h"
22 #include "pcep_utils_queue.h"
24 queue_handle
*queue_initialize(void)
26 /* Set the max_entries to 0 to disable it */
27 return queue_initialize_with_size(0);
31 queue_handle
*queue_initialize_with_size(unsigned int max_entries
)
33 queue_handle
*handle
=
34 pceplib_malloc(PCEPLIB_INFRA
, sizeof(queue_handle
));
35 memset(handle
, 0, sizeof(queue_handle
));
36 handle
->max_entries
= max_entries
;
42 void queue_destroy(queue_handle
*handle
)
47 "%s: queue_destroy, the queue has not been initialized",
52 while (queue_dequeue(handle
) != NULL
) {
54 pceplib_free(PCEPLIB_INFRA
, handle
);
58 void queue_destroy_with_data(queue_handle
*handle
)
63 "%s: queue_destroy_with_data, the queue has not been initialized",
68 void *data
= queue_dequeue(handle
);
69 while (data
!= NULL
) {
70 pceplib_free(PCEPLIB_INFRA
, data
);
71 data
= queue_dequeue(handle
);
73 pceplib_free(PCEPLIB_INFRA
, handle
);
77 queue_node
*queue_enqueue(queue_handle
*handle
, void *data
)
82 "%s: queue_enqueue, the queue has not been initialized",
87 if (handle
->max_entries
> 0
88 && handle
->num_entries
>= handle
->max_entries
) {
91 "%s: queue_enqueue, cannot enqueue: max entries hit [%u]",
96 queue_node
*new_node
=
97 pceplib_malloc(PCEPLIB_INFRA
, sizeof(queue_node
));
98 memset(new_node
, 0, sizeof(queue_node
));
99 new_node
->data
= data
;
100 new_node
->next_node
= NULL
;
102 (handle
->num_entries
)++;
103 if (handle
->head
== NULL
) {
104 /* its the first entry in the queue */
105 handle
->head
= handle
->tail
= new_node
;
107 handle
->tail
->next_node
= new_node
;
108 handle
->tail
= new_node
;
115 void *queue_dequeue(queue_handle
*handle
)
117 if (handle
== NULL
) {
120 "%s: queue_dequeue, the queue has not been initialized",
125 if (handle
->head
== NULL
) {
129 void *node_data
= handle
->head
->data
;
130 queue_node
*node
= handle
->head
;
131 (handle
->num_entries
)--;
132 if (handle
->head
== handle
->tail
) {
133 /* its the last entry in the queue */
134 handle
->head
= handle
->tail
= NULL
;
136 handle
->head
= node
->next_node
;
139 pceplib_free(PCEPLIB_INFRA
, node
);