Yowza, you aren't kidding. mark_buffers_unused() and free_unused_buffers() are a minute each in a three minute-and-change run.
Here's the SPARC disassembly of the heaviest parts (the for loop overhead was 18 seconds each): 89. /* Tentatively unused, unless it's a constant */ 90. if (!(string_array[i].flags & BUFFER_constant_FLAG)) { 0.130 0.130 [ 90] b92c4: ld [%fp - 12], %l2 3.950 3.950 [ 90] b92c8: ld [%fp - 8], %l0 8.860 8.860 [ 90] b92cc: sll %l0, 5, %l1 3.970 3.970 [ 90] b92d0: add %l2, %l1, %l0 0.110 0.110 [ 90] b92d4: ld [%l0 + 8], %l0 ## 21.660 21.660 [ 90] b92d8: and %l0, 128, %l0 4.090 4.090 [ 90] b92dc: cmp %l0, %g0 0. 0. [ 90] b92e0: bne 0xb930c 0. 0. [ 90] b92e4: nop 175. /* If it's not live or on the free list, put it on the free list */ 176. if (!(string_array[i].flags & (BUFFER_live_FLAG | 177. BUFFER_on_free_list_FLAG))) { 0.120 0.120 [177] b966c: ld [%fp - 12], %l2 4.050 4.050 [177] b9670: ld [%fp - 8], %l0 8.300 8.300 [177] b9674: sll %l0, 5, %l1 4.240 4.240 [177] b9678: add %l2, %l1, %l0 0.170 0.170 [177] b967c: ld [%l0 + 8], %l0 ## 20.740 20.740 [177] b9680: and %l0, 80, %l0 4.350 4.350 [177] b9684: cmp %l0, %g0 0. 0. [177] b9688: bne 0xb96bc 0. 0. [177] b968c: nop -- Bryan C. Warnock [EMAIL PROTECTED]