Figure shows
the memory-block free function.
Line 6 gets a pointer to this thread's pool, and
line 7 checks to see if this per-thread pool is full.
If so, lines 8-15 empty half of the per-thread pool into the global pool, with lines 8 and 14 acquiring and releasing the spinlock. Lines 9-12 implement the loop moving blocks from the local to the global pool, and line 13 sets the per-thread pool's count to the proper value.
In either case, line 16 then places the newly freed block into the per-thread pool.