#include <stdint.h>
#include <string.h>
-#include <freeradius-devel/autoconf.h>
-
+#include <freeradius-devel/rad_assert.h>
#include <freeradius-devel/util/queue.h>
struct fr_queue_t {
if (!data) return false;
+ if (fq->num >= fq->size) return false;
+
fq->entry[fq->head++] = data;
- if (fq->head > fq->size) fq->head = 0;
+ if (fq->head >= fq->size) fq->head = 0;
fq->num++;
return true;
if (fq->num == 0) return false;
*p_data = fq->entry[fq->tail++];
- if (fq->tail >= fq->size) fq->head = 0;
- fq->num++;
+ if (fq->tail >= fq->size) fq->tail = 0;
+ fq->num--;
return true;
}
* Simple block of used elements, copy it.
*/
if (fq->head > fq->tail) {
+ rad_assert(fq->num == (fq->head - fq->tail));
memcpy(&nq->entry[0], &fq->entry[fq->tail], &fq->entry[fq->head] - &fq->entry[fq->tail]);
nq->head = fq->num;
nq->num = fq->num;
memcpy(&nq->entry[0], &fq->entry[fq->tail], &fq->entry[fq->size] - &fq->entry[fq->tail]);
nq->head = fq->size - fq->tail;
+ rad_assert((nq->head + fq->head) == fq->num);
+
memcpy(&nq->entry[nq->head], &fq->entry[0], &fq->entry[fq->head] - &fq->entry[0]);
nq->head = fq->num;
nq->num = fq->num;
}
fq->entry[fq->head++] = data;
- if (fq->head > fq->size) fq->head = 0;
+ if (fq->head >= fq->size) fq->head = 0;
fq->num++;
+ rad_assert(fq->num <= fq->size);
}
return room;