public void PushPacket(Bytes packet) { DebugPrint("Pushing packet\n"); using (thisLock.Lock()) { byteCount += packet.Length; VectorQueueByte incomingPacketQueue = packetContainer.Acquire(); incomingPacketQueue.AddTail(packet); packetContainer.Release(incomingPacketQueue); } }
private AutoResetEvent AddPendingRequest(IPv4 address, TimeSpan timeout, EthernetAddress localMac, Bytes header, Bytes buffer, IAdapter adapter ) { PendingArpRequest pendingRequest = (PendingArpRequest)pendingRequestsFreelist.Dequeue(); VTable.Assert(pendingRequest != null); pendingRequest.address = address; pendingRequest.active = true; pendingRequest.localMac = localMac; pendingRequest.adapter = adapter; VectorQueueByte txBuffer = pendingRequest.txContainer.Acquire(); txBuffer.AddTail(header); txBuffer.AddTail(buffer); pendingRequest.txContainer.Release(txBuffer); using (pendingRequestsLock.Lock()) { pendingRequests.Enqueue(pendingRequest); } SchedulerTime expiration = SchedulerTime.Now; expiration = expiration.Add(timeout); pendingRequest.requestExpiration = expiration; //poke the wait thread if (pendingRequests.Count == 1) { arpHandle.Set(); } return(pendingRequest.requestEvent); }