internal void Write(byte[] b, int offset, int len)
{
do {
lock (thisLock) {
int alen = Allocate (len);
int length = Math.Min (buffer.Length - end, alen);
Array.Copy (b, offset, buffer, end, length);
end = (end + length) % buffer.Length;
if (length < alen) {
Array.Copy (b, offset + length, buffer, 0, alen - length);
end += alen - length;
}
dataEvent.Set ();
len -= alen;
offset += alen;
}
} while (len > 0);
}