From 2b0c38469a1a9a62b82d0a430cf1e980906adaa3 Mon Sep 17 00:00:00 2001
From: Armin Luntzer <armin.luntzer@univie.ac.at>
Date: Wed, 29 Mar 2017 17:45:21 +0200
Subject: [PATCH] data proc net: add pn_queue_critical_trackers()

---
 include/data_proc_net.h | 10 ++++++++++
 lib/data_proc_net.c     | 39 ++++++++++++++++++++++++++++++++++++++-
 2 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/include/data_proc_net.h b/include/data_proc_net.h
index 7b9314a..57d1267 100644
--- a/include/data_proc_net.h
+++ b/include/data_proc_net.h
@@ -31,6 +31,16 @@ struct proc_net;
 
 int pt_track_execute_next(struct proc_tracker *pt);
 void pn_input_task(struct proc_net *pn, struct proc_task *t);
+void pn_queue_critical_trackers(struct proc_net *pn);
+struct proc_tracker *pn_get_next_pending_tracker(struct proc_net *pn);
+struct proc_task *pn_get_next_pending_task(struct proc_tracker *pt);
+void pn_node_to_queue_head(struct proc_net *pn, struct proc_tracker *pt);
+void pn_node_to_queue_tail(struct proc_net *pn, struct proc_tracker *pt);
+
+
+int pn_eval_task_status(struct proc_net *pn, struct proc_tracker *pt,
+			struct proc_task *t, int ret);
+
 int pn_process_next(struct proc_net *pn);
 int pn_process_inputs(struct proc_net *pn);
 int pn_process_outputs(struct proc_net *pn);
diff --git a/lib/data_proc_net.c b/lib/data_proc_net.c
index 1754057..12bc752 100644
--- a/lib/data_proc_net.c
+++ b/lib/data_proc_net.c
@@ -170,6 +170,19 @@ static int pn_task_to_next_node(struct proc_net *pn, struct proc_task *t)
 }
 
 
+/**
+ * @brief move a tracker node to the top of the processing net queue
+ *
+ * @param pn a struct proc_net
+ * @param pt a struct proc_tracker
+ */
+
+void pn_node_to_queue_head(struct proc_net *pn, struct proc_tracker *pt)
+{
+	list_move(&pt->node, &pn->nodes);
+}
+
+
 /**
  * @brief move a tracker node to the end of the processing net queue
  *
@@ -183,6 +196,28 @@ void pn_node_to_queue_tail(struct proc_net *pn, struct proc_tracker *pt)
 }
 
 
+/**
+ * @brief move critical trackers to head of queue
+ *
+ * @param pn a struct proc_net
+ *
+ * @note this does not sort, but rather moves any critical trackers to the
+ * top op the queue
+ */
+
+void pn_queue_critical_trackers(struct proc_net *pn)
+{
+	struct proc_tracker *pt;
+	struct proc_tracker *p_tmp;
+
+
+	list_for_each_entry_safe(pt, p_tmp, &pn->nodes, node) {
+		if (pt_track_level_critical(pt))
+			pn_node_to_queue_head(pn, pt);
+	}
+}
+
+
 /**
  * @brief locate the first tracker that holds at least one task
  *
@@ -327,6 +362,9 @@ int pn_process_next(struct proc_net *pn)
 	struct proc_tracker *pt;
 
 
+	/* make sure critical trackers are on top */
+	pn_queue_critical_trackers(pn);
+
 	pt = pn_get_next_pending_tracker(pn);
 	if (!pt)
 		return cnt;
@@ -346,7 +384,6 @@ int pn_process_next(struct proc_net *pn)
 
 
 	/* move processing task to end of queue */
-	/* XXX should insert that based on critical level/fill state */
 	pn_node_to_queue_tail(pn, pt);
 
 	return cnt;
-- 
GitLab