40 #define DEBUG_NAME "libtesla.state.update"
41 #define PRINT(...) DEBUG(libtesla.state.update, __VA_ARGS__)
46 const char *name,
const char *description,
53 for (uint32_t i = 0; i < trans->
length; i++)
57 assert(init_count < 2);
60 PRINT(
"\n====\n%s()\n", __func__);
61 PRINT(
" context: %s\n",
65 PRINT(
" class: %d ('%s')\n", class_id, name);
67 PRINT(
" transitions: ");
78 PRINT(
"store: 0x%tx\n", (intptr_t) store);
87 bool matched_something =
false;
90 bool cleanup_required =
false;
94 const size_t max_clones =
class->tc_free;
102 for (uint32_t i = 0; i <
class->tc_limit; i++) {
103 assert(class->tc_instances != NULL);
121 matched_something =
true;
129 if (cloned >= max_clones) {
131 ev_err(
class, err,
"too many clones");
135 struct clone_info *clone = clones + cloned++;
137 clone->transition = trigger;
138 matched_something =
true;
146 for (uint32_t j = 0; j <
class->tc_limit; j++) {
161 cleanup_required =
true;
165 for (
size_t i = 0; i < cloned; i++) {
166 struct clone_info *c = clones + i;
170 ev_err(
class, err,
"failed to clone instance");
175 new_name.
tk_mask &= c->transition->to_mask;
178 ev_err(
class, err,
"failed to union keys");
182 clone->
ti_state = c->transition->to;
184 ev_clone(
class, c->old, clone, c->transition);
192 for (uint32_t i = 0; i < trans->
length; i++) {
198 ev_err(
class, err,
"failed to create instance");
204 matched_something =
true;
209 if (!matched_something) {
212 if (class->tc_free == class->tc_limit)
220 if (cleanup_required)
234 assert(trigger != NULL);
245 for (
size_t i = 0; i < trans->
length; i++) {