Race-condition in Concurrent.Promise()->finalise()

Callbacks may get lost due to a race condition.


sequenceDiagram

  participant T1 as Thread 1
  participant P as Promise
  participant T2 as Thread 2

  T2->>P: success()
  Note right of P: success_cbs read.

  T1->>P: on_success()
  activate P
  Note right of P: success_cbs updated.

  P->>T1: returns
  deactivate P

  T2->>P: success() calls finalise()
  activate P
  Note right of P: Old success_cbs called.
  Note right of P: success_cbs cleared.

  P->>T2: returns
  deactivate P
  Note right of P: The callback installed by Thread 1 has been lost.