source: libcfa/src/bits/multi_list.cfa@ 54f89d5

ADT arm-eh ast-experimental enum forall-pointer-decay jacob/cs343-translation new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since 54f89d5 was 4f649cb, checked in by Peter A. Buhr <pabuhr@…>, 5 years ago

print task id rather than task address for multi-list test

  • Property mode set to 100644
File size: 2.7 KB
Line 
1#include <fstream.hfa>
2#include <stdlib.hfa>
3#include "sequence.hfa"
4#include "queue.hfa"
5#include "stack.hfa"
6
7struct Task; // node type
8
9struct TaskDL {
10 inline Seqable;
11 Task & node;
12};
13void ?{}( TaskDL & this, Task & task ) with( this ) {
14 ((Seqable &)this){};
15 &node = &task; // pointer to containing node
16}
17Task & task( TaskDL & this ) with( this ) { // getter routine for containing node
18 return node;
19}
20
21struct TaskSL {
22 inline Colable;
23 Task & node;
24};
25void ?{}( TaskSL & this, Task & task ) with( this ) {
26 ((Colable &)this){};
27 &node = &task; // pointer to containing node
28}
29Task & task( TaskSL & this ) with( this ) { // getter routine for containing node
30 return node;
31}
32
33struct Task {
34 TaskDL clusterRef; // list of tasks on cluster
35 TaskDL readyRef; // list of tasks on ready queue
36 TaskSL mutexRef; // list of tasks on mutex queue
37 int id;
38};
39void ?{}( Task & this, int id ) with( this ) {
40 ((TaskDL &)clusterRef){ this };
41 ((TaskDL &)readyRef){ this };
42 ((TaskSL &)mutexRef){ this };
43 this.id = id;
44}
45
46int main() {
47 Sequence(TaskDL) clustList, readyList; // task lists
48 Queue(TaskSL) mutexList;
49 enum { Lnth = 10 };
50
51 for ( id; Lnth ) {
52 Task & task = *new( id ); // create task node
53 addHead( clustList, task.clusterRef ); // insert on lists in opposite directions
54 addTail( readyList, task.readyRef );
55 addHead( mutexList, task.mutexRef );
56 }
57
58 SeqIter(TaskDL) sqiter;
59 TaskDL & dl;
60 TaskSL & sl;
61
62 sout | nlOff;
63 for ( over( sqiter, clustList ); sqiter >> dl; ) { // print lists
64 Task & tmp = task( dl ); sout | tmp.id;
65 // sout | task( dl ).id;
66 }
67 sout | nl;
68 for ( over( sqiter, readyList ); sqiter >> dl; ) {
69 Task & tmp = task( dl ); sout | tmp.id;
70 // sout | task( dl ).id;
71 }
72 sout | nl;
73 for ( QueueIter(TaskSL) qiter = { mutexList }; qiter >> sl; ) { // print lists
74 Task & tmp = task( sl ); sout | tmp.id;
75 // sout | task( sl ).id;
76 }
77 sout | nl;
78 for ( Lnth ) { // remove nodes from clustList. mutexList
79 dropHead( clustList );
80 drop( mutexList );
81 }
82 // Simultaneous deletion only safe if all nodes are traversed in same direction.
83 for ( Lnth ) { // remove nodes from readyList and safe to delete nodes
84 delete( &task( dropHead( readyList ) ) );
85 }
86
87 // Re-purpose Seqable as Colable
88 Stack(TaskDL) mutexStack;
89 for ( id; Lnth ) {
90 Task & task = *new( id ); // create task node
91 push( mutexStack, task.clusterRef ); // insert on lists in opposite directions
92 }
93 for ( StackIter(TaskDL) stiter = { mutexStack }; stiter >> dl; ) {
94 Task & tmp = task( dl ); sout | tmp.id;
95 // sout | task( dl ).id;
96 }
97 sout | nl;
98 for ( Lnth ) { // remove nodes from readyList and safe to delete nodes
99 delete( &task( pop( mutexStack ) ) );
100 }
101}
Note: See TracBrowser for help on using the repository browser.