Definition blocked_at_external (state : cm_state) (ef : external_function) :=
match state with
(m, (tr, sch, tp)) =>
exists j cntj sch' c args,
sch = j :: sch' /\
@getThreadC _ _ _ j tp cntj = Kblocked c /\
cl_at_external c = Some (ef, args)
end.
Definition state_bupd P (state : cm_state) := let '(m, (tr, sch, tp)) := state in
tp_bupd (fun tp' => P (m, (tr, sch, tp'))) tp.

Lemma join_all_eq : forall (tp : jstate ge) phi phi', join_all tp phi -> join_all tp phi' ->
(getThreadsR tp = nil /\ getLocksR tp = nil /\ identity phi /\ identity phi') \/ phi = phi'.