[threading] Introduce a pair of states to handle native suspend.
commit17896b090222c9831a0333000fe1612f7cfa47ec
authorRodrigo Kumpera <kumpera@gmail.com>
Mon, 2 Feb 2015 16:04:37 +0000 (2 11:04 -0500)
committerRodrigo Kumpera <kumpera@gmail.com>
Wed, 25 Mar 2015 17:49:38 +0000 (25 13:49 -0400)
treec963b172a520e64a4d06d9e6d7a33dbd3d7c6de0
parentae58b3085a24a992505c89e25a040d6a39a7eff0
[threading] Introduce a pair of states to handle native suspend.

Native code should not normally be in runnable state. That's reserved only for managed code. In theory.
In practice any code that can witness the managed heap must be in the runnable state.

This in practice means all runtime code (icalls) and embeders. Right now lets focus on the runtime side.

The solution for this is to wrap all calls that could lead to unbound suspension in code that coordinates
with the GC - most syscalls that can block. This is realized with a pair of additional thread states.

1)Blocking: This the state where the runtime is doing something that can potentially block. The suspend count
will be > 0 if the current thread is suspended. In practice it won't suspend, just wait on resume.

2)Blocking and suspended: When leaving the blocking state, if the thread has a pending suspend, we transition
to this state while waiting for resume.
mono/utils/mono-threads-state-machine.c
mono/utils/mono-threads.c
mono/utils/mono-threads.h