summaryrefslogtreecommitdiff
path: root/daemons/shaper/src/shaper_log_queue.c
diff options
context:
space:
mode:
Diffstat (limited to 'daemons/shaper/src/shaper_log_queue.c')
-rw-r--r--daemons/shaper/src/shaper_log_queue.c200
1 files changed, 200 insertions, 0 deletions
diff --git a/daemons/shaper/src/shaper_log_queue.c b/daemons/shaper/src/shaper_log_queue.c
new file mode 100644
index 00000000..52c6eb5e
--- /dev/null
+++ b/daemons/shaper/src/shaper_log_queue.c
@@ -0,0 +1,200 @@
+/*************************************************************************************************************
+Copyright (c) 2016-2017, Harman International Industries, Incorporated
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS LISTED "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS LISTED BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*************************************************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <inttypes.h>
+
+#include "shaper_log_queue.h"
+
+#define SHAPER_LOG_COMPONENT "Queue"
+#include "shaper_log.h"
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+struct shaper_log_queue_elem {
+ int setFlg;
+ void *data;
+};
+
+struct shaper_log_queue {
+ // Size of each element
+ uint32_t elemSize;
+
+ // Number of queue element slots
+ uint32_t queueSize;
+
+ // Next element to be filled
+ uint32_t head;
+
+ // Next element to be pulled
+ uint32_t tail;
+
+ shaper_log_queue_elem_t elemArray;
+};
+
+shaper_log_queue_t shaperLogQueueNewQueue(uint32_t elemSize, uint32_t queueSize)
+{
+ if (elemSize < 1 || queueSize < 1)
+ return NULL;
+
+ shaper_log_queue_t retQueue = calloc(1, sizeof(struct shaper_log_queue));
+ if (retQueue) {
+ retQueue->elemArray = calloc(queueSize, sizeof(struct shaper_log_queue_elem));
+ if (retQueue->elemArray) {
+ uint32_t i1;
+ for (i1 = 0; i1 < queueSize; i1++) {
+ retQueue->elemArray[i1].data = calloc(1, elemSize);
+ if (!retQueue->elemArray[i1].data) {
+ shaperLogQueueDeleteQueue(retQueue);
+ return NULL;
+ }
+ }
+ }
+ else {
+ shaperLogQueueDeleteQueue(retQueue);
+ return NULL;
+ }
+
+ retQueue->elemSize = elemSize;
+ retQueue->queueSize = queueSize;
+ retQueue->head = 0;
+ retQueue->tail = 0;
+ }
+
+ return retQueue;
+}
+
+void shaperLogQueueDeleteQueue(shaper_log_queue_t queue)
+{
+ if (queue) {
+ uint32_t i1;
+ for (i1 = 0; i1 < queue->queueSize; i1++) {
+ free(queue->elemArray[i1].data);
+ queue->elemArray[i1].data = NULL;
+ }
+ free(queue->elemArray);
+ queue->elemArray = NULL;
+ free(queue);
+ }
+}
+
+uint32_t shaperLogQueueGetQueueSize(shaper_log_queue_t queue)
+{
+ if (queue) {
+ return queue->queueSize;
+ }
+ return 0;
+}
+
+uint32_t shaperLogQueueGetElemCount(shaper_log_queue_t queue)
+{
+ uint32_t cnt = 0;
+ if (queue) {
+ if (queue->head > queue->tail) {
+ cnt += queue->head - queue->tail - 1;
+ }
+ else if (queue->head < queue->tail) {
+ cnt += queue->head + ((queue->queueSize - 1) - queue->tail);
+ }
+
+ if (queue->elemArray[queue->tail].setFlg) {
+ cnt++;
+ }
+ }
+ return cnt;
+}
+
+uint32_t shaperLogQueueGetElemSize(shaper_log_queue_t queue)
+{
+ if (queue) {
+ return queue->elemSize;
+ }
+ return 0;
+}
+
+void *shaperLogQueueData(shaper_log_queue_elem_t elem)
+{
+ if (elem) {
+ return elem->data;
+ }
+ return NULL;
+}
+
+shaper_log_queue_elem_t shaperLogQueueHeadLock(shaper_log_queue_t queue)
+{
+ if (queue) {
+ if (!queue->elemArray[queue->head].setFlg) {
+ return &queue->elemArray[queue->head];
+ }
+ }
+ return NULL;
+}
+
+void shaperLogQueueHeadUnlock(shaper_log_queue_t queue)
+{
+ (void) queue;
+}
+
+void shaperLogQueueHeadPush(shaper_log_queue_t queue)
+{
+ if (queue) {
+ queue->elemArray[queue->head++].setFlg = TRUE;
+ if (queue->head >= queue->queueSize) {
+ queue->head = 0;
+ }
+ }
+}
+
+shaper_log_queue_elem_t shaperLogQueueTailLock(shaper_log_queue_t queue)
+{
+ if (queue) {
+ if (queue->elemArray[queue->tail].setFlg) {
+ return &queue->elemArray[queue->tail];
+ }
+ }
+ return NULL;
+}
+
+void shaperLogQueueTailUnlock(shaper_log_queue_t queue)
+{
+ (void) queue;
+}
+
+void shaperLogQueueTailPull(shaper_log_queue_t queue)
+{
+ if (queue) {
+ queue->elemArray[queue->tail++].setFlg = FALSE;
+ if (queue->tail >= queue->queueSize) {
+ queue->tail = 0;
+ }
+ }
+}