diff --git a/include/data_proc_net.h b/include/data_proc_net.h index 7b9314a976331a6f2ba4ddfe42de8d289111996d..57d12675e29f227898006efca9bbcda5530f2c4b 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 1754057717880c788ea3e9cdbae12c13d8bdbff0..12bc752e799fe671c0730640e3465856614d39f9 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;