13
13
#include "utils/queue.h"
14
14
#include "log/log.h"
15
15
16
+ void queue_init_data (struct queue * qu , size_t capacity )
17
+ {
18
+ assert (qu != NULL );
19
+ assert (capacity > 0 );
20
+ assert (capacity > qu -> capacity );
21
+
22
+ char * new_data = NULL ;
23
+ new_data = realloc (qu -> data , capacity );
24
+ assert (new_data != NULL );
25
+
26
+ qu -> data = new_data ;
27
+ qu -> capacity = capacity ;
28
+ qu -> free_capacity = capacity - qu -> size ;
29
+ }
30
+
31
+ void queue_expand_capacity (struct queue * qu , size_t size )
32
+ {
33
+ assert (qu != NULL );
34
+ if (size == 0 )
35
+ return ;
36
+
37
+ if (qu -> size + size < qu -> free_capacity )
38
+ return ;
39
+
40
+ size_t new_cap = qu -> capacity * 2 , new_free_cap = new_cap - qu -> size ;
41
+ while (qu -> size + size >= new_free_cap ) {
42
+ new_cap *= 2 ;
43
+ new_free_cap = new_cap - qu -> size ;
44
+ }
45
+ queue_init_data (qu , new_cap );
46
+ }
47
+
16
48
/**
17
49
* @brief Initializes a queue with the specified capacity.
18
50
*
@@ -35,12 +67,11 @@ void queue_init(struct queue** qu, size_t capacity)
35
67
* qu = malloc (sizeof (struct queue ));
36
68
assert (qu != NULL );
37
69
38
- (* qu )-> data = malloc (capacity );
39
- assert ((* qu )-> data != NULL );
40
-
41
- (* qu )-> capacity = capacity ;
42
- (* qu )-> free_capacity = capacity ;
70
+ (* qu )-> capacity = 0 ;
43
71
(* qu )-> size = 0 ;
72
+ (* qu )-> data = NULL ;
73
+ queue_init_data (* qu , capacity );
74
+
44
75
(* qu )-> head = (* qu )-> data ;
45
76
}
46
77
@@ -81,13 +112,13 @@ void queue_push(struct queue* qu, char* data, size_t size)
81
112
assert (data != NULL );
82
113
83
114
if (size == 0 ) {
84
- log_warn ("queue_push: size is zero... noop" );
115
+ log_trace ("queue_push: size is zero... noop" );
85
116
return ;
86
117
}
87
118
88
- if (qu -> size + size >= qu -> capacity ) {
89
- log_error ( "queue_push: pushing over queue capacity... noop" );
90
- return ;
119
+ if (qu -> size + size >= qu -> free_capacity ) {
120
+ queue_expand_capacity ( qu , size );
121
+ log_info ( "queue_push: expanding current capacity to %d\n" , qu -> capacity ) ;
91
122
}
92
123
93
124
memcpy (qu -> head , data , size );
@@ -115,9 +146,9 @@ void queue_push_ex(struct queue* qu, size_t size)
115
146
return ;
116
147
}
117
148
118
- if (qu -> size + size >= qu -> capacity ) {
119
- log_error ( "queue_push: pushing over queue capacity... noop" );
120
- return ;
149
+ if (qu -> size + size >= qu -> free_capacity ) {
150
+ queue_expand_capacity ( qu , size );
151
+ log_info ( "queue_push: expanding current capacity to %d\n" , qu -> capacity ) ;
121
152
}
122
153
123
154
qu -> head += size ;
0 commit comments