]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: task: add a new tasklet class for real-time: TL_RT flx04/master
authorWilly Tarreau <w@1wt.eu>
Thu, 25 Jun 2026 07:13:27 +0000 (09:13 +0200)
committerWilly Tarreau <w@1wt.eu>
Thu, 25 Jun 2026 08:54:07 +0000 (10:54 +0200)
This adds new class TL_RT, which is processed before other queues for
one (and only one) tasklet featuring the TASK_RT flag. This is meant to
process real time wakeups under load with even less latency. We only
process one entry to make sure it will not be abused for unimportant
stuff, and if tune.sched.low-latency is set, we also avoid picking more
tasks from the current run queues and looping after the first call to
run_tasks_from_list().

Measurements under a load of 10k concurrent conns injection at 10 Gbps
(~58k 20kB objects/s) on 4 threads and with task profiling enabled shows
that the average wakeup latency for wakeups every 10ms dropped from 220
microseconds to 1.8 microsecond, and even ~550 nanoseconds when
tune.sched.low-latency is set, or 400 times less.

The doc was updated, including the schematics.

doc/internals/api/scheduler.txt
doc/internals/sched.fig
doc/internals/sched.pdf
doc/internals/sched.png
doc/internals/sched.svg
include/haproxy/tinfo-t.h
src/task.c

index 2ff149bbedd327a9d4785e0d5a553b8d31119914..25680bf673a7d112f2df63552b4d15c6e1bdc72e 100644 (file)
@@ -272,17 +272,22 @@ application, both for tasks and tasklets:
                        sense to reset this flag from the ->process() function
                        itself.
 
