public long Write(byte[] val) { var len = val.Length; var ret = free.Count > 0 ? free.Pop() : list.CreateItem(); var pos = CreateItem(len); var itm = list[ret]; itm->Position = pos; itm->Length = len; var w = GetWriter(); if (w.Position != pos) { w.Position = pos; } w.Write(val, 0, val.Length); w.Flush(); poolWriters.ReleaseInstance(w); return(ret); }
// Записываем буфер internal long WriteBuffer(long key, byte[] val) { long pos; var ret = 0l; // Режим обновления if (key > 0) { var itm = list[key]; // Обновление if (itm->Length == val.Length) { ret = key; pos = itm->Position; goto write; } // Удаление старого массива list.Remove(key); } var len = val.Length; // Такая сложность связанна с необходимостью повторного использования удаленных или свободных записей в каталоге ret = list.CreateItem(len, out pos); if (pos == 0) { pos = CreateItem(len); var itm = list[ret]; itm->Position = pos; itm->Length = len; } write: var w = GetWriter(); if (w.Position != pos) { w.Position = pos; } w.Write(val, 0, val.Length); w.Flush(); poolWriters.ReleaseInstance(w); //Debug.WriteLine("Write pos:" + pos + ", len:" + val.Length); return(ret); }