Initially a block starts out as completely type 3 bytes, just garbage data waiting to be written to. Then something writes into the pipe and bytes are stored into this free space, and the 'Used' variable is set to show how much of the available buffer is used. At this point we have type 2 and type 3 bytes in the block. The buffer can fill up completely in which case Used == Size and there are no type 3 bytes left. Also at some point something can start reading bytes out of the block which causes the 'Next' value to be increased, at which point the block starts with 'Next' bytes of type 1. Crystal?