summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFurquan Shaikh <furquan@google.com>2018-06-03 10:42:49 -0700
committerFurquan Shaikh <furquan@google.com>2018-06-08 23:35:54 +0000
commit7398deda2b12f2ba3ab6c14009ff8da003ef2b0c (patch)
treecd4cd66b14794474713e818b604ffc9da4caf2cb
parentb8a05e29ac9bf1557dd0e1f285704bb29b329ee2 (diff)
util/sconfig: Make queue handling more generic within main.c
This change updates queue handling routines to be more generic so that it can be used by more than just chip queue. Additionally, it provides functions to dequeue element from head and peek head of a queue which will be used in a follow-up commit. BUG=b:80081934 TEST=Verified that abuild compiles successfully for all boards. Change-Id: Ibd2de85b48c5d4e2790bf974ea3bb1bd387f66ee Signed-off-by: Furquan Shaikh <furquan@google.com> Reviewed-on: https://review.coreboot.org/26802 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org>
-rw-r--r--util/sconfig/main.c74
1 files changed, 62 insertions, 12 deletions
diff --git a/util/sconfig/main.c b/util/sconfig/main.c
index e4c940ed68..188e7f93a2 100644
--- a/util/sconfig/main.c
+++ b/util/sconfig/main.c
@@ -62,11 +62,11 @@ static struct device root = {
.enabled = 1
};
-static struct queue {
+struct queue_entry {
void *data;
- struct queue *next;
- struct queue *prev;
-} *q;
+ struct queue_entry *next;
+ struct queue_entry *prev;
+};
#define S_ALLOC(_s) s_alloc(__func__, _s)
@@ -80,21 +80,22 @@ static void *s_alloc(const char *f, size_t s)
return data;
}
-struct queue *new_queue_entry(void *data)
+static struct queue_entry *new_queue_entry(void *data)
{
- struct queue *e = S_ALLOC(sizeof(*e));
+ struct queue_entry *e = S_ALLOC(sizeof(*e));
e->data = data;
e->next = e->prev = e;
return e;
}
-void chip_enqueue_tail(void *data)
+static void enqueue_tail(struct queue_entry **q_head, void *data)
{
- struct queue *tmp = new_queue_entry(data);
+ struct queue_entry *tmp = new_queue_entry(data);
+ struct queue_entry *q = *q_head;
if (!q) {
- q = tmp;
+ *q_head = tmp;
return;
}
@@ -104,13 +105,19 @@ void chip_enqueue_tail(void *data)
tmp->next = q;
}
-void *chip_dequeue_tail(void)
+static void *dequeue_tail(struct queue_entry **q_head)
{
- struct queue *tmp = q->prev;
+ struct queue_entry *q = *q_head;
+ struct queue_entry *tmp;
void *data;
+ if (!q)
+ return NULL;
+
+ tmp = q->prev;
+
if (tmp == q)
- q = NULL;
+ *q_head = NULL;
else {
tmp->prev->next = q;
q->prev = tmp->prev;
@@ -122,6 +129,49 @@ void *chip_dequeue_tail(void)
return data;
}
+static void *dequeue_head(struct queue_entry **q_head)
+{
+ struct queue_entry *q = *q_head;
+ struct queue_entry *tmp = q;
+ void *data;
+
+ if (!q)
+ return NULL;
+
+ if (q->next == q)
+ *q_head = NULL;
+ else {
+ q->next->prev = q->prev;
+ q->prev->next = q->next;
+ *q_head = q->next;
+ }
+
+ data = tmp->data;
+ free(tmp);
+
+ return data;
+}
+
+static void *peek_queue_head(struct queue_entry *q_head)
+{
+ if (!q_head)
+ return NULL;
+
+ return q_head->data;
+}
+
+static struct queue_entry *chip_q_head;
+
+void chip_enqueue_tail(void *data)
+{
+ enqueue_tail(&chip_q_head, data);
+}
+
+void *chip_dequeue_tail(void)
+{
+ return dequeue_tail(&chip_q_head);
+}
+
static struct device *new_dev(struct device *parent)
{
struct device *dev = S_ALLOC(sizeof(struct device));