aboutsummaryrefslogtreecommitdiffstats
path: root/schedcat/locking/partition.py
blob: d6277e0e89870fc86a69c517f49f182554933a93 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from collections import defaultdict

from schedcat.model.tasks import TaskSystem

def find_connected_components(taskset):
    """Determine sets of tasks that do not share any resources."""
    by_res = defaultdict(set)
    by_task = {}
    for t in taskset:
        accessed = [res_id for res_id in t.resmodel
                    if t.resmodel[res_id].max_requests > 0]
        if accessed:
            res_id = accessed[0]
            by_res[res_id].add(t)
            # merge all others, if they are different
            for other in accessed[1:]:
                by_res[res_id].update(by_res[other])
                by_res[other] = by_res[res_id]
        else:
            # independent task -> singleton set
            by_task[t] = set([t])

    for c in by_res.values():
        for t in c:
            if t in by_task:
                break
            by_task[t] = c

    return by_task, by_res

def find_independent_tasksubsets(taskset):
    by_task, by_res = find_connected_components(taskset)
    done = set()
    subsets = []

    for t in by_task:
        if not t in done:
            subsets.append(TaskSystem(by_task[t]))
            done.update(by_task[t])

    return subsets