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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 */