From: Vladimir T. <vtz...@gm...> - 2008-11-20 22:35:00
|
On Nov 21, 2008, at 12:14 AM, Sam Steingold wrote: > Vladimir, > why in lock_threads() you use begin_system_call instead of > begin_blocking_system_call? > I would think that, of all system calls, xmutex_lock is the most > likely to block! Because of GC and thread suspending. In order to perform GC - two locks should be acquired: 1. heap spinlock - so nobody can allocate new object (and thus probably cause again GC). 2. threads lock - while waiting for all threads to get suspended at safe points - we do not want new thread(s) to be spawned. There are 3 places where lock_threads() is used without possibly blocking "enclosure": 1. In gc_suspend_all_threads() - after we already own the heap lock - in order to prevent new threads spawning. 2. suspend_thread() - in order to be sure that the thread will not exit while we try to suspend it (or it already has exited) - here more elegant solution is possible but did not want to add additional locks. 3. delete_thread() - it is called from a thread that terminates or for a thread that will never be started. The first thing that delete_thread() does is to ensure that anybody interested in this particular thread (and those are the two functions for above - suspending) - will consider it as already suspended - so even if we block here - it will not cause any harm to the GC. All other places enclose the lock_threads() in begin_blocking_call(). Vladimir |