Xo is experimental. The source code is not public yet; it will be soon. Read the release notes
Menu · XO0804

Docs

XO0804: value read in one `Mutex.with` is written back in a later one

warning · reported by the checker

Warning. A value read (or derived) inside one m.with(...) is used inside a later m.with(...) on the same mutex, or a branch on it decides whether the later one runs. Another task may change the state between the two sections (check then act), so the write can overwrite a newer value. Do the read and the write in one with. See core 5.4.

Example

struct B { n: Int }

fn bump(m: Mutex[Map[Str, B]]) {
  let b = m.with(fn(s) { s.get("k") ?? B{n: 0} })
  m.with(fn(var s) { s.put("k", b with {n: b.n + 1}) })
}

Fix

struct B { n: Int }

fn bump(m: Mutex[Map[Str, B]]) {
  m.with(fn(var s) {
    let b = s.get("k") ?? B{n: 0}
    s.put("k", b with {n: b.n + 1})
  })
}

Run xo explain XO0804 for this text in a terminal, or see section 10.6 of the specification.