MME2 changes - Propped commits from openmme/paging branch. Added scripts
for code gen
Change-Id: Ie55032217232214ac8544ca76ea34335205329e4
diff --git a/src/common/tpool_queue.c b/src/common/tpool_queue.c
new file mode 100644
index 0000000..f8e0092
--- /dev/null
+++ b/src/common/tpool_queue.c
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include "thread_pool.h"
+#include "tpool_queue.h"
+
+/* allocates memory for node and initialize it */
+static struct node *createnode(void *data)
+{
+ struct node *entry;
+
+ entry = (struct node *)malloc(sizeof(struct node));
+ if(entry == NULL) {
+#ifdef DEBUG
+ log_msg(LOG_ERROR, "failed to allocate memory\n");
+#endif
+ return NULL;
+ }
+
+ entry->data = data;
+ entry->next = NULL;
+
+ return entry;
+}
+
+/* push data to queue tail */
+int queue_push_tail(struct Queue *queue, void *data)
+{
+ struct node *entry;
+
+ if(queue == NULL)
+ return -1;
+
+ entry = createnode(data);
+ if(entry == NULL) {
+ return -ENOMEM;
+ }
+
+ /* For empty queue */
+ if(queue->head == NULL)
+ queue->head = entry;
+ else
+ queue->tail->next = entry;
+ queue->tail = entry;
+
+ /* atomic increment */
+ __sync_fetch_and_add(&queue->length, 1);
+ return 0;
+}
+
+/* removes head and return its data */
+void *queue_pop_head(struct Queue *queue)
+{
+ void *data;
+ struct node *entry;
+
+ if(queue == NULL || queue->length == 0)
+ return NULL;
+
+ if(queue->head == NULL) {
+ return NULL;
+ }
+
+ entry = queue->head;
+ queue->head = queue->head->next;
+ data = entry->data;
+ /* atomic decrement */
+ __sync_fetch_and_sub(&queue->length, 1);
+ free(entry);
+
+ return data;
+}
+
+int queue_get_length(struct Queue *queue)
+{
+ if (queue == NULL)
+ return 0;
+
+ return queue->length;
+}
+
+struct Queue *queue_new()
+{
+ struct Queue *queue;
+
+ queue = (struct Queue *)malloc(sizeof(struct Queue));
+ if(queue == NULL) {
+#ifdef DEBUG
+ log_msg(LOG_ERROR, "failed to allocate memory\n");
+#endif
+ return NULL;
+ }
+
+ queue->length = 0;
+ queue->head = NULL;
+ queue->tail = NULL;
+
+ return queue;
+}
+
+void queue_destroy(struct Queue *queue, QueueDataFreeFunc function)
+{
+ struct node *tmp;
+
+ if(queue == NULL || queue->length == 0)
+ {
+ free(queue);
+ return;
+ }
+
+ if(queue->head == NULL)
+ free(queue);
+ else {
+ tmp = queue->head;
+ while(queue->head != NULL) {
+ tmp = queue->head->next;
+ if (function != NULL)
+ function(queue->head->data);
+ free(queue->head);
+ queue->head=tmp;
+ }
+ }
+
+}
+
+