- Thread *blocking = (Thread *)curr->get_location();
- ModelAction *act = get_last_action(blocking->get_id());
- curr->synchronize_with(act);
- synchronized = true;
+ Thread *waiting, *blocking;
+ waiting = get_thread(curr);
+ blocking = (Thread *)curr->get_location();
+ if (!blocking->is_complete()) {
+ blocking->push_wait_list(curr);
+ scheduler->sleep(waiting);
+ } else {
+ do_complete_join(curr);
+ updated = true; /* trigger rel-seq checks */
+ }