also called on the sending threads, so it needs to be guarded