obj_map(new HashTable<const void *, action_list_t, uintptr_t, 4>()),
obj_thrd_map(new HashTable<void *, std::vector<action_list_t>, uintptr_t, 4 >()),
promises(new std::vector<Promise *>()),
+ lazy_sync_with_release(new HashTable<void *, std::list<ModelAction *>, uintptr_t, 4>()),
thrd_last_action(new std::vector<ModelAction *>(1)),
node_stack(new NodeStack()),
next_backtrack(NULL),
delete (*promises)[i];
delete promises;
+ delete lazy_sync_with_release;
+
delete thrd_last_action;
delete node_stack;
delete scheduler;
bool complete;
complete = release_seq_head(rf, release_heads);
if (!complete) {
- /** @todo complete lazy checking */
+ /* add act to 'lazy checking' list */
+ std::list<ModelAction *> *list;
+ list = lazy_sync_with_release->get_safe_ptr(act->get_location());
+ list->push_back(act);
}
}
HashTable<void *, std::vector<action_list_t>, uintptr_t, 4 > *obj_thrd_map;
std::vector<Promise *> *promises;
+
+ /**
+ * Collection of lists of objects that might synchronize with one or
+ * more release sequence. Release sequences might be determined lazily
+ * as promises are fulfilled and modification orders are established.
+ * This structure maps its lists by object location. Each ModelAction
+ * in the lists should be an acquire operation.
+ */
+ HashTable<void *, std::list<ModelAction *>, uintptr_t, 4> *lazy_sync_with_release;
+
std::vector<ModelAction *> *thrd_last_action;
NodeStack *node_stack;
ModelAction *next_backtrack;