public void HandleEdgeSend(Edge from, ICopyable p) {
if(_ploss_prob > 0) {
lock(_rand) {
if(_rand.NextDouble() < _ploss_prob) {
return;
}
}
}
MemBlock mb = p as MemBlock;
if(mb == null) {
lock(_sync) {
int offset = p.CopyTo(_ba.Buffer, _ba.Offset);
mb = MemBlock.Reference(_ba.Buffer, _ba.Offset, offset);
_ba.AdvanceBuffer(offset);
}
}
SimulationEdge se_from = (SimulationEdge)from;
SimulationEdge se_to = se_from.Partner;
if(se_to != null) {
se_to.Push(mb);
}
}
}