-  - TASK_RT            when set, indicates that the task has real-time
-                       constraints (this is ignored for tasklets). Such a task
-                       will bypass the priority ordering of the run queue in
-                       order to guarantee a wakeup time as close as possible to
-                       the scheduled one even under load. Only one such task
-                       may be executed per round so this must be restricted to
-                       a few timing-critical tasks only (those for which a one
-                       millisecond skew is not acceptable). Such tasks are not
-                       meant to be woken up by other threads than the one they
-                       are supposed to run on, otherwise(their constraints may
-                       not be honored.
+  - TASK_RT            when set, indicates that the task or tasklet has strong
+                       real-time constraints. A task with this flag will bypass
+                       the priority ordering of the run queue in order to
+                       guarantee a wakeup time as close as possible to the
+                       scheduled one even under load. A task or tasklet with
+                       this flag will be executed in its own queue before all
+                       other queues are consulted. When tune.sched.low-latency
+                       is set, no new tasks will be dequeued from the priority
+                       queue if such a task is present in the run queue. Only
+                       one such task or tasklet may be executed per round so
+                       this must be restricted to a few timing-critical tasks
+                       only (those for which a one millisecond skew is not
+                       acceptable). Such tasks/tasklets are not meant to be
+                       woken up by other threads than the one they are supposed
+                       to run on, otherwise(their constraints may not be
+                       honored.
 
   - TASK_HEAVY         when set, indicates that this task does so heavy
                        processing that it will become mandatory to give back
index 4134420cb9a9eb8462550f0ad2ba7c3442e607da..9a470334c141cd4d7eca1745035eb9b154721be1 100644 (file)
@@ -1,4 +1,4 @@
-#FIG 3.2  Produced by xfig version 2.4
+#FIG 3.2  Produced by xfig version 3.2.8b
 Landscape
 Center
 Metric
@@ -287,18 +287,6 @@ Single
 0 309 #9ec3d7
 0 310 #ffff96
 0 311 #ff600a
-5 1 0 2 0 7 50 -1 -1 0.000 0 0 1 0 11301.000 3060.000 11205 3825 10530 3060 11205 2295
-       0 0 1.00 60.00 120.00
-5 1 0 2 0 7 50 -1 -1 0.000 0 1 0 1 11289.000 3060.000 11385 3825 12060 3060 11385 2295
-       0 0 1.00 60.00 120.00
-5 1 0 2 0 7 50 -1 -1 0.000 0 1 0 1 11293.750 3060.000 10890 3105 11700 3060 10890 3015
-       2 1 1.00 60.00 120.00
-5 1 0 2 0 7 50 -1 -1 0.000 0 0 1 0 7611.000 3060.000 7515 3825 6840 3060 7515 2295
-       0 0 1.00 60.00 120.00
-5 1 0 2 0 7 50 -1 -1 0.000 0 1 0 1 7599.000 3060.000 7695 3825 8370 3060 7695 2295
-       0 0 1.00 60.00 120.00
-5 1 0 2 0 7 50 -1 -1 0.000 0 1 0 1 7603.750 3060.000 7200 3105 8010 3060 7200 3015
-       2 1 1.00 60.00 120.00
 5 1 0 2 0 7 50 -1 -1 0.000 0 0 1 0 4956.000 3060.000 4860 3825 4185 3060 4860 2295
        0 0 1.00 60.00 120.00
 5 1 0 2 0 7 50 -1 -1 0.000 0 1 0 1 4944.000 3060.000 5040 3825 5715 3060 5040 2295
@@ -311,56 +299,6 @@ Single
        0 0 1.00 60.00 120.00
 5 1 0 2 0 7 50 -1 -1 0.000 0 1 0 1 1258.750 3060.000 855 3105 1665 3060 855 3015
        2 1 1.00 60.00 120.00
-6 10606 2371 11985 3749
-2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
-        11768 3060 11970 3060 11967 3119 11959 3177 11946 3234 11929 3291
-        11907 3345 11879 3397 11704 3296 11723 3259 11738 3222 11751 3182
-        11760 3142 11765 3101 11768 3060
-2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
-        11704 3296 11879 3397 11848 3447 11812 3494 11772 3537 11729 3577
-        11682 3613 11633 3644 11531 3469 11566 3447 11599 3422 11628 3393
-        11657 3364 11682 3331 11704 3296
-2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
-        11531 3469 11633 3644 11580 3672 11526 3694 11469 3711 11412 3724
-        11354 3732 11295 3734 11295 3532 11336 3530 11377 3525 11417 3516
-        11457 3503 11494 3488 11531 3469
-2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
-        11295 3532 11295 3734 11236 3732 11178 3724 11121 3711 11064 3694
-        11010 3672 10958 3644 11059 3469 11096 3488 11133 3503 11173 3516
-        11213 3525 11254 3530 11295 3532
-2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
-        11059 3469 10958 3644 10908 3613 10861 3577 10818 3537 10778 3494
-        10742 3447 10711 3398 10886 3296 10908 3331 10933 3364 10962 3393
-        10991 3422 11024 3447 11059 3469
-2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
-        10886 3296 10711 3398 10683 3345 10661 3291 10644 3234 10631 3177
-        10623 3119 10621 3060 10823 3060 10825 3101 10830 3142 10839 3182
-        10852 3222 10867 3259 10886 3296
-2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
-        10823 3060 10621 3060 10623 3001 10631 2943 10644 2886 10661 2829
-        10683 2775 10711 2723 10886 2824 10867 2861 10852 2898 10839 2938
-        10830 2978 10825 3019 10823 3060
-2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
-        10886 2824 10711 2723 10742 2673 10778 2626 10818 2583 10861 2543
-        10908 2507 10958 2476 11059 2651 11024 2673 10991 2698 10962 2727
-        10933 2756 10908 2789 10886 2824
-2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
-        11059 2651 10958 2476 11010 2448 11064 2426 11121 2409 11178 2396
-        11236 2388 11295 2386 11295 2588 11254 2590 11213 2595 11173 2604
-        11133 2617 11096 2632 11059 2651
-2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
-        11295 2588 11295 2386 11354 2388 11412 2396 11469 2409 11526 2426
-        11580 2448 11632 2476 11531 2651 11494 2632 11457 2617 11417 2604
-        11377 2595 11336 2590 11295 2588
-2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
-        11531 2651 11632 2476 11682 2507 11729 2543 11772 2583 11812 2626
-        11848 2673 11879 2723 11704 2824 11682 2789 11657 2756 11628 2727
-        11599 2698 11566 2673 11531 2651
-2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
-        11704 2824 11879 2723 11907 2775 11929 2829 11946 2886 11959 2943
-        11967 3001 11969 3060 11767 3060 11765 3019 11760 2978 11751 2938
-        11738 2898 11723 2861 11704 2824
--6
 6 4261 2371 5640 3749
 2 3 0 2 0 13 50 -1 20 0.000 0 0 -1 0 0 15
         5423 3060 5625 3060 5622 3119 5614 3177 5601 3234 5584 3291
@@ -415,56 +353,6 @@ Single
 1 1 0 3 8 11 52 -1 20 0.000 1 0.0000 3105 5049 810 171 3105 5049 3915 5049
 4 1 0 50 -1 6 10 0.0000 4 150 1125 3105 5130 Most Urgent\001
 -6
-6 6916 2371 8295 3749
-2 3 0 2 0 31 50 -1 43 0.000 0 0 -1 0 0 15
-        8078 3060 8280 3060 8277 3119 8269 3177 8256 3234 8239 3291
-        8217 3345 8189 3397 8014 3296 8033 3259 8048 3222 8061 3182
-        8070 3142 8075 3101 8078 3060
-2 3 0 2 0 31 50 -1 43 0.000 0 0 -1 0 0 15
-        8014 3296 8189 3397 8158 3447 8122 3494 8082 3537 8039 3577
-        7992 3613 7943 3644 7841 3469 7876 3447 7909 3422 7938 3393
-        7967 3364 7992 3331 8014 3296
-2 3 0 2 0 31 50 -1 43 0.000 0 0 -1 0 0 15
-        7841 3469 7943 3644 7890 3672 7836 3694 7779 3711 7722 3724
-        7664 3732 7605 3734 7605 3532 7646 3530 7687 3525 7727 3516
-        7767 3503 7804 3488 7841 3469
-2 3 0 2 0 31 50 -1 43 0.000 0 0 -1 0 0 15
-        7605 3532 7605 3734 7546 3732 7488 3724 7431 3711 7374 3694
-        7320 3672 7268 3644 7369 3469 7406 3488 7443 3503 7483 3516
-        7523 3525 7564 3530 7605 3532
-2 3 0 2 0 31 50 -1 43 0.000 0 0 -1 0 0 15
-        7369 3469 7268 3644 7218 3613 7171 3577 7128 3537 7088 3494
-        7052 3447 7021 3398 7196 3296 7218 3331 7243 3364 7272 3393
-        7301 3422 7334 3447 7369 3469
-2 3 0 2 0 31 50 -1 43 0.000 0 0 -1 0 0 15
-        7196 3296 7021 3398 6993 3345 6971 3291 6954 3234 6941 3177
-        6933 3119 6931 3060 7133 3060 7135 3101 7140 3142 7149 3182
-        7162 3222 7177 3259 7196 3296
-2 3 0 2 0 31 50 -1 43 0.000 0 0 -1 0 0 15
-        7133 3060 6931 3060 6933 3001 6941 2943 6954 2886 6971 2829
-        6993 2775 7021 2723 7196 2824 7177 2861 7162 2898 7149 2938
-        7140 2978 7135 3019 7133 3060
-2 3 0 2 0 31 50 -1 43 0.000 0 0 -1 0 0 15
-        7196 2824 7021 2723 7052 2673 7088 2626 7128 2583 7171 2543
-        7218 2507 7268 2476 7369 2651 7334 2673 7301 2698 7272 2727
-        7243 2756 7218 2789 7196 2824
-2 3 0 2 0 31 50 -1 43 0.000 0 0 -1 0 0 15
-        7369 2651 7268 2476 7320 2448 7374 2426 7431 2409 7488 2396
-        7546 2388 7605 2386 7605 2588 7564 2590 7523 2595 7483 2604
-        7443 2617 7406 2632 7369 2651
-2 3 0 2 0 31 50 -1 43 0.000 0 0 -1 0 0 15
-        7605 2588 7605 2386 7664 2388 7722 2396 7779 2409 7836 2426
-        7890 2448 7942 2476 7841 2651 7804 2632 7767 2617 7727 2604
-        7687 2595 7646 2590 7605 2588
-2 3 0 2 0 31 50 -1 43 0.000 0 0 -1 0 0 15
-        7841 2651 7942 2476 7992 2507 8039 2543 8082 2583 8122 2626
-        8158 2673 8189 2723 8014 2824 7992 2789 7967 2756 7938 2727
-        7909 2698 7876 2673 7841 2651
-2 3 0 2 0 31 50 -1 43 0.000 0 0 -1 0 0 15
-        8014 2824 8189 2723 8217 2775 8239 2829 8256 2886 8269 2943
-        8277 3001 8279 3060 8077 3060 8075 3019 8070 2978 8061 2938
-        8048 2898 8033 2861 8014 2824
--6
 6 571 2371 1950 3749
 2 3 0 2 0 13 50 -1 43 0.000 0 0 -1 0 0 15
         1733 3060 1935 3060 1932 3119 1924 3177 1911 3234 1894 3291
@@ -515,80 +403,139 @@ Single
         1932 3001 1934 3060 1732 3060 1730 3019 1725 2978 1716 2938
         1703 2898 1688 2861 1669 2824
 -6
-6 1800 1845 2520 2385
-4 1 0 50 -1 6 10 0.0000 4 120 570 2160 1980 Global\001
-4 1 0 50 -1 6 10 0.0000 4 120 495 2160 2160 tasks\001
-4 1 0 50 -1 6 10 0.0000 4 150 705 2160 2340 (locked)\001
--6
 6 3960 1935 4500 2250
 4 1 0 50 -1 6 10 0.0000 4 120 495 4230 2250 tasks\001
 4 1 0 50 -1 6 10 0.0000 4 120 465 4230 2070 Local\001
 -6
-6 8190 1845 8910 2385
-4 1 0 50 -1 6 10 0.0000 4 150 705 8550 2340 (locked)\001
-4 1 0 50 -1 6 10 0.0000 4 120 585 8550 2160 timers\001
-4 1 0 50 -1 6 10 0.0000 4 120 570 8550 1980 Global\001
--6
-6 10215 1935 10845 2250
-4 1 0 50 -1 6 10 0.0000 4 120 585 10530 2250 timers\001
-4 1 0 50 -1 6 10 0.0000 4 120 465 10530 2070 Local\001
--6
 6 2430 945 3735 1530
 1 1 0 3 20 29 52 -1 20 0.000 1 0.0000 3083 1180 607 170 3083 1180 3690 1350
 4 1 0 50 -1 6 10 0.0000 4 120 615 3105 1260 Local ?\001
 4 0 0 50 -1 6 9 0.0000 4 105 315 3375 1530 Yes\001
 4 2 0 50 -1 6 9 0.0000 4 105 225 2790 1530 No\001
 -6
-6 8775 945 10080 1530
-1 1 0 3 20 29 52 -1 20 0.000 1 0.0000 9428 1180 607 170 9428 1180 10035 1350
-4 1 0 50 -1 6 10 0.0000 4 120 615 9450 1260 Local ?\001
-4 0 0 50 -1 6 9 0.0000 4 105 315 9720 1530 Yes\001
-4 2 0 50 -1 6 9 0.0000 4 105 225 9135 1530 No\001
+6 8370 2070 10440 4005
+5 1 0 2 0 7 50 -1 -1 0.000 0 0 1 0 9456.000 3195.000 9360 3960 8685 3195 9360 2430
+       0 0 1.00 60.00 120.00
+5 1 0 2 0 7 50 -1 -1 0.000 0 1 0 1 9444.000 3195.000 9540 3960 10215 3195 9540 2430
+       0 0 1.00 60.00 120.00
+5 1 0 2 0 7 50 -1 -1 0.000 0 1 0 1 9448.750 3195.000 9045 3240 9855 3195 9045 3150
+       2 1 1.00 60.00 120.00
+6 8761 2506 10140 3884
+2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
+        9923 3195 10125 3195 10122 3254 10114 3312 10101 3369 10084 3426
+        10062 3480 10034 3532 9859 3431 9878 3394 9893 3357 9906 3317
+        9915 3277 9920 3236 9923 3195
+2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
+        9859 3431 10034 3532 10003 3582 9967 3629 9927 3672 9884 3712
+        9837 3748 9788 3779 9686 3604 9721 3582 9754 3557 9783 3528
+        9812 3499 9837 3466 9859 3431
+2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
+        9686 3604 9788 3779 9735 3807 9681 3829 9624 3846 9567 3859
+        9509 3867 9450 3869 9450 3667 9491 3665 9532 3660 9572 3651
+        9612 3638 9649 3623 9686 3604
+2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
+        9450 3667 9450 3869 9391 3867 9333 3859 9276 3846 9219 3829
+        9165 3807 9113 3779 9214 3604 9251 3623 9288 3638 9328 3651
+        9368 3660 9409 3665 9450 3667
+2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
+        9214 3604 9113 3779 9063 3748 9016 3712 8973 3672 8933 3629
+        8897 3582 8866 3533 9041 3431 9063 3466 9088 3499 9117 3528
+        9146 3557 9179 3582 9214 3604
+2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
+        9041 3431 8866 3533 8838 3480 8816 3426 8799 3369 8786 3312
+        8778 3254 8776 3195 8978 3195 8980 3236 8985 3277 8994 3317
+        9007 3357 9022 3394 9041 3431
+2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
+        8978 3195 8776 3195 8778 3136 8786 3078 8799 3021 8816 2964
+        8838 2910 8866 2858 9041 2959 9022 2996 9007 3033 8994 3073
+        8985 3113 8980 3154 8978 3195
+2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
+        9041 2959 8866 2858 8897 2808 8933 2761 8973 2718 9016 2678
+        9063 2642 9113 2611 9214 2786 9179 2808 9146 2833 9117 2862
+        9088 2891 9063 2924 9041 2959
+2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
+        9214 2786 9113 2611 9165 2583 9219 2561 9276 2544 9333 2531
+        9391 2523 9450 2521 9450 2723 9409 2725 9368 2730 9328 2739
+        9288 2752 9251 2767 9214 2786
+2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
+        9450 2723 9450 2521 9509 2523 9567 2531 9624 2544 9681 2561
+        9735 2583 9787 2611 9686 2786 9649 2767 9612 2752 9572 2739
+        9532 2730 9491 2725 9450 2723
+2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
+        9686 2786 9787 2611 9837 2642 9884 2678 9927 2718 9967 2761
+        10003 2808 10034 2858 9859 2959 9837 2924 9812 2891 9783 2862
+        9754 2833 9721 2808 9686 2786
+2 3 0 2 0 31 50 -1 20 0.000 0 0 -1 0 0 15
+        9859 2959 10034 2858 10062 2910 10084 2964 10101 3021 10114 3078
+        10122 3136 10124 3195 9922 3195 9920 3154 9915 3113 9906 3073
+        9893 3033 9878 2996 9859 2959
+-6
+6 8370 2070 9000 2385
+4 1 0 50 -1 6 10 0.0000 4 120 585 8685 2385 timers\001
+4 1 0 50 -1 6 10 0.0000 4 120 465 8685 2205 Local\001
+-6
+4 1 0 50 -1 4 9 1.5708 4 150 315 10395 3195 past\001
+4 1 0 50 -1 4 9 1.5708 4 120 420 8595 3195 future\001
 -6
-6 7200 6345 9810 6885
+6 6840 3915 8460 4590
+4 0 0 50 -1 6 12 0.0000 4 165 1320 6840 4095 Time-based\001
+4 0 0 50 -1 6 12 0.0000 4 195 1605 6840 4545 - 1 per thread\001
+4 0 0 50 -1 6 12 0.0000 4 195 1395 6840 4320 Wait queues\001
+-6
+6 6885 7200 9495 7740
 2 1 0 4 279 -1 48 -1 -1 0.000 0 0 -1 0 0 4
-        7234 6398 9776 6398 9776 6838 7234 6838
+        6919 7253 9461 7253 9461 7693 6919 7693
 2 3 0 0 -1 278 49 -1 20 0.000 0 0 -1 0 0 5
-        7234 6838 9776 6838 9776 6398 7234 6398 7234 6838
+        6919 7693 9461 7693 9461 7253 6919 7253 6919 7693
 2 1 0 2 279 -1 47 -1 -1 0.000 0 0 -1 0 0 2
-        9613 6398 9613 6838
+        9298 7253 9298 7693
 2 1 0 2 279 -1 47 -1 -1 0.000 0 0 -1 0 0 2
-        9438 6398 9438 6838
+        9123 7253 9123 7693
 2 1 0 2 279 -1 47 -1 -1 0.000 0 0 -1 0 0 2
-        9264 6398 9264 6838
-4 1 0 46 -1 4 16 0.0000 4 210 1620 8460 6705 TL_URGENT\001
+        8949 7253 8949 7693
+4 1 0 46 -1 4 16 0.0000 4 240 1425 8145 7560 TL_URGENT\001
+-6
+6 3825 8685 4230 9900
+1 1 0 3 20 29 52 -1 20 0.000 1 1.5708 4015 9292 607 170 4015 9292 4185 8685
+4 1 0 50 -1 6 10 1.5708 4 120 585 4095 9270 Class?\001
 -6
-6 4140 7830 4545 9045
-1 1 0 3 20 29 52 -1 20 0.000 1 1.5708 4330 8437 607 170 4330 8437 4500 7830
-4 1 0 50 -1 6 10 1.5708 4 120 585 4410 8415 Class?\001
+6 6885 6435 9495 6975
+2 1 0 4 279 -1 48 -1 -1 0.000 0 0 -1 0 0 4
+        6919 6488 9461 6488 9461 6928 6919 6928
+2 3 0 0 -1 278 49 -1 20 0.000 0 0 -1 0 0 5
+        6919 6928 9461 6928 9461 6488 6919 6488 6919 6928
+2 1 0 2 279 -1 47 -1 -1 0.000 0 0 -1 0 0 2
+        9298 6488 9298 6928
+2 1 0 2 279 -1 47 -1 -1 0.000 0 0 -1 0 0 2
+        9123 6488 9123 6928
+2 1 0 2 279 -1 47 -1 -1 0.000 0 0 -1 0 0 2
+        8949 6488 8949 6928
+4 1 0 46 -1 4 16 0.0000 4 240 660 8145 6795 TL_RT\001
+-6
+6 3420 6975 5760 7740
+2 1 0 4 45 -1 48 -1 -1 0.000 0 0 -1 0 0 4
+        3671 7253 5599 7253 5599 7693 3671 7693
+2 1 0 2 45 -1 47 -1 -1 0.000 0 0 -1 0 0 2
+        5428 7253 5428 7693
+2 1 0 2 45 -1 47 -1 -1 0.000 0 0 -1 0 0 2
+        5253 7253 5253 7693
+2 1 0 2 45 -1 47 -1 -1 0.000 0 0 -1 0 0 2
+        5079 7253 5079 7693
+2 3 0 0 277 276 49 -1 43 0.000 0 0 -1 0 0 5
+        3671 7693 5599 7693 5599 7253 3671 7253 3671 7693
+4 1 0 46 -1 4 16 0.0000 4 210 1020 4455 7560 SHARED\001
+4 1 0 50 -1 4 10 0.0000 4 165 2280 4590 7110 (accessed using atomic ops)\001
 -6
 1 1 0 3 8 11 52 -1 20 0.000 1 0.0000 9450 5049 540 171 9450 5049 9990 5049
-1 1 0 3 20 29 52 -1 20 0.000 1 1.5708 2440 7672 607 170 2440 7672 2610 7065
-1 1 0 3 8 11 52 -1 20 0.000 1 1.5708 10755 7695 810 171 10755 7695 10755 6885
-2 1 0 3 0 7 50 -1 -1 0.000 1 0 -1 1 0 4
-       2 1 1.00 90.00 180.00
-        7605 3870 7605 4185 9270 4545 9270 4905
-2 1 0 3 0 7 50 -1 -1 0.000 1 0 -1 1 0 4
-       2 1 1.00 90.00 180.00
-        11301 3870 11301 4185 9636 4545 9636 4905
-2 1 0 3 0 7 50 -1 -1 0.000 1 0 -1 1 0 4
-       2 1 1.00 90.00 180.00
-        9630 1395 9626 1591 11291 1800 11295 2295
-2 1 0 3 0 7 50 -1 -1 0.000 1 0 -1 1 0 4
-       2 1 1.00 90.00 180.00
-        9270 1395 9270 1575 7605 1800 7605 2295
-2 1 0 3 0 7 50 -1 -1 0.000 1 0 -1 1 0 2
-       2 1 1.00 90.00 180.00
-        9450 360 9450 1035
+1 1 0 3 20 29 52 -1 20 0.000 1 0.0000 3083 415 607 170 3083 415 3690 585
+1 1 0 3 20 29 52 -1 20 0.000 1 1.5708 2125 8527 607 170 2125 8527 2295 7920
+1 1 0 3 8 11 52 -1 20 0.000 1 1.5708 10441 8209 810 171 10441 8209 10441 7399
 2 1 0 3 0 7 50 -1 -1 0.000 1 0 -1 1 0 4
        2 1 1.00 90.00 180.00
         1260 3870 1260 4185 2925 4545 2925 4905
 2 1 0 3 0 7 50 -1 -1 0.000 1 0 -1 1 0 4
        2 1 1.00 90.00 180.00
         4956 3870 4956 4185 3291 4545 3291 4905
-2 1 0 3 0 7 50 -1 -1 0.000 1 0 -1 1 0 2
-       2 1 1.00 90.00 180.00
-        3105 360 3105 1035
 2 1 0 3 0 7 50 -1 -1 0.000 1 0 -1 1 0 4
        2 1 1.00 90.00 180.00
         3285 1395 3285 1575 4950 1845 4950 2385
@@ -596,153 +543,164 @@ Single
         9180 5535 9000 5805
 2 1 0 5 13 7 54 -1 -1 0.000 1 0 -1 1 0 4
        2 1 1.00 120.00 240.00
-        3105 5220 3105 5850 3105 7200 7200 7200
+        3105 5220 3105 5850 3105 8055 6885 8055
 2 1 0 5 22 7 54 -1 -1 0.000 1 0 -1 1 0 5
        2 1 1.00 120.00 240.00
-        9450 5220 9450 5670 6300 5670 6300 1215 3690 1170
+        9450 5220 9450 5670 6300 5670 6300 405 3690 405
 2 1 0 3 13 7 54 -1 -1 0.000 1 0 -1 0 0 2
         3195 5535 3015 5805
 2 1 0 3 0 7 50 -1 -1 0.000 1 0 -1 1 0 4
        2 1 1.00 90.00 180.00
         2925 1395 2925 1575 1260 1845 1260 2385
-2 2 0 3 35 34 100 -1 20 0.000 1 0 -1 0 0 5
-        6570 720 12330 720 12330 5400 6570 5400 6570 720
+2 1 0 3 0 7 50 -1 -1 0.000 1 0 -1 1 0 2
+       2 1 1.00 90.00 180.00
+        9456 4005 9450 4860
+2 1 0 3 0 7 50 -1 -1 0.000 1 0 -1 1 0 2
+       2 1 1.00 90.00 180.00
+        9450 -405 9450 2430
+2 1 0 3 0 7 50 -1 -1 0.000 1 0 -1 1 0 2
+       2 1 1.00 90.00 180.00
+        3105 630 3105 1035
+2 1 0 3 0 7 50 -1 -1 0.000 1 0 -1 1 0 2
+       2 1 1.00 90.00 180.00
+        3105 -405 3105 270
 2 2 0 3 33 32 100 -1 20 0.000 1 0 -1 0 0 5
-        270 720 6030 720 6030 5400 270 5400 270 720
+        0 90 6030 90 6030 5400 0 5400 0 90
 2 1 0 3 0 7 50 -1 -1 0.000 1 0 -1 1 0 2
        2 1 1.00 90.00 180.00
-        315 7650 2250 7650
-2 1 0 5 4 7 54 -1 -1 0.000 1 0 -1 1 0 2
-       2 1 1.00 120.00 240.00
-        10890 7695 12285 7695
+        0 8505 1935 8505
 2 1 0 3 0 7 54 -1 -1 0.000 1 0 -1 1 0 3
        2 1 1.00 90.00 180.00
-        4455 8775 4725 8910 7200 8910
+        4140 9630 4410 9765 6885 9765
 2 1 0 4 279 -1 48 -1 -1 0.000 0 0 -1 0 0 4
-        7234 7118 9776 7118 9776 7558 7234 7558
+        6919 7973 9461 7973 9461 8413 6919 8413
 2 3 0 0 -1 278 49 -1 20 0.000 0 0 -1 0 0 5
-        7234 7558 9776 7558 9776 7118 7234 7118 7234 7558
+        6919 8413 9461 8413 9461 7973 6919 7973 6919 8413
 2 1 0 2 279 -1 47 -1 -1 0.000 0 0 -1 0 0 2
-        9613 7118 9613 7558
+        9298 7973 9298 8413
 2 1 0 2 279 -1 47 -1 -1 0.000 0 0 -1 0 0 2
-        9438 7118 9438 7558
+        9123 7973 9123 8413
 2 1 0 2 279 -1 47 -1 -1 0.000 0 0 -1 0 0 2
-        9264 7118 9264 7558
+        8949 7973 8949 8413
 2 3 0 0 -1 278 49 -1 20 0.000 0 0 -1 0 0 5
-        7234 8278 9776 8278 9776 7838 7234 7838 7234 8278
+        6919 9133 9461 9133 9461 8693 6919 8693 6919 9133
 2 1 0 2 279 -1 47 -1 -1 0.000 0 0 -1 0 0 2
-        9613 7838 9613 8278
+        9298 8693 9298 9133
 2 1 0 2 279 -1 47 -1 -1 0.000 0 0 -1 0 0 2
-        9438 7838 9438 8278
+        9123 8693 9123 9133
 2 1 0 2 279 -1 47 -1 -1 0.000 0 0 -1 0 0 2
-        9264 7838 9264 8278
+        8949 8693 8949 9133
 2 1 0 4 279 -1 48 -1 -1 0.000 0 0 -1 0 0 4
-        7234 8558 9776 8558 9776 8998 7234 8998
+        6919 9413 9461 9413 9461 9853 6919 9853
 2 3 0 0 -1 278 49 -1 20 0.000 0 0 -1 0 0 5
-        7234 8998 9776 8998 9776 8558 7234 8558 7234 8998
+        6919 9853 9461 9853 9461 9413 6919 9413 6919 9853
 2 1 0 2 279 -1 47 -1 -1 0.000 0 0 -1 0 0 2
-        9613 8558 9613 8998
+        9298 9413 9298 9853
 2 1 0 2 279 -1 47 -1 -1 0.000 0 0 -1 0 0 2
-        9438 8558 9438 8998
+        9123 9413 9123 9853
 2 1 0 2 279 -1 47 -1 -1 0.000 0 0 -1 0 0 2
-        9264 8558 9264 8998
-2 1 0 3 0 7 50 -1 -1 0.000 1 0 -1 1 0 2
-       2 1 1.00 90.00 180.00
-        6075 6480 7200 6480
+        8949 9413 8949 9853
 2 1 0 3 0 7 50 -1 -1 0.000 1 0 -1 1 0 3
        2 1 1.00 90.00 180.00
-        2610 7830 3195 8415 4140 8415
-2 1 0 4 45 -1 48 -1 -1 0.000 0 0 -1 0 0 4
-        4166 6398 6094 6398 6094 6838 4166 6838
-2 1 0 2 45 -1 47 -1 -1 0.000 0 0 -1 0 0 2
-        5923 6398 5923 6838
-2 1 0 2 45 -1 47 -1 -1 0.000 0 0 -1 0 0 2
-        5748 6398 5748 6838
-2 1 0 2 45 -1 47 -1 -1 0.000 0 0 -1 0 0 2
-        5574 6398 5574 6838
-2 1 0 3 0 7 54 -1 -1 0.000 1 0 -1 1 0 4
-       2 1 1.00 90.00 180.00
-        2610 7515 2925 6660 3645 6660 4140 6660
-2 3 0 0 277 276 49 -1 43 0.000 0 0 -1 0 0 5
-        4166 6838 6094 6838 6094 6398 4166 6398 4166 6838
-2 1 0 3 0 7 54 -1 -1 0.000 1 0 -1 1 0 3
-       2 1 1.00 90.00 180.00
-        9765 8775 10350 8775 10665 8280
+        2295 8685 2880 9270 3825 9270
 2 1 0 3 0 7 54 -1 -1 0.000 1 0 -1 1 0 3
        2 1 1.00 90.00 180.00
-        9765 8055 10305 8055 10620 7875
+        9450 9630 10035 9630 10350 8820
 2 1 0 3 0 7 54 -1 -1 0.000 1 0 -1 1 0 3
        2 1 1.00 90.00 180.00
-        9806 6605 10350 6615 10665 7155
+        9450 8910 10035 8910 10305 8550
 2 1 0 3 0 7 54 -1 -1 0.000 1 0 -1 1 0 3
        2 1 1.00 90.00 180.00
-        9720 7335 10350 7335 10620 7560
+        9405 8190 9945 8190 10305 8190
 2 1 1 5 4 7 57 -1 -1 12.000 1 0 -1 1 0 2
        2 1 1.00 120.00 240.00
-        9900 6165 9900 9450
+        9585 6390 9585 10305
 2 1 0 2 0 7 54 -1 -1 0.000 1 0 -1 0 0 2
-        10080 7245 9990 7425
+        9765 8100 9675 8280
 2 1 0 2 0 7 54 -1 -1 0.000 1 0 -1 0 0 2
-        10080 7965 9990 8145
+        9765 8820 9675 9000
 2 1 0 2 0 7 54 -1 -1 0.000 1 0 -1 0 0 2
-        10080 8685 9990 8865
+        9765 9540 9675 9720
 2 1 0 3 0 7 54 -1 -1 0.000 1 0 -1 1 0 4
        2 1 1.00 90.00 180.00
-        4500 8550 6255 8550 6705 8190 7200 8190
+        4185 9495 6120 9495 6480 9045 6885 9045
 2 1 0 3 0 7 54 -1 -1 0.000 1 0 -1 1 0 5
        2 1 1.00 90.00 180.00
-        4500 8280 4725 8100 6435 8100 6750 7470 7200 7470
+        4185 9225 4455 9135 6165 9135 6435 8325 6885 8325
+2 1 0 4 279 -1 48 -1 -1 0.000 0 0 -1 0 0 4
+        6919 8693 9461 8693 9461 9133 6919 9133
+2 1 0 2 0 7 54 -1 -1 0.000 1 0 -1 0 0 2
+        9765 7380 9675 7560
+2 1 0 3 0 7 50 -1 -1 0.000 1 0 -1 1 0 2
+       2 1 1.00 90.00 180.00
+        5580 7335 6885 7335
+2 1 0 3 0 7 54 -1 -1 0.000 1 0 -1 1 0 3
+       2 1 1.00 90.00 180.00
+        9491 7460 10080 7470 10305 7830
 2 1 0 3 0 7 54 -1 -1 0.000 1 0 -1 1 0 5
        2 1 1.00 90.00 180.00
-        4455 8055 4635 7740 6390 7740 6750 6750 7200 6750
-2 1 0 4 279 -1 48 -1 -1 0.000 0 0 -1 0 0 4
-        7234 7838 9776 7838 9776 8278 7234 8278
+        4140 9045 4410 8820 6075 8820 6435 7605 6885 7605
+2 1 0 3 0 7 54 -1 -1 0.000 1 0 -1 1 0 3
+       2 1 1.00 90.00 180.00
+        9491 6695 10125 6705 10350 7515
 2 1 0 2 0 7 54 -1 -1 0.000 1 0 -1 0 0 2
-        10080 6525 9990 6705
+        9765 6615 9675 6795
+2 1 0 3 0 7 54 -1 -1 0.000 1 0 -1 1 0 5
+       2 1 1.00 90.00 180.00
+        4140 8820 4410 8460 5895 8460 6435 6705 6885 6705
 2 2 0 3 43 47 100 -1 20 0.000 1 0 -1 0 0 5
-        1935 5985 11070 5985 11070 9585 1935 9585 1935 5985
-4 1 0 50 -1 4 9 1.5708 4 135 315 12240 3060 past\001
-4 1 0 50 -1 4 9 1.5708 4 120 465 10440 3060 future\001
-4 1 0 50 -1 4 9 1.5708 4 135 315 8550 3060 past\001
-4 1 0 50 -1 4 9 1.5708 4 120 465 6750 3060 future\001
+        1620 6120 10755 6120 10755 10485 1620 10485 1620 6120
+2 1 0 3 0 7 54 -1 -1 0.000 1 0 -1 1 0 4
+       2 1 1.00 90.00 180.00
+        2295 8370 2610 7515 3330 7515 3645 7515
+2 1 0 3 0 7 50 -1 -1 0.000 1 0 -1 1 0 4
+       2 1 1.00 90.00 180.00
+        2790 585 135 1350 135 6795 1980 8235
+2 2 0 3 35 34 100 -1 20 0.000 1 0 -1 0 0 5
+        6570 90 11700 90 11700 5400 6570 5400 6570 90
+2 1 0 5 4 7 54 -1 -1 0.000 1 0 -1 1 0 2
+       2 1 1.00 120.00 240.00
+        10575 8235 11970 8235
 4 1 0 50 -1 6 10 0.0000 4 120 600 9450 5130 Oldest\001
-4 1 0 50 -1 4 9 1.5708 4 105 540 405 3060 newest\001
+4 1 0 50 -1 4 9 1.5708 4 120 525 405 3060 newest\001
 4 1 0 50 -1 4 9 1.5708 4 120 450 2205 3060 oldest\001
-4 1 0 50 -1 4 9 1.5708 4 105 540 4095 3060 newest\001
+4 1 0 50 -1 4 9 1.5708 4 120 525 4095 3060 newest\001
 4 1 0 50 -1 4 9 1.5708 4 120 450 5895 3060 oldest\001
-4 0 0 50 -1 14 10 0.0000 4 135 1470 9135 5850 runqueue-depth\001
-4 0 0 50 -1 14 10 0.0000 4 135 1470 3195 5715 runqueue-depth\001
-4 1 0 50 -1 6 12 0.0000 4 165 1320 9450 3600 Time-based\001
-4 1 0 50 -1 6 12 0.0000 4 195 1395 9450 3780 Wait queues\001
-4 0 0 50 -1 6 12 0.0000 4 195 1050 9000 4005 - 1 global\001
-4 0 0 50 -1 6 12 0.0000 4 195 1605 9000 4185 - 1 per thread\001
+4 0 0 50 -1 14 10 0.0000 4 135 1680 9135 5850 runqueue-depth\001
+4 0 0 50 -1 14 10 0.0000 4 135 1680 3195 5715 runqueue-depth\001
 4 1 0 50 -1 6 12 0.0000 4 195 1650 3105 3600 Priority-based\001
 4 1 0 50 -1 6 12 0.0000 4 180 1365 3105 3780 Run queues\001
-4 0 0 50 -1 6 12 0.0000 4 195 1050 2655 4005 - 1 global\001
 4 0 0 50 -1 6 12 0.0000 4 195 1605 2655 4185 - 1 per thread\001
-4 0 0 50 -1 14 10 0.0000 4 135 1365 3240 585 task_wakeup()\001
-4 0 0 50 -1 14 10 0.0000 4 135 1575 9585 630 task_schedule()\001
-4 0 0 50 -1 14 10 0.0000 4 135 1260 9585 450 task_queue()\001
-4 0 0 50 -1 14 10 0.0000 4 135 1680 315 7560 tasklet_wakeup()\001
-4 2 0 50 -1 14 10 0.0000 4 135 1260 12285 7515 t->process()\001
-4 2 4 50 -1 6 12 0.0000 4 150 525 12285 7335 Run!\001
-4 1 0 46 -1 4 16 0.0000 4 210 1695 8460 7425 TL_NORMAL\001
-4 1 0 46 -1 4 16 0.0000 4 210 1200 8460 8145 TL_BULK\001
-4 1 0 46 -1 4 16 0.0000 4 210 1425 8460 8865 TL_HEAVY\001
-4 1 0 46 -1 4 16 0.0000 4 195 1095 4950 6705 SHARED\001
-4 0 0 50 -1 6 9 0.0000 4 105 345 10035 7515 37%\001
-4 0 0 50 -1 6 9 0.0000 4 105 210 10080 8955 =1\001
-4 1 0 50 -1 4 10 0.0000 4 150 2280 5085 6255 (accessed using atomic ops)\001
-4 0 0 50 -1 6 9 0.0000 4 105 345 10035 6795 50%\001
-4 0 0 50 -1 6 9 0.0000 4 105 345 10035 8235 13%\001
-4 2 0 50 -1 6 9 1.5708 4 105 315 2745 8100 Yes\001
-4 1 0 50 -1 6 10 1.5708 4 120 615 2520 7650 Local ?\001
-4 0 0 50 -1 6 9 1.5708 4 105 225 2700 7110 No\001
-4 0 0 50 -1 14 10 0.0000 4 135 1680 4725 8460 TASK_SELF_WAKING\001
-4 0 0 50 -1 14 10 0.0000 4 135 1050 4725 8820 TASK_HEAVY\001
-4 0 0 50 -1 4 10 0.0000 4 165 675 4725 8010 (default)\001
-4 0 0 50 -1 4 10 0.0000 4 150 1290 4725 7650 In I/O or signals\001
-4 1 0 50 -1 6 10 1.5708 4 150 1125 10815 7695 Most Urgent\001
-4 0 4 50 -1 6 10 0.0000 4 120 480 9990 6480 order\001
-4 0 4 50 -1 6 10 0.0000 4 120 420 9990 6300 Scan\001
-4 1 0 50 -1 6 12 0.0000 4 195 9075 6030 9450 5 class-based tasklet queues per thread (one accessible from remote threads)\001
+4 1 0 50 -1 6 10 0.0000 4 135 945 3105 495 TASK_RT ?\001
+4 0 0 50 -1 6 9 0.0000 4 105 225 3195 765 No\001
+4 2 0 50 -1 6 9 0.0000 4 105 315 2430 585 Yes\001
+4 0 0 50 -1 14 10 0.0000 4 135 1920 0 8415 tasklet_wakeup()\001
+4 1 0 46 -1 4 16 0.0000 4 240 1545 8145 8280 TL_NORMAL\001
+4 1 0 46 -1 4 16 0.0000 4 240 990 8145 9000 TL_BULK\001
+4 1 0 46 -1 4 16 0.0000 4 240 1260 8145 9720 TL_HEAVY\001
+4 0 0 50 -1 6 9 0.0000 4 105 345 9720 8370 37%\001
+4 0 0 50 -1 6 9 0.0000 4 105 210 9765 9810 =1\001
+4 0 0 50 -1 6 9 0.0000 4 105 345 9720 7650 50%\001
+4 0 0 50 -1 6 9 0.0000 4 105 345 9720 9090 13%\001
+4 2 0 50 -1 6 9 1.5708 4 105 315 2430 8955 Yes\001
+4 1 0 50 -1 6 10 1.5708 4 120 615 2205 8505 Local ?\001
+4 0 0 50 -1 6 9 1.5708 4 105 225 2385 7965 No\001
+4 0 0 50 -1 14 10 0.0000 4 135 1200 4410 9675 TASK_HEAVY\001
+4 1 0 50 -1 6 12 0.0000 4 195 9075 5715 10305 5 class-based tasklet queues per thread (one accessible from remote threads)\001
+4 0 4 50 -1 6 10 0.0000 4 120 420 9675 6345 Scan\001
+4 0 4 50 -1 6 10 0.0000 4 120 480 9675 6525 order\001
+4 0 0 50 -1 6 9 0.0000 4 105 210 9765 6885 =1\001
+4 0 0 50 -1 14 10 0.0000 4 135 1920 4275 9405 TASK_SELF_WAKING\001
+4 0 0 50 -1 4 10 0.0000 4 165 1185 4455 8730 In I/O or signals\001
+4 0 0 50 -1 14 10 0.0000 4 135 840 4455 8370 TASK_RT\001
+4 0 0 50 -1 4 10 0.0000 4 150 705 4455 9045 (default)\001
+4 0 0 50 -1 14 10 0.0000 4 135 1800 9585 -45 task_schedule()\001
+4 0 0 50 -1 14 10 0.0000 4 135 1560 3240 -45 task_wakeup()\001
+4 0 0 50 -1 14 10 0.0000 4 135 1440 9585 -225 task_queue()\001
+4 2 0 50 -1 14 10 0.0000 4 135 1440 11970 8055 t->process()\001
+4 2 4 50 -1 6 12 0.0000 4 150 525 11970 7875 Run!\001
+4 1 0 50 -1 6 10 1.5708 4 150 1125 10500 8235 Most Urgent\001
+4 1 0 50 -1 6 10 0.0000 4 120 495 2160 2160 tasks\001
+4 1 0 50 -1 6 10 0.0000 4 150 705 2160 2340 (locked)\001
+4 1 0 50 -1 6 10 0.0000 4 120 630 2160 1980 Shared\001
+4 0 0 50 -1 6 12 0.0000 4 180 1335 2655 4005 - 1 per tgrp\001
index d1ce3ded745e12ae858b3c0eef5bf7cd3d88db29..3ede60f78da88d2293e3a91f50d93662af172b80 100644 (file)
Binary files a/doc/internals/sched.pdf and b/doc/internals/sched.pdf differ
index 65c97a1e3404c3ea17930ea6c9c2220073721ee5..f17edb708e6fe97d095bbd4255a1283121c8f338 100644 (file)
Binary files a/doc/internals/sched.png and b/doc/internals/sched.png differ
index 0fa329a713bf940a2f12a97074e3d5c02c990437..0e4adbe06a1b19e8c10503c74176c634cc89202f 100644 (file)
@@ -1,32 +1,32 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Creator: fig2dev Version 3.2.7b -->
-<!-- CreationDate: 2021-02-26 17:49:00 -->
+<!-- Creator: fig2dev Version 3.2.8b -->
+<!-- CreationDate: 2026-06-25 10:39:08 -->
 <!-- Magnification: 1.57 -->
 <svg   xmlns="http://www.w3.org/2000/svg"
        xmlns:xlink="http://www.w3.org/1999/xlink"
-       width="1146pt" height="878pt"
-       viewBox="237 327 12126 9291">
+       width="1140pt" height="1036pt"
+       viewBox="-33 -438 12057 10956">
 <g fill="none">
 <!-- Line -->
-<rect x="6570" y="720" width="5760" height="4680" fill="#ffebac"
-       stroke="#cbb366" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Line -->
-<rect x="270" y="720" width="5760" height="4680" fill="#c5ebe1"
+<rect x="0" y="90" width="6030" height="5310" fill="#c5ebe1"
        stroke="#86c8a2" stroke-width="30px" stroke-linejoin="round"/>
 <!-- Line -->
-<rect x="1935" y="5985" width="9135" height="3600" fill="#dfe3df"
+<rect x="1620" y="6120" width="9135" height="4365" fill="#dfe3df"
        stroke="#868286" stroke-width="30px" stroke-linejoin="round"/>
 <!-- Line -->
+<rect x="6570" y="90" width="5130" height="5310" fill="#ffebac"
+       stroke="#cbb366" stroke-width="30px" stroke-linejoin="round"/>
+<!-- Line -->
 <defs>
 <clipPath id="cp0">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 9960,9130 9900,9190 9840,9130 9867,9483 9933,9483z"/>
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 9645,9985 9585,10045 9525,9985 9552,10338 9618,10338z"/>
 </clipPath>
 </defs>
-<polyline points=" 9900,6165 9900,9450" clip-path="url(#cp0)"
+<polyline points=" 9585,6390 9585,10305" clip-path="url(#cp0)"
        stroke="#ff0000" stroke-width="60px" stroke-linejoin="round" stroke-dasharray="120 120"/>
-<!-- Forward arrow to point 9900,9450 -->
-<polygon points=" 9840,9130 9900,9430 9960,9130 9900,9190 9840,9130"
+<!-- Forward arrow to point 9585,10305 -->
+<polygon points=" 9525,9985 9585,10285 9645,9985 9585,10045 9525,9985"
        stroke="#ff0000" stroke-width="8px" stroke-miterlimit="8" fill="#ff0000"/>
 <!-- Line -->
 <polyline points=" 9180,5535 9000,5805"
 <!-- Line -->
 <defs>
 <clipPath id="cp1">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 6880,7140 6940,7200 6880,7260 7233,7233 7233,7167z"/>
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 6565,7995 6625,8055 6565,8115 6918,8088 6918,8022z"/>
 </clipPath>
 </defs>
-<polyline points=" 3105,5220 3105,5850 3105,7200 7200,7200" clip-path="url(#cp1)"
+<polyline points=" 3105,5220 3105,5850 3105,8055 6885,8055" clip-path="url(#cp1)"
        stroke="#00b000" stroke-width="60px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 7200,7200 -->
-<polygon points=" 6880,7260 7180,7200 6880,7140 6940,7200 6880,7260"
+<!-- Forward arrow to point 6885,8055 -->
+<polygon points=" 6565,8115 6865,8055 6565,7995 6625,8055 6565,8115"
        stroke="#00b000" stroke-width="8px" stroke-miterlimit="8" fill="#00b000"/>
 <!-- Line -->
 <defs>
 <clipPath id="cp2">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 4009,1236 3950,1174 4011,1116 3658,1136 3656,1202z"/>
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 4010,465 3950,405 4010,345 3657,372 3657,438z"/>
 </clipPath>
 </defs>
-<polyline points=" 9450,5220 9450,5670 6300,5670 6300,1215 3690,1170" clip-path="url(#cp2)"
+<polyline points=" 9450,5220 9450,5670 6300,5670 6300,405 3690,405" clip-path="url(#cp2)"
        stroke="#b000b0" stroke-width="60px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 3690,1170 -->
-<polygon points=" 4011,1116 3710,1170 4009,1236 3950,1174 4011,1116"
+<!-- Forward arrow to point 3690,405 -->
+<polygon points=" 4010,345 3710,405 4010,465 3950,405 4010,345"
        stroke="#b000b0" stroke-width="8px" stroke-miterlimit="8" fill="#b000b0"/>
 <!-- Line -->
 <polyline points=" 3195,5535 3015,5805"
 <!-- Line -->
 <defs>
 <clipPath id="cp3">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 11965,7635 12025,7695 11965,7755 12318,7728 12318,7662z"/>
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 6640,9720 6685,9765 6640,9810 6903,9783 6903,9747z"/>
 </clipPath>
 </defs>
-<polyline points=" 10890,7695 12285,7695" clip-path="url(#cp3)"
-       stroke="#ff0000" stroke-width="60px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 12285,7695 -->
-<polygon points=" 11965,7755 12265,7695 11965,7635 12025,7695 11965,7755"
-       stroke="#ff0000" stroke-width="8px" stroke-miterlimit="8" fill="#ff0000"/>
+<polyline points=" 4140,9630 4410,9765 6885,9765" clip-path="url(#cp3)"
+       stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
+<!-- Forward arrow to point 6885,9765 -->
+<polygon points=" 6640,9810 6865,9765 6640,9720 6685,9765 6640,9810"
+       stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
 <defs>
 <clipPath id="cp4">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 6955,8865 7000,8910 6955,8955 7218,8928 7218,8892z"/>
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 10219,9032 10278,9006 10303,9065 10373,8810 10340,8797z"/>
 </clipPath>
 </defs>
-<polyline points=" 4455,8775 4725,8910 7200,8910" clip-path="url(#cp4)"
+<polyline points=" 9450,9630 10035,9630 10350,8820" clip-path="url(#cp4)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 7200,8910 -->
-<polygon points=" 6955,8955 7180,8910 6955,8865 7000,8910 6955,8955"
+<!-- Forward arrow to point 10350,8820 -->
+<polygon points=" 10303,9065 10343,8839 10219,9032 10278,9006 10303,9065"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
 <defs>
 <clipPath id="cp5">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 3895,6615 3940,6660 3895,6705 4158,6678 4158,6642z"/>
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 10122,8719 10185,8710 10194,8773 10330,8546 10301,8525z"/>
 </clipPath>
 </defs>
-<polyline points=" 2610,7515 2925,6660 3645,6660 4140,6660" clip-path="url(#cp5)"
+<polyline points=" 9450,8910 10035,8910 10305,8550" clip-path="url(#cp5)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 4140,6660 -->
-<polygon points=" 3895,6705 4120,6660 3895,6615 3940,6660 3895,6705"
+<!-- Forward arrow to point 10305,8550 -->
+<polygon points=" 10194,8773 10293,8566 10122,8719 10185,8710 10194,8773"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
 <defs>
 <clipPath id="cp6">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 10496,8462 10558,8449 10572,8511 10690,8274 10659,8255z"/>
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 10060,8145 10105,8190 10060,8235 10323,8208 10323,8172z"/>
 </clipPath>
 </defs>
-<polyline points=" 9765,8775 10350,8775 10665,8280" clip-path="url(#cp6)"
+<polyline points=" 9405,8190 9945,8190 10305,8190" clip-path="url(#cp6)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 10665,8280 -->
-<polygon points=" 10572,8511 10654,8297 10496,8462 10558,8449 10572,8511"
+<!-- Forward arrow to point 10305,8190 -->
+<polygon points=" 10060,8235 10285,8190 10060,8145 10105,8190 10060,8235"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
+<polyline points=" 9765,8100 9675,8280"
+       stroke="#000000" stroke-width="15px" stroke-linejoin="round"/>
+<!-- Line -->
+<polyline points=" 9765,8820 9675,9000"
+       stroke="#000000" stroke-width="15px" stroke-linejoin="round"/>
+<!-- Line -->
+<polyline points=" 9765,9540 9675,9720"
+       stroke="#000000" stroke-width="15px" stroke-linejoin="round"/>
+<!-- Line -->
 <defs>
 <clipPath id="cp7">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 10385,7957 10446,7974 10430,8036 10645,7882 10627,7850z"/>
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 6640,9000 6685,9045 6640,9090 6903,9063 6903,9027z"/>
 </clipPath>
 </defs>
-<polyline points=" 9765,8055 10305,8055 10620,7875" clip-path="url(#cp7)"
+<polyline points=" 4185,9495 6120,9495 6480,9045 6885,9045" clip-path="url(#cp7)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 10620,7875 -->
-<polygon points=" 10430,8036 10603,7885 10385,7957 10446,7974 10430,8036"
+<!-- Forward arrow to point 6885,9045 -->
+<polygon points=" 6640,9090 6865,9045 6640,9000 6685,9045 6640,9090"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
 <defs>
 <clipPath id="cp8">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 10580,6921 10564,6982 10503,6966 10659,7180 10690,7161z"/>
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 6640,8280 6685,8325 6640,8370 6903,8343 6903,8307z"/>
 </clipPath>
 </defs>
-<polyline points=" 9806,6605 10350,6615 10665,7155" clip-path="url(#cp8)"
+<polyline points=" 4185,9225 4455,9135 6165,9135 6435,8325 6885,8325" clip-path="url(#cp8)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 10665,7155 -->
-<polygon points=" 10503,6966 10655,7138 10580,6921 10564,6982 10503,6966"
+<!-- Forward arrow to point 6885,8325 -->
+<polygon points=" 6640,8370 6865,8325 6640,8280 6685,8325 6640,8370"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
+<polyline points=" 9765,7380 9675,7560"
+       stroke="#000000" stroke-width="15px" stroke-linejoin="round"/>
+<!-- Line -->
 <defs>
 <clipPath id="cp9">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 10461,7369 10466,7432 10403,7438 10622,7585 10645,7558z"/>
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 10213,7599 10199,7661 10137,7646 10299,7855 10330,7836z"/>
 </clipPath>
 </defs>
-<polyline points=" 9720,7335 10350,7335 10620,7560" clip-path="url(#cp9)"
+<polyline points=" 9491,7460 10080,7470 10305,7830" clip-path="url(#cp9)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 10620,7560 -->
-<polygon points=" 10403,7438 10605,7547 10461,7369 10466,7432 10403,7438"
+<!-- Forward arrow to point 10305,7830 -->
+<polygon points=" 10137,7646 10294,7813 10213,7599 10199,7661 10137,7646"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
-<polyline points=" 10080,7245 9990,7425"
-       stroke="#000000" stroke-width="15px" stroke-linejoin="round"/>
-<!-- Line -->
-<polyline points=" 10080,7965 9990,8145"
-       stroke="#000000" stroke-width="15px" stroke-linejoin="round"/>
-<!-- Line -->
-<polyline points=" 10080,8685 9990,8865"
-       stroke="#000000" stroke-width="15px" stroke-linejoin="round"/>
-<!-- Line -->
 <defs>
 <clipPath id="cp10">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 6955,8145 7000,8190 6955,8235 7218,8208 7218,8172z"/>
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 6640,7560 6685,7605 6640,7650 6903,7623 6903,7587z"/>
 </clipPath>
 </defs>
-<polyline points=" 4500,8550 6255,8550 6705,8190 7200,8190" clip-path="url(#cp10)"
+<polyline points=" 4140,9045 4410,8820 6075,8820 6435,7605 6885,7605" clip-path="url(#cp10)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 7200,8190 -->
-<polygon points=" 6955,8235 7180,8190 6955,8145 7000,8190 6955,8235"
+<!-- Forward arrow to point 6885,7605 -->
+<polygon points=" 6640,7650 6865,7605 6640,7560 6685,7605 6640,7650"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
 <defs>
 <clipPath id="cp11">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 6955,7425 7000,7470 6955,7515 7218,7488 7218,7452z"/>
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 10328,7267 10297,7322 10241,7291 10337,7537 10372,7528z"/>
 </clipPath>
 </defs>
-<polyline points=" 4500,8280 4725,8100 6435,8100 6750,7470 7200,7470" clip-path="url(#cp11)"
+<polyline points=" 9491,6695 10125,6705 10350,7515" clip-path="url(#cp11)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 7200,7470 -->
-<polygon points=" 6955,7515 7180,7470 6955,7425 7000,7470 6955,7515"
+<!-- Forward arrow to point 10350,7515 -->
+<polygon points=" 10241,7291 10345,7496 10328,7267 10297,7322 10241,7291"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
+<polyline points=" 9765,6615 9675,6795"
+       stroke="#000000" stroke-width="15px" stroke-linejoin="round"/>
+<!-- Line -->
 <defs>
 <clipPath id="cp12">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 6955,6705 7000,6750 6955,6795 7218,6768 7218,6732z"/>
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 6640,6660 6685,6705 6640,6750 6903,6723 6903,6687z"/>
 </clipPath>
 </defs>
-<polyline points=" 4455,8055 4635,7740 6390,7740 6750,6750 7200,6750" clip-path="url(#cp12)"
+<polyline points=" 4140,8820 4410,8460 5895,8460 6435,6705 6885,6705" clip-path="url(#cp12)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 7200,6750 -->
-<polygon points=" 6955,6795 7180,6750 6955,6705 7000,6750 6955,6795"
+<!-- Forward arrow to point 6885,6705 -->
+<polygon points=" 6640,6750 6865,6705 6640,6660 6685,6705 6640,6750"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
-<polyline points=" 10080,6525 9990,6705"
-       stroke="#000000" stroke-width="15px" stroke-linejoin="round"/>
+<defs>
+<clipPath id="cp13">
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 3400,7470 3445,7515 3400,7560 3663,7533 3663,7497z"/>
+</clipPath>
+</defs>
+<polyline points=" 2295,8370 2610,7515 3330,7515 3645,7515" clip-path="url(#cp13)"
+       stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
+<!-- Forward arrow to point 3645,7515 -->
+<polygon points=" 3400,7560 3625,7515 3400,7470 3445,7515 3400,7560"
+       stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
+<!-- Line -->
+<defs>
+<clipPath id="cp14">
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 11650,8175 11710,8235 11650,8295 12003,8268 12003,8202z"/>
+</clipPath>
+</defs>
+<polyline points=" 10575,8235 11970,8235" clip-path="url(#cp14)"
+       stroke="#ff0000" stroke-width="60px" stroke-linejoin="round"/>
+<!-- Forward arrow to point 11970,8235 -->
+<polygon points=" 11650,8295 11950,8235 11650,8175 11710,8235 11650,8295"
+       stroke="#ff0000" stroke-width="8px" stroke-miterlimit="8" fill="#ff0000"/>
 <!-- Ellipse -->
 <ellipse cx="3105" cy="5049" rx="810" ry="171" fill="#87cfff"
        stroke="#00008f" stroke-width="30px"/>
 <ellipse cx="3083" cy="1180" rx="607" ry="170" fill="#ffbfbf"
        stroke="#d10000" stroke-width="30px"/>
 <!-- Ellipse -->
-<ellipse cx="9428" cy="1180" rx="607" ry="170" fill="#ffbfbf"
-       stroke="#d10000" stroke-width="30px"/>
-<!-- Ellipse -->
-<ellipse transform="translate(4330,8437) rotate(-90)" rx="607" ry="170" fill="#ffbfbf"
+<ellipse transform="translate(4015,9292) rotate(-90)" rx="607" ry="170" fill="#ffbfbf"
        stroke="#d10000" stroke-width="30px"/>
 <!-- Ellipse -->
 <ellipse cx="9450" cy="5049" rx="540" ry="171" fill="#87cfff"
        stroke="#00008f" stroke-width="30px"/>
 <!-- Ellipse -->
-<ellipse transform="translate(2440,7672) rotate(-90)" rx="607" ry="170" fill="#ffbfbf"
+<ellipse cx="3083" cy="415" rx="607" ry="170" fill="#ffbfbf"
        stroke="#d10000" stroke-width="30px"/>
 <!-- Ellipse -->
-<ellipse transform="translate(10755,7695) rotate(-90)" rx="810" ry="171" fill="#87cfff"
+<ellipse transform="translate(2125,8527) rotate(-90)" rx="607" ry="170" fill="#ffbfbf"
+       stroke="#d10000" stroke-width="30px"/>
+<!-- Ellipse -->
+<ellipse transform="translate(10441,8209) rotate(-90)" rx="810" ry="171" fill="#87cfff"
        stroke="#00008f" stroke-width="30px"/>
 <!-- Line -->
-<polygon points=" 11768,3060 11970,3060 11967,3119 11959,3177 11946,3234 11929,3291 11907,3345
- 11879,3397 11704,3296 11723,3259 11738,3222 11751,3182 11760,3142 11765,3101
-" fill="#ffd600"
-       stroke="#000000" stroke-width="15px"/>
-<!-- Line -->
-<polygon points=" 11704,3296 11879,3397 11848,3447 11812,3494 11772,3537 11729,3577 11682,3613
- 11633,3644 11531,3469 11566,3447 11599,3422 11628,3393 11657,3364 11682,3331
-" fill="#ffd600"
-       stroke="#000000" stroke-width="15px"/>
-<!-- Line -->
-<polygon points=" 11531,3469 11633,3644 11580,3672 11526,3694 11469,3711 11412,3724 11354,3732
- 11295,3734 11295,3532 11336,3530 11377,3525 11417,3516 11457,3503 11494,3488
-" fill="#ffd600"
-       stroke="#000000" stroke-width="15px"/>
-<!-- Line -->
-<polygon points=" 11295,3532 11295,3734 11236,3732 11178,3724 11121,3711 11064,3694 11010,3672
- 10958,3644 11059,3469 11096,3488 11133,3503 11173,3516 11213,3525 11254,3530
-" fill="#ffd600"
-       stroke="#000000" stroke-width="15px"/>
-<!-- Line -->
-<polygon points=" 11059,3469 10958,3644 10908,3613 10861,3577 10818,3537 10778,3494 10742,3447
- 10711,3398 10886,3296 10908,3331 10933,3364 10962,3393 10991,3422 11024,3447
-" fill="#ffd600"
-       stroke="#000000" stroke-width="15px"/>
-<!-- Line -->
-<polygon points=" 10886,3296 10711,3398 10683,3345 10661,3291 10644,3234 10631,3177 10623,3119
- 10621,3060 10823,3060 10825,3101 10830,3142 10839,3182 10852,3222 10867,3259
-" fill="#ffd600"
-       stroke="#000000" stroke-width="15px"/>
-<!-- Line -->
-<polygon points=" 10823,3060 10621,3060 10623,3001 10631,2943 10644,2886 10661,2829 10683,2775
- 10711,2723 10886,2824 10867,2861 10852,2898 10839,2938 10830,2978 10825,3019
-" fill="#ffd600"
-       stroke="#000000" stroke-width="15px"/>
-<!-- Line -->
-<polygon points=" 10886,2824 10711,2723 10742,2673 10778,2626 10818,2583 10861,2543 10908,2507
- 10958,2476 11059,2651 11024,2673 10991,2698 10962,2727 10933,2756 10908,2789
-" fill="#ffd600"
-       stroke="#000000" stroke-width="15px"/>
-<!-- Line -->
-<polygon points=" 11059,2651 10958,2476 11010,2448 11064,2426 11121,2409 11178,2396 11236,2388
- 11295,2386 11295,2588 11254,2590 11213,2595 11173,2604 11133,2617 11096,2632
-" fill="#ffd600"
-       stroke="#000000" stroke-width="15px"/>
-<!-- Line -->
-<polygon points=" 11295,2588 11295,2386 11354,2388 11412,2396 11469,2409 11526,2426 11580,2448
- 11632,2476 11531,2651 11494,2632 11457,2617 11417,2604 11377,2595 11336,2590
-" fill="#ffd600"
-       stroke="#000000" stroke-width="15px"/>
-<!-- Line -->
-<polygon points=" 11531,2651 11632,2476 11682,2507 11729,2543 11772,2583 11812,2626 11848,2673
- 11879,2723 11704,2824 11682,2789 11657,2756 11628,2727 11599,2698 11566,2673
-" fill="#ffd600"
-       stroke="#000000" stroke-width="15px"/>
-<!-- Line -->
-<polygon points=" 11704,2824 11879,2723 11907,2775 11929,2829 11946,2886 11959,2943 11967,3001
- 11969,3060 11767,3060 11765,3019 11760,2978 11751,2938 11738,2898 11723,2861
-" fill="#ffd600"
-       stroke="#000000" stroke-width="15px"/>
-<!-- Line -->
 <polygon points=" 5423,3060 5625,3060 5622,3119 5614,3177 5601,3234 5584,3291 5562,3345 5534,3397
  5359,3296 5378,3259 5393,3222 5406,3182 5415,3142 5420,3101" fill="#00b000"
        stroke="#000000" stroke-width="15px"/>
 <text xml:space="preserve" x="3105" y="5130" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">Most Urgent</text>
 <!-- Line -->
 <defs>
-<polygon points=" 8078,3060 8280,3060 8277,3119 8269,3177 8256,3234 8239,3291 8217,3345 8189,3397
8014,3296 8033,3259 8048,3222 8061,3182 8070,3142 8075,3101" id="p0"/>
+<polygon points=" 1733,3060 1935,3060 1932,3119 1924,3177 1911,3234 1894,3291 1872,3345 1844,3397
1669,3296 1688,3259 1703,3222 1716,3182 1725,3142 1730,3101" id="p0"/>
 <pattern id="tile0" patternUnits="userSpaceOnUse"
        x="0" y="0" width="134" height="67">
 <g stroke-width="7.5" stroke="#000000" fill="none">
 </g>
 </pattern>
 </defs>
-<use xlink:href="#p0" fill="#ffd600"/>
+<use xlink:href="#p0" fill="#00b000"/>
 <use xlink:href="#p0" fill="url(#tile0)"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
 <defs>
-<polygon points=" 8014,3296 8189,3397 8158,3447 8122,3494 8082,3537 8039,3577 7992,3613 7943,3644
7841,3469 7876,3447 7909,3422 7938,3393 7967,3364 7992,3331" id="p1"/>
+<polygon points=" 1669,3296 1844,3397 1813,3447 1777,3494 1737,3537 1694,3577 1647,3613 1598,3644
1496,3469 1531,3447 1564,3422 1593,3393 1622,3364 1647,3331" id="p1"/>
 <pattern id="tile1" patternUnits="userSpaceOnUse"
        x="0" y="0" width="134" height="67">
 <g stroke-width="7.5" stroke="#000000" fill="none">
 </g>
 </pattern>
 </defs>
-<use xlink:href="#p1" fill="#ffd600"/>
+<use xlink:href="#p1" fill="#00b000"/>
 <use xlink:href="#p1" fill="url(#tile1)"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
 <defs>
-<polygon points=" 7841,3469 7943,3644 7890,3672 7836,3694 7779,3711 7722,3724 7664,3732 7605,3734
7605,3532 7646,3530 7687,3525 7727,3516 7767,3503 7804,3488" id="p2"/>
+<polygon points=" 1496,3469 1598,3644 1545,3672 1491,3694 1434,3711 1377,3724 1319,3732 1260,3734
1260,3532 1301,3530 1342,3525 1382,3516 1422,3503 1459,3488" id="p2"/>
 <pattern id="tile2" patternUnits="userSpaceOnUse"
        x="0" y="0" width="134" height="67">
 <g stroke-width="7.5" stroke="#000000" fill="none">
 </g>
 </pattern>
 </defs>
-<use xlink:href="#p2" fill="#ffd600"/>
+<use xlink:href="#p2" fill="#00b000"/>
 <use xlink:href="#p2" fill="url(#tile2)"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
 <defs>
-<polygon points=" 7605,3532 7605,3734 7546,3732 7488,3724 7431,3711 7374,3694 7320,3672 7268,3644
7369,3469 7406,3488 7443,3503 7483,3516 7523,3525 7564,3530" id="p3"/>
+<polygon points=" 1260,3532 1260,3734 1201,3732 1143,3724 1086,3711 1029,3694 975,3672 923,3644
1024,3469 1061,3488 1098,3503 1138,3516 1178,3525 1219,3530" id="p3"/>
 <pattern id="tile3" patternUnits="userSpaceOnUse"
        x="0" y="0" width="134" height="67">
 <g stroke-width="7.5" stroke="#000000" fill="none">
 </g>
 </pattern>
 </defs>
-<use xlink:href="#p3" fill="#ffd600"/>
+<use xlink:href="#p3" fill="#00b000"/>
 <use xlink:href="#p3" fill="url(#tile3)"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
 <defs>
-<polygon points=" 7369,3469 7268,3644 7218,3613 7171,3577 7128,3537 7088,3494 7052,3447 7021,3398
7196,3296 7218,3331 7243,3364 7272,3393 7301,3422 7334,3447" id="p4"/>
+<polygon points=" 1024,3469 923,3644 873,3613 826,3577 783,3537 743,3494 707,3447 676,3398 851,3296
873,3331 898,3364 927,3393 956,3422 989,3447" id="p4"/>
 <pattern id="tile4" patternUnits="userSpaceOnUse"
        x="0" y="0" width="134" height="67">
 <g stroke-width="7.5" stroke="#000000" fill="none">
 </g>
 </pattern>
 </defs>
-<use xlink:href="#p4" fill="#ffd600"/>
+<use xlink:href="#p4" fill="#00b000"/>
 <use xlink:href="#p4" fill="url(#tile4)"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
 <defs>
-<polygon points=" 7196,3296 7021,3398 6993,3345 6971,3291 6954,3234 6941,3177 6933,3119 6931,3060
- 7133,3060 7135,3101 7140,3142 7149,3182 7162,3222 7177,3259" id="p5"/>
+<polygon points=" 851,3296 676,3398 648,3345 626,3291 609,3234 596,3177 588,3119 586,3060 788,3060
+ 790,3101 795,3142 804,3182 817,3222 832,3259" id="p5"/>
 <pattern id="tile5" patternUnits="userSpaceOnUse"
        x="0" y="0" width="134" height="67">
 <g stroke-width="7.5" stroke="#000000" fill="none">
 </g>
 </pattern>
 </defs>
-<use xlink:href="#p5" fill="#ffd600"/>
+<use xlink:href="#p5" fill="#00b000"/>
 <use xlink:href="#p5" fill="url(#tile5)"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
 <defs>
-<polygon points=" 7133,3060 6931,3060 6933,3001 6941,2943 6954,2886 6971,2829 6993,2775 7021,2723
7196,2824 7177,2861 7162,2898 7149,2938 7140,2978 7135,3019" id="p6"/>
+<polygon points=" 788,3060 586,3060 588,3001 596,2943 609,2886 626,2829 648,2775 676,2723 851,2824
832,2861 817,2898 804,2938 795,2978 790,3019" id="p6"/>
 <pattern id="tile6" patternUnits="userSpaceOnUse"
        x="0" y="0" width="134" height="67">
 <g stroke-width="7.5" stroke="#000000" fill="none">
 </g>
 </pattern>
 </defs>
-<use xlink:href="#p6" fill="#ffd600"/>
+<use xlink:href="#p6" fill="#00b000"/>
 <use xlink:href="#p6" fill="url(#tile6)"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
 <defs>
-<polygon points=" 7196,2824 7021,2723 7052,2673 7088,2626 7128,2583 7171,2543 7218,2507 7268,2476
7369,2651 7334,2673 7301,2698 7272,2727 7243,2756 7218,2789" id="p7"/>
+<polygon points=" 851,2824 676,2723 707,2673 743,2626 783,2583 826,2543 873,2507 923,2476 1024,2651
989,2673 956,2698 927,2727 898,2756 873,2789" id="p7"/>
 <pattern id="tile7" patternUnits="userSpaceOnUse"
        x="0" y="0" width="134" height="67">
 <g stroke-width="7.5" stroke="#000000" fill="none">
 </g>
 </pattern>
 </defs>
-<use xlink:href="#p7" fill="#ffd600"/>
+<use xlink:href="#p7" fill="#00b000"/>
 <use xlink:href="#p7" fill="url(#tile7)"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
 <defs>
-<polygon points=" 7369,2651 7268,2476 7320,2448 7374,2426 7431,2409 7488,2396 7546,2388 7605,2386
7605,2588 7564,2590 7523,2595 7483,2604 7443,2617 7406,2632" id="p8"/>
+<polygon points=" 1024,2651 923,2476 975,2448 1029,2426 1086,2409 1143,2396 1201,2388 1260,2386
1260,2588 1219,2590 1178,2595 1138,2604 1098,2617 1061,2632" id="p8"/>
 <pattern id="tile8" patternUnits="userSpaceOnUse"
        x="0" y="0" width="134" height="67">
 <g stroke-width="7.5" stroke="#000000" fill="none">
 </g>
 </pattern>
 </defs>
-<use xlink:href="#p8" fill="#ffd600"/>
+<use xlink:href="#p8" fill="#00b000"/>
 <use xlink:href="#p8" fill="url(#tile8)"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
 <defs>
-<polygon points=" 7605,2588 7605,2386 7664,2388 7722,2396 7779,2409 7836,2426 7890,2448 7942,2476
7841,2651 7804,2632 7767,2617 7727,2604 7687,2595 7646,2590" id="p9"/>
+<polygon points=" 1260,2588 1260,2386 1319,2388 1377,2396 1434,2409 1491,2426 1545,2448 1597,2476
1496,2651 1459,2632 1422,2617 1382,2604 1342,2595 1301,2590" id="p9"/>
 <pattern id="tile9" patternUnits="userSpaceOnUse"
        x="0" y="0" width="134" height="67">
 <g stroke-width="7.5" stroke="#000000" fill="none">
 </g>
 </pattern>
 </defs>
-<use xlink:href="#p9" fill="#ffd600"/>
+<use xlink:href="#p9" fill="#00b000"/>
 <use xlink:href="#p9" fill="url(#tile9)"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
 <defs>
-<polygon points=" 7841,2651 7942,2476 7992,2507 8039,2543 8082,2583 8122,2626 8158,2673 8189,2723
8014,2824 7992,2789 7967,2756 7938,2727 7909,2698 7876,2673" id="p10"/>
+<polygon points=" 1496,2651 1597,2476 1647,2507 1694,2543 1737,2583 1777,2626 1813,2673 1844,2723
1669,2824 1647,2789 1622,2756 1593,2727 1564,2698 1531,2673" id="p10"/>
 <pattern id="tile10" patternUnits="userSpaceOnUse"
        x="0" y="0" width="134" height="67">
 <g stroke-width="7.5" stroke="#000000" fill="none">
 </g>
 </pattern>
 </defs>
-<use xlink:href="#p10" fill="#ffd600"/>
+<use xlink:href="#p10" fill="#00b000"/>
 <use xlink:href="#p10" fill="url(#tile10)"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
 <defs>
-<polygon points=" 8014,2824 8189,2723 8217,2775 8239,2829 8256,2886 8269,2943 8277,3001 8279,3060
8077,3060 8075,3019 8070,2978 8061,2938 8048,2898 8033,2861" id="p11"/>
+<polygon points=" 1669,2824 1844,2723 1872,2775 1894,2829 1911,2886 1924,2943 1932,3001 1934,3060
1732,3060 1730,3019 1725,2978 1716,2938 1703,2898 1688,2861" id="p11"/>
 <pattern id="tile11" patternUnits="userSpaceOnUse"
        x="0" y="0" width="134" height="67">
 <g stroke-width="7.5" stroke="#000000" fill="none">
 </g>
 </pattern>
 </defs>
-<use xlink:href="#p11" fill="#ffd600"/>
+<use xlink:href="#p11" fill="#00b000"/>
 <use xlink:href="#p11" fill="url(#tile11)"
        stroke="#000000" stroke-width="15px"/>
+<!-- Text -->
+<text xml:space="preserve" x="4230" y="2250" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">tasks</text>
+<!-- Text -->
+<text xml:space="preserve" x="4230" y="2070" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">Local</text>
+<!-- Text -->
+<text xml:space="preserve" x="3105" y="1260" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">Local ?</text>
+<!-- Text -->
+<text xml:space="preserve" x="3375" y="1530" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="108" text-anchor="start">Yes</text>
+<!-- Text -->
+<text xml:space="preserve" x="2790" y="1530" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="108" text-anchor="end">No</text>
 <!-- Line -->
-<defs>
-<polygon points=" 1733,3060 1935,3060 1932,3119 1924,3177 1911,3234 1894,3291 1872,3345 1844,3397
- 1669,3296 1688,3259 1703,3222 1716,3182 1725,3142 1730,3101" id="p12"/>
-<pattern id="tile12" patternUnits="userSpaceOnUse"
-       x="0" y="0" width="134" height="67">
-<g stroke-width="7.5" stroke="#000000" fill="none">
-<path d="M -7,30 73,70 M 61,-3 141,37 M -7,37 73,-3 M 61,70 141,30"/>
-</g>
-</pattern>
-</defs>
-<use xlink:href="#p12" fill="#00b000"/>
-<use xlink:href="#p12" fill="url(#tile12)"
+<polygon points=" 9923,3195 10125,3195 10122,3254 10114,3312 10101,3369 10084,3426 10062,3480
+ 10034,3532 9859,3431 9878,3394 9893,3357 9906,3317 9915,3277 9920,3236" fill="#ffd600"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
-<defs>
-<polygon points=" 1669,3296 1844,3397 1813,3447 1777,3494 1737,3537 1694,3577 1647,3613 1598,3644
- 1496,3469 1531,3447 1564,3422 1593,3393 1622,3364 1647,3331" id="p13"/>
-<pattern id="tile13" patternUnits="userSpaceOnUse"
-       x="0" y="0" width="134" height="67">
-<g stroke-width="7.5" stroke="#000000" fill="none">
-<path d="M -7,30 73,70 M 61,-3 141,37 M -7,37 73,-3 M 61,70 141,30"/>
-</g>
-</pattern>
-</defs>
-<use xlink:href="#p13" fill="#00b000"/>
-<use xlink:href="#p13" fill="url(#tile13)"
+<polygon points=" 9859,3431 10034,3532 10003,3582 9967,3629 9927,3672 9884,3712 9837,3748 9788,3779
+ 9686,3604 9721,3582 9754,3557 9783,3528 9812,3499 9837,3466" fill="#ffd600"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
-<defs>
-<polygon points=" 1496,3469 1598,3644 1545,3672 1491,3694 1434,3711 1377,3724 1319,3732 1260,3734
- 1260,3532 1301,3530 1342,3525 1382,3516 1422,3503 1459,3488" id="p14"/>
-<pattern id="tile14" patternUnits="userSpaceOnUse"
-       x="0" y="0" width="134" height="67">
-<g stroke-width="7.5" stroke="#000000" fill="none">
-<path d="M -7,30 73,70 M 61,-3 141,37 M -7,37 73,-3 M 61,70 141,30"/>
-</g>
-</pattern>
-</defs>
-<use xlink:href="#p14" fill="#00b000"/>
-<use xlink:href="#p14" fill="url(#tile14)"
+<polygon points=" 9686,3604 9788,3779 9735,3807 9681,3829 9624,3846 9567,3859 9509,3867 9450,3869
+ 9450,3667 9491,3665 9532,3660 9572,3651 9612,3638 9649,3623" fill="#ffd600"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
-<defs>
-<polygon points=" 1260,3532 1260,3734 1201,3732 1143,3724 1086,3711 1029,3694 975,3672 923,3644
- 1024,3469 1061,3488 1098,3503 1138,3516 1178,3525 1219,3530" id="p15"/>
-<pattern id="tile15" patternUnits="userSpaceOnUse"
-       x="0" y="0" width="134" height="67">
-<g stroke-width="7.5" stroke="#000000" fill="none">
-<path d="M -7,30 73,70 M 61,-3 141,37 M -7,37 73,-3 M 61,70 141,30"/>
-</g>
-</pattern>
-</defs>
-<use xlink:href="#p15" fill="#00b000"/>
-<use xlink:href="#p15" fill="url(#tile15)"
+<polygon points=" 9450,3667 9450,3869 9391,3867 9333,3859 9276,3846 9219,3829 9165,3807 9113,3779
+ 9214,3604 9251,3623 9288,3638 9328,3651 9368,3660 9409,3665" fill="#ffd600"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
-<defs>
-<polygon points=" 1024,3469 923,3644 873,3613 826,3577 783,3537 743,3494 707,3447 676,3398 851,3296
- 873,3331 898,3364 927,3393 956,3422 989,3447" id="p16"/>
-<pattern id="tile16" patternUnits="userSpaceOnUse"
-       x="0" y="0" width="134" height="67">
-<g stroke-width="7.5" stroke="#000000" fill="none">
-<path d="M -7,30 73,70 M 61,-3 141,37 M -7,37 73,-3 M 61,70 141,30"/>
-</g>
-</pattern>
-</defs>
-<use xlink:href="#p16" fill="#00b000"/>
-<use xlink:href="#p16" fill="url(#tile16)"
+<polygon points=" 9214,3604 9113,3779 9063,3748 9016,3712 8973,3672 8933,3629 8897,3582 8866,3533
+ 9041,3431 9063,3466 9088,3499 9117,3528 9146,3557 9179,3582" fill="#ffd600"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
-<defs>
-<polygon points=" 851,3296 676,3398 648,3345 626,3291 609,3234 596,3177 588,3119 586,3060 788,3060
- 790,3101 795,3142 804,3182 817,3222 832,3259" id="p17"/>
-<pattern id="tile17" patternUnits="userSpaceOnUse"
-       x="0" y="0" width="134" height="67">
-<g stroke-width="7.5" stroke="#000000" fill="none">
-<path d="M -7,30 73,70 M 61,-3 141,37 M -7,37 73,-3 M 61,70 141,30"/>
-</g>
-</pattern>
-</defs>
-<use xlink:href="#p17" fill="#00b000"/>
-<use xlink:href="#p17" fill="url(#tile17)"
+<polygon points=" 9041,3431 8866,3533 8838,3480 8816,3426 8799,3369 8786,3312 8778,3254 8776,3195
+ 8978,3195 8980,3236 8985,3277 8994,3317 9007,3357 9022,3394" fill="#ffd600"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
-<defs>
-<polygon points=" 788,3060 586,3060 588,3001 596,2943 609,2886 626,2829 648,2775 676,2723 851,2824
- 832,2861 817,2898 804,2938 795,2978 790,3019" id="p18"/>
-<pattern id="tile18" patternUnits="userSpaceOnUse"
-       x="0" y="0" width="134" height="67">
-<g stroke-width="7.5" stroke="#000000" fill="none">
-<path d="M -7,30 73,70 M 61,-3 141,37 M -7,37 73,-3 M 61,70 141,30"/>
-</g>
-</pattern>
-</defs>
-<use xlink:href="#p18" fill="#00b000"/>
-<use xlink:href="#p18" fill="url(#tile18)"
+<polygon points=" 8978,3195 8776,3195 8778,3136 8786,3078 8799,3021 8816,2964 8838,2910 8866,2858
+ 9041,2959 9022,2996 9007,3033 8994,3073 8985,3113 8980,3154" fill="#ffd600"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
-<defs>
-<polygon points=" 851,2824 676,2723 707,2673 743,2626 783,2583 826,2543 873,2507 923,2476 1024,2651
- 989,2673 956,2698 927,2727 898,2756 873,2789" id="p19"/>
-<pattern id="tile19" patternUnits="userSpaceOnUse"
-       x="0" y="0" width="134" height="67">
-<g stroke-width="7.5" stroke="#000000" fill="none">
-<path d="M -7,30 73,70 M 61,-3 141,37 M -7,37 73,-3 M 61,70 141,30"/>
-</g>
-</pattern>
-</defs>
-<use xlink:href="#p19" fill="#00b000"/>
-<use xlink:href="#p19" fill="url(#tile19)"
+<polygon points=" 9041,2959 8866,2858 8897,2808 8933,2761 8973,2718 9016,2678 9063,2642 9113,2611
+ 9214,2786 9179,2808 9146,2833 9117,2862 9088,2891 9063,2924" fill="#ffd600"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
-<defs>
-<polygon points=" 1024,2651 923,2476 975,2448 1029,2426 1086,2409 1143,2396 1201,2388 1260,2386
- 1260,2588 1219,2590 1178,2595 1138,2604 1098,2617 1061,2632" id="p20"/>
-<pattern id="tile20" patternUnits="userSpaceOnUse"
-       x="0" y="0" width="134" height="67">
-<g stroke-width="7.5" stroke="#000000" fill="none">
-<path d="M -7,30 73,70 M 61,-3 141,37 M -7,37 73,-3 M 61,70 141,30"/>
-</g>
-</pattern>
-</defs>
-<use xlink:href="#p20" fill="#00b000"/>
-<use xlink:href="#p20" fill="url(#tile20)"
+<polygon points=" 9214,2786 9113,2611 9165,2583 9219,2561 9276,2544 9333,2531 9391,2523 9450,2521
+ 9450,2723 9409,2725 9368,2730 9328,2739 9288,2752 9251,2767" fill="#ffd600"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
-<defs>
-<polygon points=" 1260,2588 1260,2386 1319,2388 1377,2396 1434,2409 1491,2426 1545,2448 1597,2476
- 1496,2651 1459,2632 1422,2617 1382,2604 1342,2595 1301,2590" id="p21"/>
-<pattern id="tile21" patternUnits="userSpaceOnUse"
-       x="0" y="0" width="134" height="67">
-<g stroke-width="7.5" stroke="#000000" fill="none">
-<path d="M -7,30 73,70 M 61,-3 141,37 M -7,37 73,-3 M 61,70 141,30"/>
-</g>
-</pattern>
-</defs>
-<use xlink:href="#p21" fill="#00b000"/>
-<use xlink:href="#p21" fill="url(#tile21)"
+<polygon points=" 9450,2723 9450,2521 9509,2523 9567,2531 9624,2544 9681,2561 9735,2583 9787,2611
+ 9686,2786 9649,2767 9612,2752 9572,2739 9532,2730 9491,2725" fill="#ffd600"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
-<defs>
-<polygon points=" 1496,2651 1597,2476 1647,2507 1694,2543 1737,2583 1777,2626 1813,2673 1844,2723
- 1669,2824 1647,2789 1622,2756 1593,2727 1564,2698 1531,2673" id="p22"/>
-<pattern id="tile22" patternUnits="userSpaceOnUse"
-       x="0" y="0" width="134" height="67">
-<g stroke-width="7.5" stroke="#000000" fill="none">
-<path d="M -7,30 73,70 M 61,-3 141,37 M -7,37 73,-3 M 61,70 141,30"/>
-</g>
-</pattern>
-</defs>
-<use xlink:href="#p22" fill="#00b000"/>
-<use xlink:href="#p22" fill="url(#tile22)"
+<polygon points=" 9686,2786 9787,2611 9837,2642 9884,2678 9927,2718 9967,2761 10003,2808 10034,2858
+ 9859,2959 9837,2924 9812,2891 9783,2862 9754,2833 9721,2808" fill="#ffd600"
        stroke="#000000" stroke-width="15px"/>
 <!-- Line -->
-<defs>
-<polygon points=" 1669,2824 1844,2723 1872,2775 1894,2829 1911,2886 1924,2943 1932,3001 1934,3060
- 1732,3060 1730,3019 1725,2978 1716,2938 1703,2898 1688,2861" id="p23"/>
-<pattern id="tile23" patternUnits="userSpaceOnUse"
-       x="0" y="0" width="134" height="67">
-<g stroke-width="7.5" stroke="#000000" fill="none">
-<path d="M -7,30 73,70 M 61,-3 141,37 M -7,37 73,-3 M 61,70 141,30"/>
-</g>
-</pattern>
-</defs>
-<use xlink:href="#p23" fill="#00b000"/>
-<use xlink:href="#p23" fill="url(#tile23)"
+<polygon points=" 9859,2959 10034,2858 10062,2910 10084,2964 10101,3021 10114,3078 10122,3136
+ 10124,3195 9922,3195 9920,3154 9915,3113 9906,3073 9893,3033 9878,2996" fill="#ffd600"
        stroke="#000000" stroke-width="15px"/>
 <!-- Text -->
-<text xml:space="preserve" x="2160" y="1980" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">Global</text>
-<!-- Text -->
-<text xml:space="preserve" x="2160" y="2160" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">tasks</text>
-<!-- Text -->
-<text xml:space="preserve" x="2160" y="2340" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">(locked)</text>
+<text xml:space="preserve" x="8685" y="2385" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">timers</text>
 <!-- Text -->
-<text xml:space="preserve" x="4230" y="2250" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">tasks</text>
-<!-- Text -->
-<text xml:space="preserve" x="4230" y="2070" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">Local</text>
-<!-- Text -->
-<text xml:space="preserve" x="8550" y="2340" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">(locked)</text>
-<!-- Text -->
-<text xml:space="preserve" x="8550" y="2160" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">timers</text>
-<!-- Text -->
-<text xml:space="preserve" x="8550" y="1980" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">Global</text>
-<!-- Text -->
-<text xml:space="preserve" x="10530" y="2250" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">timers</text>
-<!-- Text -->
-<text xml:space="preserve" x="10530" y="2070" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">Local</text>
-<!-- Text -->
-<text xml:space="preserve" x="3105" y="1260" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">Local ?</text>
-<!-- Text -->
-<text xml:space="preserve" x="3375" y="1530" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="108" text-anchor="start">Yes</text>
-<!-- Text -->
-<text xml:space="preserve" x="2790" y="1530" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="108" text-anchor="end">No</text>
-<!-- Text -->
-<text xml:space="preserve" x="9450" y="1260" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">Local ?</text>
-<!-- Text -->
-<text xml:space="preserve" x="9720" y="1530" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="108" text-anchor="start">Yes</text>
-<!-- Text -->
-<text xml:space="preserve" x="9135" y="1530" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="108" text-anchor="end">No</text>
-<!-- Text -->
-<g transform="translate(4410,8415) rotate(-90)" >
-<text xml:space="preserve" x="0" y="0" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">Class?</text>
-</g><!-- Arc -->
-<defs>
-<clipPath id="cp13">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 11065,2294 11189,2298 11078,2353 11217,2303 11213,2283z"/>
-</clipPath>
-</defs>
-<path d="M 11205,3825 A 771 771 0 0 1 11205 2295" clip-path="url(#cp13)"
-       stroke="#000000" stroke-width="15px"/>
-<!-- Forward arrow to point 11205,2295 -->
-<polyline points=" 11065,2294 11189,2298 11078,2353"
-       stroke="#000000" stroke-width="8px" stroke-miterlimit="8"/>
-<!-- Arc -->
-<defs>
-<clipPath id="cp14">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 11065,2294 11189,2298 11078,2353 11217,2303 11213,2283z
-               M 11525,3826 11401,3822 11512,3767 11373,3817 11377,3837z"/>
-</clipPath>
-</defs>
-<path d="M 11385,3825 A 771 771 0 0 0 11385 2295" clip-path="url(#cp14)"
-       stroke="#000000" stroke-width="15px"/>
-<!-- Backward arrow to point 11385,3825 -->
-<polyline points=" 11525,3826 11401,3822 11512,3767"
-       stroke="#000000" stroke-width="8px" stroke-miterlimit="8"/>
+<text xml:space="preserve" x="8685" y="2205" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">Local</text>
 <!-- Arc -->
 <defs>
 <clipPath id="cp15">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 11065,2294 11189,2298 11078,2353 11217,2303 11213,2283z
-               M 10908,3277 10928,3240 10965,3260 10897,3092 10877,3098z"/>
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 9220,2429 9344,2433 9233,2488 9372,2438 9368,2418z"/>
 </clipPath>
 </defs>
-<path d="M 10890,3105 A 406 406 0 1 0 10890 3015" clip-path="url(#cp15)"
+<path d="M 9360,3960 A 771 771 0 0 1 9360 2430" clip-path="url(#cp15)"
        stroke="#000000" stroke-width="15px"/>
-<!-- Backward arrow to point 10890,3105 -->
-<polygon points=" 10965,3260 10895,3124 10908,3277 10928,3240 10965,3260"
-       stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
+<!-- Forward arrow to point 9360,2430 -->
+<polyline points=" 9220,2429 9344,2433 9233,2488"
+       stroke="#000000" stroke-width="8px" stroke-miterlimit="8"/>
 <!-- Arc -->
 <defs>
 <clipPath id="cp16">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 7375,2294 7499,2298 7388,2353 7527,2303 7523,2283z
-               M 10908,3277 10928,3240 10965,3260 10897,3092 10877,3098z"/>
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 9220,2429 9344,2433 9233,2488 9372,2438 9368,2418z
+               M 9680,3961 9556,3957 9667,3902 9528,3952 9532,3972z"/>
 </clipPath>
 </defs>
-<path d="M 7515,3825 A 771 771 0 0 1 7515 2295" clip-path="url(#cp16)"
+<path d="M 9540,3960 A 771 771 0 0 0 9540 2430" clip-path="url(#cp16)"
        stroke="#000000" stroke-width="15px"/>
-<!-- Forward arrow to point 7515,2295 -->
-<polyline points=" 7375,2294 7499,2298 7388,2353"
+<!-- Backward arrow to point 9540,3960 -->
+<polyline points=" 9680,3961 9556,3957 9667,3902"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8"/>
 <!-- Arc -->
 <defs>
 <clipPath id="cp17">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 7375,2294 7499,2298 7388,2353 7527,2303 7523,2283z
-               M 7835,3826 7711,3822 7822,3767 7683,3817 7687,3837z"/>
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 9220,2429 9344,2433 9233,2488 9372,2438 9368,2418z
+               M 9063,3412 9083,3375 9120,3395 9052,3227 9032,3233z"/>
 </clipPath>
 </defs>
-<path d="M 7695,3825 A 771 771 0 0 0 7695 2295" clip-path="url(#cp17)"
+<path d="M 9045,3240 A 406 406 0 1 0 9045 3150" clip-path="url(#cp17)"
        stroke="#000000" stroke-width="15px"/>
-<!-- Backward arrow to point 7695,3825 -->
-<polyline points=" 7835,3826 7711,3822 7822,3767"
-       stroke="#000000" stroke-width="8px" stroke-miterlimit="8"/>
-<!-- Arc -->
-<defs>
-<clipPath id="cp18">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 7375,2294 7499,2298 7388,2353 7527,2303 7523,2283z
-               M 7218,3277 7238,3240 7275,3260 7207,3092 7187,3098z"/>
-</clipPath>
-</defs>
-<path d="M 7200,3105 A 406 406 0 1 0 7200 3015" clip-path="url(#cp18)"
-       stroke="#000000" stroke-width="15px"/>
-<!-- Backward arrow to point 7200,3105 -->
-<polygon points=" 7275,3260 7205,3124 7218,3277 7238,3240 7275,3260"
+<!-- Backward arrow to point 9045,3240 -->
+<polygon points=" 9120,3395 9050,3259 9063,3412 9083,3375 9120,3395"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
+<!-- Text -->
+<g transform="translate(10395,3195) rotate(-90)" >
+<text xml:space="preserve" x="0" y="0" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="108" text-anchor="middle">past</text>
+</g><!-- Text -->
+<g transform="translate(8595,3195) rotate(-90)" >
+<text xml:space="preserve" x="0" y="0" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="108" text-anchor="middle">future</text>
+</g><!-- Text -->
+<text xml:space="preserve" x="6840" y="4095" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="144" text-anchor="start">Time-based</text>
+<!-- Text -->
+<text xml:space="preserve" x="6840" y="4545" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="144" text-anchor="start">- 1 per thread</text>
+<!-- Text -->
+<text xml:space="preserve" x="6840" y="4320" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="144" text-anchor="start">Wait queues</text>
+<!-- Text -->
+<g transform="translate(4095,9270) rotate(-90)" >
+<text xml:space="preserve" x="0" y="0" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">Class?</text>
+</g><!-- Text -->
+<text xml:space="preserve" x="4590" y="7110" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="120" text-anchor="middle">(accessed using atomic ops)</text>
 <!-- Arc -->
 <defs>
-<clipPath id="cp19">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
+<clipPath id="cp18">
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
                M 4720,2294 4844,2298 4733,2353 4872,2303 4868,2283z
-               M 7218,3277 7238,3240 7275,3260 7207,3092 7187,3098z"/>
+               M 9063,3412 9083,3375 9120,3395 9052,3227 9032,3233z"/>
 </clipPath>
 </defs>
-<path d="M 4860,3825 A 771 771 0 0 1 4860 2295" clip-path="url(#cp19)"
+<path d="M 4860,3825 A 771 771 0 0 1 4860 2295" clip-path="url(#cp18)"
        stroke="#000000" stroke-width="15px"/>
 <!-- Forward arrow to point 4860,2295 -->
 <polyline points=" 4720,2294 4844,2298 4733,2353"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8"/>
 <!-- Arc -->
 <defs>
-<clipPath id="cp20">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
+<clipPath id="cp19">
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
                M 4720,2294 4844,2298 4733,2353 4872,2303 4868,2283z
                M 5180,3826 5056,3822 5167,3767 5028,3817 5032,3837z"/>
 </clipPath>
 </defs>
-<path d="M 5040,3825 A 771 771 0 0 0 5040 2295" clip-path="url(#cp20)"
+<path d="M 5040,3825 A 771 771 0 0 0 5040 2295" clip-path="url(#cp19)"
        stroke="#000000" stroke-width="15px"/>
 <!-- Backward arrow to point 5040,3825 -->
 <polyline points=" 5180,3826 5056,3822 5167,3767"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8"/>
 <!-- Arc -->
 <defs>
-<clipPath id="cp21">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
+<clipPath id="cp20">
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
                M 4720,2294 4844,2298 4733,2353 4872,2303 4868,2283z
                M 4563,3277 4583,3240 4620,3260 4552,3092 4532,3098z"/>
 </clipPath>
 </defs>
-<path d="M 4545,3105 A 406 406 0 1 0 4545 3015" clip-path="url(#cp21)"
+<path d="M 4545,3105 A 406 406 0 1 0 4545 3015" clip-path="url(#cp20)"
        stroke="#000000" stroke-width="15px"/>
 <!-- Backward arrow to point 4545,3105 -->
 <polygon points=" 4620,3260 4550,3124 4563,3277 4583,3240 4620,3260"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Arc -->
 <defs>
-<clipPath id="cp22">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
+<clipPath id="cp21">
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
                M 1030,2294 1154,2298 1043,2353 1182,2303 1178,2283z
                M 4563,3277 4583,3240 4620,3260 4552,3092 4532,3098z"/>
 </clipPath>
 </defs>
-<path d="M 1170,3825 A 771 771 0 0 1 1170 2295" clip-path="url(#cp22)"
+<path d="M 1170,3825 A 771 771 0 0 1 1170 2295" clip-path="url(#cp21)"
        stroke="#000000" stroke-width="15px"/>
 <!-- Forward arrow to point 1170,2295 -->
 <polyline points=" 1030,2294 1154,2298 1043,2353"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8"/>
 <!-- Arc -->
 <defs>
-<clipPath id="cp23">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
+<clipPath id="cp22">
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
                M 1030,2294 1154,2298 1043,2353 1182,2303 1178,2283z
                M 1490,3826 1366,3822 1477,3767 1338,3817 1342,3837z"/>
 </clipPath>
 </defs>
-<path d="M 1350,3825 A 771 771 0 0 0 1350 2295" clip-path="url(#cp23)"
+<path d="M 1350,3825 A 771 771 0 0 0 1350 2295" clip-path="url(#cp22)"
        stroke="#000000" stroke-width="15px"/>
 <!-- Backward arrow to point 1350,3825 -->
 <polyline points=" 1490,3826 1366,3822 1477,3767"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8"/>
 <!-- Arc -->
 <defs>
-<clipPath id="cp24">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
+<clipPath id="cp23">
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
                M 1030,2294 1154,2298 1043,2353 1182,2303 1178,2283z
                M 873,3277 893,3240 930,3260 862,3092 842,3098z"/>
 </clipPath>
 </defs>
-<path d="M 855,3105 A 406 406 0 1 0 855 3015" clip-path="url(#cp24)"
+<path d="M 855,3105 A 406 406 0 1 0 855 3015" clip-path="url(#cp23)"
        stroke="#000000" stroke-width="15px"/>
 <!-- Backward arrow to point 855,3105 -->
 <polygon points=" 930,3260 860,3124 873,3277 893,3240 930,3260"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
 <defs>
+<clipPath id="cp24">
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 2970,4660 2925,4705 2880,4660 2907,4923 2943,4923z
+               M 873,3277 893,3240 930,3260 862,3092 842,3098z"/>
+</clipPath>
+</defs>
+<polyline points=" 1260,3870 1260,4185 2925,4545 2925,4905" clip-path="url(#cp24)"
+       stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
+<!-- Forward arrow to point 2925,4905 -->
+<polygon points=" 2880,4660 2925,4885 2970,4660 2925,4705 2880,4660"
+       stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
+<!-- Line -->
+<defs>
 <clipPath id="cp25">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 9315,4660 9270,4705 9225,4660 9252,4923 9288,4923z
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 3336,4660 3291,4705 3246,4660 3273,4923 3309,4923z
                M 873,3277 893,3240 930,3260 862,3092 842,3098z"/>
 </clipPath>
 </defs>
-<polyline points=" 7605,3870 7605,4185 9270,4545 9270,4905" clip-path="url(#cp25)"
+<polyline points=" 4956,3870 4956,4185 3291,4545 3291,4905" clip-path="url(#cp25)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 9270,4905 -->
-<polygon points=" 9225,4660 9270,4885 9315,4660 9270,4705 9225,4660"
+<!-- Forward arrow to point 3291,4905 -->
+<polygon points=" 3246,4660 3291,4885 3336,4660 3291,4705 3246,4660"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
 <defs>
 <clipPath id="cp26">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 9681,4660 9636,4705 9591,4660 9618,4923 9654,4923z
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 4995,2140 4950,2185 4905,2140 4932,2403 4968,2403z
                M 873,3277 893,3240 930,3260 862,3092 842,3098z"/>
 </clipPath>
 </defs>
-<polyline points=" 11301,3870 11301,4185 9636,4545 9636,4905" clip-path="url(#cp26)"
+<polyline points=" 3285,1395 3285,1575 4950,1845 4950,2385" clip-path="url(#cp26)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 9636,4905 -->
-<polygon points=" 9591,4660 9636,4885 9681,4660 9636,4705 9591,4660"
+<!-- Forward arrow to point 4950,2385 -->
+<polygon points=" 4905,2140 4950,2365 4995,2140 4950,2185 4905,2140"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
 <defs>
 <clipPath id="cp27">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 11338,2050 11293,2095 11248,2051 11277,2313 11313,2313z
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 1305,2140 1260,2185 1215,2140 1242,2403 1278,2403z
                M 873,3277 893,3240 930,3260 862,3092 842,3098z"/>
 </clipPath>
 </defs>
-<polyline points=" 9630,1395 9626,1591 11291,1800 11295,2295" clip-path="url(#cp27)"
+<polyline points=" 2925,1395 2925,1575 1260,1845 1260,2385" clip-path="url(#cp27)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 11295,2295 -->
-<polygon points=" 11248,2051 11295,2275 11338,2050 11293,2095 11248,2051"
+<!-- Forward arrow to point 1260,2385 -->
+<polygon points=" 1215,2140 1260,2365 1305,2140 1260,2185 1215,2140"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
 <defs>
 <clipPath id="cp28">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 7650,2050 7605,2095 7560,2050 7587,2313 7623,2313z
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 9497,4615 9451,4660 9407,4615 9432,4878 9468,4878z
                M 873,3277 893,3240 930,3260 862,3092 842,3098z"/>
 </clipPath>
 </defs>
-<polyline points=" 9270,1395 9270,1575 7605,1800 7605,2295" clip-path="url(#cp28)"
+<polyline points=" 9456,4005 9450,4860" clip-path="url(#cp28)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 7605,2295 -->
-<polygon points=" 7560,2050 7605,2275 7650,2050 7605,2095 7560,2050"
+<!-- Forward arrow to point 9450,4860 -->
+<polygon points=" 9407,4615 9450,4840 9497,4615 9451,4660 9407,4615"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
 <defs>
 <clipPath id="cp29">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 9495,790 9450,835 9405,790 9432,1053 9468,1053z
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 9495,2185 9450,2230 9405,2185 9432,2448 9468,2448z
                M 873,3277 893,3240 930,3260 862,3092 842,3098z"/>
 </clipPath>
 </defs>
-<polyline points=" 9450,360 9450,1035" clip-path="url(#cp29)"
+<polyline points=" 9450,-405 9450,2430" clip-path="url(#cp29)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 9450,1035 -->
-<polygon points=" 9405,790 9450,1015 9495,790 9450,835 9405,790"
+<!-- Forward arrow to point 9450,2430 -->
+<polygon points=" 9405,2185 9450,2410 9495,2185 9450,2230 9405,2185"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
 <defs>
 <clipPath id="cp30">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 2970,4660 2925,4705 2880,4660 2907,4923 2943,4923z
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 3150,790 3105,835 3060,790 3087,1053 3123,1053z
                M 873,3277 893,3240 930,3260 862,3092 842,3098z"/>
 </clipPath>
 </defs>
-<polyline points=" 1260,3870 1260,4185 2925,4545 2925,4905" clip-path="url(#cp30)"
+<polyline points=" 3105,630 3105,1035" clip-path="url(#cp30)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 2925,4905 -->
-<polygon points=" 2880,4660 2925,4885 2970,4660 2925,4705 2880,4660"
+<!-- Forward arrow to point 3105,1035 -->
+<polygon points=" 3060,790 3105,1015 3150,790 3105,835 3060,790"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
 <defs>
 <clipPath id="cp31">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 3336,4660 3291,4705 3246,4660 3273,4923 3309,4923z
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 3150,25 3105,70 3060,25 3087,288 3123,288z
                M 873,3277 893,3240 930,3260 862,3092 842,3098z"/>
 </clipPath>
 </defs>
-<polyline points=" 4956,3870 4956,4185 3291,4545 3291,4905" clip-path="url(#cp31)"
+<polyline points=" 3105,-405 3105,270" clip-path="url(#cp31)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 3291,4905 -->
-<polygon points=" 3246,4660 3291,4885 3336,4660 3291,4705 3246,4660"
+<!-- Forward arrow to point 3105,270 -->
+<polygon points=" 3060,25 3105,250 3150,25 3105,70 3060,25"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
 <defs>
 <clipPath id="cp32">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 3150,790 3105,835 3060,790 3087,1053 3123,1053z
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 1690,8460 1735,8505 1690,8550 1953,8523 1953,8487z
                M 873,3277 893,3240 930,3260 862,3092 842,3098z"/>
 </clipPath>
 </defs>
-<polyline points=" 3105,360 3105,1035" clip-path="url(#cp32)"
+<polyline points=" 0,8505 1935,8505" clip-path="url(#cp32)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 3105,1035 -->
-<polygon points=" 3060,790 3105,1015 3150,790 3105,835 3060,790"
+<!-- Forward arrow to point 1935,8505 -->
+<polygon points=" 1690,8550 1915,8505 1690,8460 1735,8505 1690,8550"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
 <defs>
 <clipPath id="cp33">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 4995,2140 4950,2185 4905,2140 4932,2403 4968,2403z
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 3580,9225 3625,9270 3580,9315 3843,9288 3843,9252z
                M 873,3277 893,3240 930,3260 862,3092 842,3098z"/>
 </clipPath>
 </defs>
-<polyline points=" 3285,1395 3285,1575 4950,1845 4950,2385" clip-path="url(#cp33)"
+<polyline points=" 2295,8685 2880,9270 3825,9270" clip-path="url(#cp33)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 4950,2385 -->
-<polygon points=" 4905,2140 4950,2365 4995,2140 4950,2185 4905,2140"
+<!-- Forward arrow to point 3825,9270 -->
+<polygon points=" 3580,9315 3805,9270 3580,9225 3625,9270 3580,9315"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
 <defs>
 <clipPath id="cp34">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 1305,2140 1260,2185 1215,2140 1242,2403 1278,2403z
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 6640,7290 6685,7335 6640,7380 6903,7353 6903,7317z
                M 873,3277 893,3240 930,3260 862,3092 842,3098z"/>
 </clipPath>
 </defs>
-<polyline points=" 2925,1395 2925,1575 1260,1845 1260,2385" clip-path="url(#cp34)"
+<polyline points=" 5580,7335 6885,7335" clip-path="url(#cp34)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 1260,2385 -->
-<polygon points=" 1215,2140 1260,2365 1305,2140 1260,2185 1215,2140"
+<!-- Forward arrow to point 6885,7335 -->
+<polygon points=" 6640,7380 6865,7335 6640,7290 6685,7335 6640,7380"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Line -->
 <defs>
 <clipPath id="cp35">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 2005,7605 2050,7650 2005,7695 2268,7668 2268,7632z
+       <path clip-rule="evenodd" d="M -33,-438 H 12024 V 10518 H -33 z
+               M 1815,8049 1822,8112 1759,8120 1983,8260 2005,8232z
                M 873,3277 893,3240 930,3260 862,3092 842,3098z"/>
 </clipPath>
 </defs>
-<polyline points=" 315,7650 2250,7650" clip-path="url(#cp35)"
+<polyline points=" 2790,585 135,1350 135,6795 1980,8235" clip-path="url(#cp35)"
        stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 2250,7650 -->
-<polygon points=" 2005,7695 2230,7650 2005,7605 2050,7650 2005,7695"
-       stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
-<!-- Line -->
-<defs>
-<clipPath id="cp36">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 6955,6435 7000,6480 6955,6525 7218,6498 7218,6462z
-               M 873,3277 893,3240 930,3260 862,3092 842,3098z"/>
-</clipPath>
-</defs>
-<polyline points=" 6075,6480 7200,6480" clip-path="url(#cp36)"
-       stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 7200,6480 -->
-<polygon points=" 6955,6525 7180,6480 6955,6435 7000,6480 6955,6525"
-       stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
-<!-- Line -->
-<defs>
-<clipPath id="cp37">
-       <path clip-rule="evenodd" d="M 237,327 H 12363 V 9618 H 237 z
-               M 3895,8370 3940,8415 3895,8460 4158,8433 4158,8397z
-               M 873,3277 893,3240 930,3260 862,3092 842,3098z"/>
-</clipPath>
-</defs>
-<polyline points=" 2610,7830 3195,8415 4140,8415" clip-path="url(#cp37)"
-       stroke="#000000" stroke-width="30px" stroke-linejoin="round"/>
-<!-- Forward arrow to point 4140,8415 -->
-<polygon points=" 3895,8460 4120,8415 3895,8370 3940,8415 3895,8460"
+<!-- Forward arrow to point 1980,8235 -->
+<polygon points=" 1759,8120 1964,8223 1815,8049 1822,8112 1759,8120"
        stroke="#000000" stroke-width="8px" stroke-miterlimit="8" fill="#000000"/>
 <!-- Text -->
-<g transform="translate(12240,3060) rotate(-90)" >
-<text xml:space="preserve" x="0" y="0" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="108" text-anchor="middle">past</text>
-</g><!-- Text -->
-<g transform="translate(10440,3060) rotate(-90)" >
-<text xml:space="preserve" x="0" y="0" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="108" text-anchor="middle">future</text>
-</g><!-- Text -->
-<g transform="translate(8550,3060) rotate(-90)" >
-<text xml:space="preserve" x="0" y="0" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="108" text-anchor="middle">past</text>
-</g><!-- Text -->
-<g transform="translate(6750,3060) rotate(-90)" >
-<text xml:space="preserve" x="0" y="0" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="108" text-anchor="middle">future</text>
-</g><!-- Text -->
 <text xml:space="preserve" x="9450" y="5130" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">Oldest</text>
 <!-- Text -->
 <g transform="translate(405,3060) rotate(-90)" >
 <!-- Text -->
 <text xml:space="preserve" x="3195" y="5715" fill="#000000" font-family="Courier" font-style="normal" font-weight="bold" font-size="120" text-anchor="start">runqueue-depth</text>
 <!-- Text -->
-<text xml:space="preserve" x="9450" y="3600" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="144" text-anchor="middle">Time-based</text>
-<!-- Text -->
-<text xml:space="preserve" x="9450" y="3780" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="144" text-anchor="middle">Wait queues</text>
-<!-- Text -->
-<text xml:space="preserve" x="9000" y="4005" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="144" text-anchor="start">- 1 global</text>
-<!-- Text -->
-<text xml:space="preserve" x="9000" y="4185" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="144" text-anchor="start">- 1 per thread</text>
-<!-- Text -->
 <text xml:space="preserve" x="3105" y="3600" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="144" text-anchor="middle">Priority-based</text>
 <!-- Text -->
 <text xml:space="preserve" x="3105" y="3780" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="144" text-anchor="middle">Run queues</text>
 <!-- Text -->
-<text xml:space="preserve" x="2655" y="4005" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="144" text-anchor="start">- 1 global</text>
-<!-- Text -->
 <text xml:space="preserve" x="2655" y="4185" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="144" text-anchor="start">- 1 per thread</text>
 <!-- Text -->
-<text xml:space="preserve" x="3240" y="585" fill="#000000" font-family="Courier" font-style="normal" font-weight="bold" font-size="120" text-anchor="start">task_wakeup()</text>
-<!-- Text -->
-<text xml:space="preserve" x="9585" y="630" fill="#000000" font-family="Courier" font-style="normal" font-weight="bold" font-size="120" text-anchor="start">task_schedule()</text>
+<text xml:space="preserve" x="3105" y="495" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">TASK_RT ?</text>
 <!-- Text -->
-<text xml:space="preserve" x="9585" y="450" fill="#000000" font-family="Courier" font-style="normal" font-weight="bold" font-size="120" text-anchor="start">task_queue()</text>
+<text xml:space="preserve" x="3195" y="765" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="108" text-anchor="start">No</text>
 <!-- Text -->
-<text xml:space="preserve" x="315" y="7560" fill="#000000" font-family="Courier" font-style="normal" font-weight="bold" font-size="120" text-anchor="start">tasklet_wakeup()</text>
+<text xml:space="preserve" x="2430" y="585" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="108" text-anchor="end">Yes</text>
 <!-- Text -->
-<text xml:space="preserve" x="12285" y="7515" fill="#000000" font-family="Courier" font-style="normal" font-weight="bold" font-size="120" text-anchor="end">t-&gt;process()</text>
+<text xml:space="preserve" x="0" y="8415" fill="#000000" font-family="Courier" font-style="normal" font-weight="bold" font-size="120" text-anchor="start">tasklet_wakeup()</text>
 <!-- Text -->
-<text xml:space="preserve" x="12285" y="7335" fill="#ff0000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="144" text-anchor="end">Run!</text>
+<text xml:space="preserve" x="9720" y="8370" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="108" text-anchor="start">37%</text>
 <!-- Text -->
-<text xml:space="preserve" x="10035" y="7515" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="108" text-anchor="start">37%</text>
+<text xml:space="preserve" x="9765" y="9810" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="108" text-anchor="start">=1</text>
 <!-- Text -->
-<text xml:space="preserve" x="10080" y="8955" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="108" text-anchor="start">=1</text>
+<text xml:space="preserve" x="9720" y="7650" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="108" text-anchor="start">50%</text>
 <!-- Text -->
-<text xml:space="preserve" x="5085" y="6255" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="120" text-anchor="middle">(accessed using atomic ops)</text>
+<text xml:space="preserve" x="9720" y="9090" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="108" text-anchor="start">13%</text>
 <!-- Text -->
-<text xml:space="preserve" x="10035" y="6795" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="108" text-anchor="start">50%</text>
-<!-- Text -->
-<text xml:space="preserve" x="10035" y="8235" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="108" text-anchor="start">13%</text>
-<!-- Text -->
-<g transform="translate(2745,8100) rotate(-90)" >
+<g transform="translate(2430,8955) rotate(-90)" >
 <text xml:space="preserve" x="0" y="0" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="108" text-anchor="end">Yes</text>
 </g><!-- Text -->
-<g transform="translate(2520,7650) rotate(-90)" >
+<g transform="translate(2205,8505) rotate(-90)" >
 <text xml:space="preserve" x="0" y="0" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">Local ?</text>
 </g><!-- Text -->
-<g transform="translate(2700,7110) rotate(-90)" >
+<g transform="translate(2385,7965) rotate(-90)" >
 <text xml:space="preserve" x="0" y="0" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="108" text-anchor="start">No</text>
 </g><!-- Text -->
-<text xml:space="preserve" x="4725" y="8460" fill="#000000" font-family="Courier" font-style="normal" font-weight="bold" font-size="120" text-anchor="start">TASK_SELF_WAKING</text>
+<text xml:space="preserve" x="4410" y="9675" fill="#000000" font-family="Courier" font-style="normal" font-weight="bold" font-size="120" text-anchor="start">TASK_HEAVY</text>
+<!-- Text -->
+<text xml:space="preserve" x="5715" y="10305" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="144" text-anchor="middle">5 class-based tasklet queues per thread (one accessible from remote threads)</text>
+<!-- Text -->
+<text xml:space="preserve" x="9675" y="6345" fill="#ff0000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="start">Scan</text>
+<!-- Text -->
+<text xml:space="preserve" x="9675" y="6525" fill="#ff0000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="start">order</text>
 <!-- Text -->
-<text xml:space="preserve" x="4725" y="8820" fill="#000000" font-family="Courier" font-style="normal" font-weight="bold" font-size="120" text-anchor="start">TASK_HEAVY</text>
+<text xml:space="preserve" x="9765" y="6885" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="108" text-anchor="start">=1</text>
 <!-- Text -->
-<text xml:space="preserve" x="4725" y="8010" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="120" text-anchor="start">(default)</text>
+<text xml:space="preserve" x="4275" y="9405" fill="#000000" font-family="Courier" font-style="normal" font-weight="bold" font-size="120" text-anchor="start">TASK_SELF_WAKING</text>
 <!-- Text -->
-<text xml:space="preserve" x="4725" y="7650" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="120" text-anchor="start">In I/O or signals</text>
+<text xml:space="preserve" x="4455" y="8730" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="120" text-anchor="start">In I/O or signals</text>
 <!-- Text -->
-<g transform="translate(10815,7695) rotate(-90)" >
+<text xml:space="preserve" x="4455" y="8370" fill="#000000" font-family="Courier" font-style="normal" font-weight="bold" font-size="120" text-anchor="start">TASK_RT</text>
+<!-- Text -->
+<text xml:space="preserve" x="4455" y="9045" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="120" text-anchor="start">(default)</text>
+<!-- Text -->
+<text xml:space="preserve" x="9585" y="-45" fill="#000000" font-family="Courier" font-style="normal" font-weight="bold" font-size="120" text-anchor="start">task_schedule()</text>
+<!-- Text -->
+<text xml:space="preserve" x="3240" y="-45" fill="#000000" font-family="Courier" font-style="normal" font-weight="bold" font-size="120" text-anchor="start">task_wakeup()</text>
+<!-- Text -->
+<text xml:space="preserve" x="9585" y="-225" fill="#000000" font-family="Courier" font-style="normal" font-weight="bold" font-size="120" text-anchor="start">task_queue()</text>
+<!-- Text -->
+<text xml:space="preserve" x="11970" y="8055" fill="#000000" font-family="Courier" font-style="normal" font-weight="bold" font-size="120" text-anchor="end">t-&gt;process()</text>
+<!-- Text -->
+<text xml:space="preserve" x="11970" y="7875" fill="#ff0000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="144" text-anchor="end">Run!</text>
+<!-- Text -->
+<g transform="translate(10500,8235) rotate(-90)" >
 <text xml:space="preserve" x="0" y="0" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">Most Urgent</text>
 </g><!-- Text -->
-<text xml:space="preserve" x="9990" y="6480" fill="#ff0000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="start">order</text>
+<text xml:space="preserve" x="2160" y="2160" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">tasks</text>
 <!-- Text -->
-<text xml:space="preserve" x="9990" y="6300" fill="#ff0000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="start">Scan</text>
+<text xml:space="preserve" x="2160" y="2340" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">(locked)</text>
 <!-- Text -->
-<text xml:space="preserve" x="6030" y="9450" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="144" text-anchor="middle">5 class-based tasklet queues per thread (one accessible from remote threads)</text>
-<!-- Line -->
-<polygon points=" 7234,6838 9776,6838 9776,6398 7234,6398" fill="#dae8fc"/>
-<!-- Line -->
-<polygon points=" 7234,7558 9776,7558 9776,7118 7234,7118" fill="#dae8fc"/>
+<text xml:space="preserve" x="2160" y="1980" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="120" text-anchor="middle">Shared</text>
+<!-- Text -->
+<text xml:space="preserve" x="2655" y="4005" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="bold" font-size="144" text-anchor="start">- 1 per tgrp</text>
 <!-- Line -->
-<polygon points=" 7234,8278 9776,8278 9776,7838 7234,7838" fill="#dae8fc"/>
+<polygon points=" 6919,7693 9461,7693 9461,7253 6919,7253" fill="#dae8fc"/>
 <!-- Line -->
-<polygon points=" 7234,8998 9776,8998 9776,8558 7234,8558" fill="#dae8fc"/>
+<polygon points=" 6919,6928 9461,6928 9461,6488 6919,6488" fill="#dae8fc"/>
 <!-- Line -->
 <defs>
-<polygon points=" 4166,6838 6094,6838 6094,6398 4166,6398" id="p24"/>
-<pattern id="tile24" patternUnits="userSpaceOnUse"
+<polygon points=" 3671,7693 5599,7693 5599,7253 3671,7253" id="p12"/>
+<pattern id="tile12" patternUnits="userSpaceOnUse"
        x="0" y="0" width="134" height="67">
 <g stroke-width="7.5" stroke="#a7ceb3" fill="none">
 <path d="M -7,30 73,70 M 61,-3 141,37 M -7,37 73,-3 M 61,70 141,30"/>
 </g>
 </pattern>
 </defs>
-<use xlink:href="#p24" fill="#bbf2e2"/>
-<use xlink:href="#p24" fill="url(#tile24)"/>
+<use xlink:href="#p12" fill="#bbf2e2"/>
+<use xlink:href="#p12" fill="url(#tile12)"/>
 <!-- Line -->
-<polyline points=" 7234,6398 9776,6398 9776,6838 7234,6838"
-       stroke="#458dba" stroke-width="45px"/>
+<polygon points=" 6919,8413 9461,8413 9461,7973 6919,7973" fill="#dae8fc"/>
 <!-- Line -->
-<polyline points=" 7234,7118 9776,7118 9776,7558 7234,7558"
+<polygon points=" 6919,9133 9461,9133 9461,8693 6919,8693" fill="#dae8fc"/>
+<!-- Line -->
+<polygon points=" 6919,9853 9461,9853 9461,9413 6919,9413" fill="#dae8fc"/>
+<!-- Line -->
+<polyline points=" 6919,7253 9461,7253 9461,7693 6919,7693"
        stroke="#458dba" stroke-width="45px"/>
 <!-- Line -->
-<polyline points=" 7234,8558 9776,8558 9776,8998 7234,8998"
+<polyline points=" 6919,6488 9461,6488 9461,6928 6919,6928"
        stroke="#458dba" stroke-width="45px"/>
 <!-- Line -->
-<polyline points=" 4166,6398 6094,6398 6094,6838 4166,6838"
+<polyline points=" 3671,7253 5599,7253 5599,7693 3671,7693"
        stroke="#868286" stroke-width="45px"/>
 <!-- Line -->
-<polyline points=" 7234,7838 9776,7838 9776,8278 7234,8278"
+<polyline points=" 6919,7973 9461,7973 9461,8413 6919,8413"
        stroke="#458dba" stroke-width="45px"/>
 <!-- Line -->
-<polyline points=" 9613,6398 9613,6838"
+<polyline points=" 6919,9413 9461,9413 9461,9853 6919,9853"
+       stroke="#458dba" stroke-width="45px"/>
+<!-- Line -->
+<polyline points=" 6919,8693 9461,8693 9461,9133 6919,9133"
+       stroke="#458dba" stroke-width="45px"/>
+<!-- Line -->
+<polyline points=" 9298,7253 9298,7693"
        stroke="#458dba" stroke-width="15px"/>
 <!-- Line -->
-<polyline points=" 9438,6398 9438,6838"
+<polyline points=" 9123,7253 9123,7693"
        stroke="#458dba" stroke-width="15px"/>
 <!-- Line -->
-<polyline points=" 9264,6398 9264,6838"
+<polyline points=" 8949,7253 8949,7693"
        stroke="#458dba" stroke-width="15px"/>
 <!-- Line -->
-<polyline points=" 9613,7118 9613,7558"
+<polyline points=" 9298,6488 9298,6928"
        stroke="#458dba" stroke-width="15px"/>
 <!-- Line -->
-<polyline points=" 9438,7118 9438,7558"
+<polyline points=" 9123,6488 9123,6928"
        stroke="#458dba" stroke-width="15px"/>
 <!-- Line -->
-<polyline points=" 9264,7118 9264,7558"
+<polyline points=" 8949,6488 8949,6928"
        stroke="#458dba" stroke-width="15px"/>
 <!-- Line -->
-<polyline points=" 9613,7838 9613,8278"
+<polyline points=" 5428,7253 5428,7693"
+       stroke="#868286" stroke-width="15px"/>
+<!-- Line -->
+<polyline points=" 5253,7253 5253,7693"
+       stroke="#868286" stroke-width="15px"/>
+<!-- Line -->
+<polyline points=" 5079,7253 5079,7693"
+       stroke="#868286" stroke-width="15px"/>
+<!-- Line -->
+<polyline points=" 9298,7973 9298,8413"
        stroke="#458dba" stroke-width="15px"/>
 <!-- Line -->
-<polyline points=" 9438,7838 9438,8278"
+<polyline points=" 9123,7973 9123,8413"
        stroke="#458dba" stroke-width="15px"/>
 <!-- Line -->
-<polyline points=" 9264,7838 9264,8278"
+<polyline points=" 8949,7973 8949,8413"
        stroke="#458dba" stroke-width="15px"/>
 <!-- Line -->
-<polyline points=" 9613,8558 9613,8998"
+<polyline points=" 9298,8693 9298,9133"
        stroke="#458dba" stroke-width="15px"/>
 <!-- Line -->
-<polyline points=" 9438,8558 9438,8998"
+<polyline points=" 9123,8693 9123,9133"
        stroke="#458dba" stroke-width="15px"/>
 <!-- Line -->
-<polyline points=" 9264,8558 9264,8998"
+<polyline points=" 8949,8693 8949,9133"
        stroke="#458dba" stroke-width="15px"/>
 <!-- Line -->
-<polyline points=" 5923,6398 5923,6838"
-       stroke="#868286" stroke-width="15px"/>
+<polyline points=" 9298,9413 9298,9853"
+       stroke="#458dba" stroke-width="15px"/>
 <!-- Line -->
-<polyline points=" 5748,6398 5748,6838"
-       stroke="#868286" stroke-width="15px"/>
+<polyline points=" 9123,9413 9123,9853"
+       stroke="#458dba" stroke-width="15px"/>
 <!-- Line -->
-<polyline points=" 5574,6398 5574,6838"
-       stroke="#868286" stroke-width="15px"/>
+<polyline points=" 8949,9413 8949,9853"
+       stroke="#458dba" stroke-width="15px"/>
+<!-- Text -->
+<text xml:space="preserve" x="8145" y="7560" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="192" text-anchor="middle">TL_URGENT</text>
 <!-- Text -->
-<text xml:space="preserve" x="8460" y="6705" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="192" text-anchor="middle">TL_URGENT</text>
+<text xml:space="preserve" x="8145" y="6795" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="192" text-anchor="middle">TL_RT</text>
 <!-- Text -->
-<text xml:space="preserve" x="8460" y="7425" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="192" text-anchor="middle">TL_NORMAL</text>
+<text xml:space="preserve" x="4455" y="7560" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="192" text-anchor="middle">SHARED</text>
 <!-- Text -->
-<text xml:space="preserve" x="8460" y="8145" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="192" text-anchor="middle">TL_BULK</text>
+<text xml:space="preserve" x="8145" y="8280" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="192" text-anchor="middle">TL_NORMAL</text>
 <!-- Text -->
-<text xml:space="preserve" x="8460" y="8865" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="192" text-anchor="middle">TL_HEAVY</text>
+<text xml:space="preserve" x="8145" y="9000" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="192" text-anchor="middle">TL_BULK</text>
 <!-- Text -->
-<text xml:space="preserve" x="4950" y="6705" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="192" text-anchor="middle">SHARED</text>
+<text xml:space="preserve" x="8145" y="9720" fill="#000000" font-family="AvantGarde" font-style="normal" font-weight="normal" font-size="192" text-anchor="middle">TL_HEAVY</text>
 </g>
 </svg>
index 1f1d92e8e57e8960a8b81c31f1f03cb55beade3a..e5ca44535a1ec3dbfbfd06e81f5feb396644a77b 100644 (file)
@@ -47,10 +47,11 @@ struct thread_set {
 
 /* tasklet classes */
 enum {
-       TL_URGENT = 0,   /* urgent tasklets (I/O callbacks) */
-       TL_NORMAL = 1,   /* normal tasks */
-       TL_BULK   = 2,   /* bulk task/tasklets, streaming I/Os */
-       TL_HEAVY  = 3,   /* heavy computational tasklets (e.g. TLS handshakes) */
+       TL_RT     = 0,   /* rare but time-sensitive wakeups (e.g. stats collection) */
+       TL_URGENT = 1,   /* urgent tasklets (I/O callbacks) */
+       TL_NORMAL = 2,   /* normal tasks */
+       TL_BULK   = 3,   /* bulk task/tasklets, streaming I/Os */
+       TL_HEAVY  = 4,   /* heavy computational tasklets (e.g. TLS handshakes) */
        TL_CLASSES       /* must be last */
 };
 
index 055f26d221c3e90cb2f72fe2f634822d399a35d2..0c7f5b8fd4b2822c7e870f4581070a95e94e2a87 100644 (file)
@@ -147,6 +147,10 @@ void __tasklet_wakeup_here(struct tasklet *tl)
                LIST_APPEND(&th_ctx->tasklets[TL_HEAVY], &tl->list);
                th_ctx->tl_class_mask |= 1 << TL_HEAVY;
        }
+       else if (unlikely(tl->state & TASK_RT)) {
+               LIST_APPEND(&th_ctx->tasklets[TL_RT], &tl->list);
+               th_ctx->tl_class_mask |= 1 << TL_RT;
+       }
        else if (tl->state & TASK_SELF_WAKING) {
                LIST_APPEND(&th_ctx->tasklets[TL_BULK], &tl->list);
                th_ctx->tl_class_mask |= 1 << TL_BULK;
@@ -501,7 +505,8 @@ unsigned int run_tasks_from_lists(unsigned int budgets[])
                                 * budget to run them. Let's switch to it now.
                                 */
                                queue = (th_ctx->tl_class_mask & 1) ? 0 :
-                                       (th_ctx->tl_class_mask & 2) ? 1 : 2;
+                                       (th_ctx->tl_class_mask & 2) ? 1 :
+                                       (th_ctx->tl_class_mask & 4) ? 2 : 3;
                                continue;
                        }
 
@@ -713,6 +718,7 @@ void process_runnable_tasks()
        struct eb32_node *grq; // next global run queue entry
        struct task *t;
        const unsigned int default_weights[TL_CLASSES] = {
+               [TL_RT]     = 1,  // never more than 1 RT task at once
                [TL_URGENT] = 64, // ~50% of CPU bandwidth for I/O
                [TL_NORMAL] = 60, // ~47% of CPU bandwidth for tasks
                [TL_BULK]   = 4,  // ~3% of CPU bandwidth for self-wakers
@@ -724,6 +730,7 @@ void process_runnable_tasks()
        unsigned int queue;
        int max_processed;
        int lpicked, gpicked;
+       int rt_queued = 0;
        int heavy_queued = 0;
        int budget, done;
 
@@ -751,6 +758,16 @@ void process_runnable_tasks()
  not_done_yet:
        max[TL_URGENT] = max[TL_NORMAL] = max[TL_BULK] = 0;
 
+       /* RT tasklets list may be processed at most once */
+       if (!rt_queued) {
+               if ((tt->tl_class_mask & (1 << TL_RT))) {
+                       max[TL_RT] = default_weights[TL_RT];
+                       rt_queued = 1;
+               }
+               else
+                       max[TL_RT] = 0;
+       }
+
        /* urgent tasklets list gets a default weight of ~50% */
        if ((tt->tl_class_mask & (1 << TL_URGENT)) ||
            !MT_LIST_ISEMPTY(&tt->shared_tasklet_list))
@@ -785,13 +802,17 @@ void process_runnable_tasks()
         * a first MT_LIST_ISEMPTY() to succeed for thread_has_task() and the
         * one above to finally fail. This is extremely rare and not a problem.
         */
-       max_total = max[TL_URGENT] + max[TL_NORMAL] + max[TL_BULK] + max[TL_HEAVY];
+       max_total = max[TL_RT] + max[TL_URGENT] + max[TL_NORMAL] + max[TL_BULK] + max[TL_HEAVY];
        if (!max_total)
                goto leave;
 
        for (queue = 0; queue < TL_CLASSES; queue++)
                max[queue]  = ((unsigned)max_processed * max[queue] + max_total - 1) / max_total;
 
+       /* The RT queue must never process more than one task at once */
+       if (max[TL_RT] > 1)
+               max[TL_RT] = 1;
+
        /* The heavy queue must never process more than very few tasks at once
         * anyway. We set the limit to 1 if running on low_latency scheduling,
         * given that we know that other values can have an impact on latency
@@ -819,7 +840,7 @@ void process_runnable_tasks()
        /* Note: the grq lock is always held when grq is not null */
        lpicked = gpicked = 0;
        budget = max[TL_NORMAL] - tt->tasks_in_list;
-       while (lpicked + gpicked < budget) {
+       while (lpicked + gpicked < budget && (!rt_queued || !(global.tune.options & GTUNE_SCHED_LOW_LATENCY))) {
                if (!eb_is_empty(&th_ctx->rqueue_shared) && !grq) {
 #ifdef USE_THREAD
                        HA_SPIN_LOCK(TASK_RQ_LOCK, &th_ctx->rqsh_lock);
@@ -899,7 +920,7 @@ void process_runnable_tasks()
        max_processed -= done;
 
        /* some tasks may have woken other ones up */
-       if (done && max_processed > 0 && thread_has_tasks())
+       if (done && max_processed > 0 && !rt_queued && thread_has_tasks())
                goto not_done_yet;
 
  leave: