Mercurial > hg > Gears > Gears
annotate src/parallel_execution/DebugWorker/state_db.c @ 1015:e6778c866876
add DebugWorker and DebugTaskManager
author | Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 18 Jan 2022 19:54:28 +0900 |
parents | |
children |
rev | line source |
---|---|
1015
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 #include <stdlib.h> |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 #include "state_db.h" |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 #include "memory.h" |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 StateDB |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 create_stateDB() |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 { |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 StateDB s = (StateDB)malloc(sizeof(StateNode)); |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 if (!s) die_exit("Cann't alloc state db node."); |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 return s; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 } |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 static MemoryPtr mem_db; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 static int state_count0; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 void |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 reset_state_count() |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 { |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 state_count0 = 0; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 } |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 int |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 state_count() |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 { |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 return state_count0; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 } |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31 /* |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 lookup_StateDB(struct state *s, StateDB *parent, StatePtr *out) |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
34 |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35 s->memory points the real memory |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36 if s is new, it is copied in the database (parent). |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37 if s is in the database, existing state is returned. |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38 |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 if return value is 0, it returns new state. |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 if out is null, no copy_state is created. (lookup mode) |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41 |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 Founded state or newly created state is returned in out. |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
44 */ |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
45 |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 int |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 lookup_StateDB(StateDB s, StateDB *parent, StateDB *out) |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
48 { |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
49 StateDB db; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
50 int r; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
51 |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
52 while(1) { |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
53 db = *parent; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
54 if (!db) { |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
55 /* not found */ |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
56 if (out) { |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
57 db = create_stateDB(); |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
58 db->left = db->right = 0; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
59 db->memory = copy_memory(s->memory,&mem_db); |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
60 db->hash = s->hash; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
61 state_count0 ++; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
62 *parent = db; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 *out = db; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
64 } |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
65 return 0; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
66 } |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
67 if (s->hash == db->hash) { |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
68 r = cmp_memory(s->memory,db->memory); |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
69 } else |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
70 r = (s->hash > db->hash)? 1 : -1; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
71 if(!r) { |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
72 /* bingo */ |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
73 if (out) *out = db; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
74 return 1; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
75 } else if (r>0) { |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
76 parent = &db->left; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
77 } else if (r<0) { |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
78 parent = &db->right; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
79 } |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
80 } |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
81 } |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
82 |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
83 int |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
84 visit_StateDB(StateDB s, StateDB *parent, StateDB* out, int visit) |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
85 { |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
86 int exists = lookup_StateDB(s,parent,out); |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
87 if (!exists) return 0; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
88 if ((*out)->visit >= visit) { |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
89 return 1; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
90 } |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
91 (*out)->visit = visit; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
92 return 0; |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
93 } |
e6778c866876
add DebugWorker and DebugTaskManager
Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
94 /* end */ |