The choice of where a thread scheduling algorithm preempts one thread
in order to execute another is essential to reveal concurrency errors
such as atomicity violations, livelocks, and deadlocks. We present a
scheduling strategy called preemption sealing that controls
where and when a scheduler is disabled from preempting threads
during program execution. We demonstrate that this strategy is
effective in addressing two key problems in testing industrial-scale
concurrent programs: (1) tolerating existing errors in order to
find more errors, and (2) compositional testing of layered, concurrent
systems. We evaluate the effectiveness of preemption sealing,
implemented in the CHESS tool, for these two scenarios on newly
released concurrency libraries for Microsoft’s .NET framework.