/// <summary>Drop Packet and clear owner reference. /// Note: Java will not reclaim the space until after all references /// to this packet have been cleared - ideally, one should not use this /// knowledge, but bright people probably will! /// </summary> public void Drop(Packet p) { CheckOwner(p); Interlocked.Increment(ref Network.drops); p.ClearOwner(); p.Dispose(); }
/// <summary>The send function. See OutputPort.send. /// </summary> //UPGRADE_NOTE: Synchronized keyword was removed from method 'send'. Lock expression was added. 'ms-help://MS.VSCC/commoner/redir/redirect.htm?keyword="jlca1027"' internal bool Send(Packet packet, OutputPort op) { lock (this) { if (packet == null) { throw new System.ArgumentException(); } _sender = op._sender; if (IsClosed()) { return(false); } //_sender._mother.Trace(Name + ": Sending: " + packet); if (IsEmpty()) { System.Threading.Monitor.PulseAll(this); } while (IsFull()) { if (_dropOldest) { Packet p = _buffer.Take(); Interlocked.Increment(ref Network.dropOlds); _sender._mother.Trace("{0}: DropOldest", _sender.Name); } else { _sender.Status = Component.States.SuspSend; _sender._mother.Trace("{0}: Send/susp", _sender.Name); try { System.Threading.Monitor.Wait(this); } catch (System.Threading.ThreadInterruptedException e) { //UPGRADE_NOTE: Exception 'java.lang.ThreadDeath' was converted to ' ' which has different behavior. 'ms-help://MS.VSCC/commoner/redir/redirect.htm?keyword="jlca1100"' // throw new System.ApplicationException(); IndicateOneSenderClosed(); FlowError.Complain(_sender._name + ": interrupted"); // unreachable code return(false); } // if (Component._network._deadlock) //{ // _sender._thread.Interrupt(); // _sender._mother.Trace(_sender._name + ": Send interrupted because of deadlock"); // // unreachable code // return false; // } _sender = op._sender; _sender.Status = Component.States.Active; _sender._mother.Trace("{0}: Send/resume", _sender.Name); } } if (IsClosed()) { _sender._mother.Trace("{0}: Send/close", _sender.Name); //Interlocked.Increment(ref Network.sends); return(false); } //lock ((_receiver._inputPorts as ICollection).SyncRoot) try { Monitor.Enter(_receiver._lockObject); packet.ClearOwner(); _buffer.Put(packet); if (_receiver.Status == Component.States.Dormant || _receiver.Status == Component.States.NotStarted) { _receiver.Activate(); } else { System.Threading.Monitor.PulseAll(this); } _sender._network._active = true; _sender = null; } catch (ThreadInterruptedException e) { return(false); } finally { Monitor.Exit(_receiver._lockObject); } Interlocked.Increment(ref Network.sends); return(true); } }
/// <summary>The send function. See OutputPort.send. /// </summary> //UPGRADE_NOTE: Synchronized keyword was removed from method 'send'. Lock expression was added. 'ms-help://MS.VSCC/commoner/redir/redirect.htm?keyword="jlca1027"' internal bool Send(Packet packet, OutputPort op) { lock (this) { if (packet == null) throw new System.ArgumentException(); _sender = op._sender; if (IsClosed()) { return false; } //_sender._mother.Trace(Name + ": Sending: " + packet); if (IsEmpty()) System.Threading.Monitor.PulseAll(this); while (IsFull()) { if (_dropOldest) { Packet p = _buffer.Take(); Interlocked.Increment(ref Network.dropOlds); _sender._mother.Trace("{0}: DropOldest", _sender.Name); } else { _sender.Status = Component.States.SuspSend; _sender._mother.Trace("{0}: Send/susp", _sender.Name); try { System.Threading.Monitor.Wait(this); } catch (System.Threading.ThreadInterruptedException e) { //UPGRADE_NOTE: Exception 'java.lang.ThreadDeath' was converted to ' ' which has different behavior. 'ms-help://MS.VSCC/commoner/redir/redirect.htm?keyword="jlca1100"' // throw new System.ApplicationException(); IndicateOneSenderClosed(); FlowError.Complain(_sender._name + ": interrupted"); // unreachable code return false; } // if (Component._network._deadlock) //{ // _sender._thread.Interrupt(); // _sender._mother.Trace(_sender._name + ": Send interrupted because of deadlock"); // // unreachable code // return false; // } _sender = op._sender; _sender.Status = Component.States.Active; _sender._mother.Trace("{0}: Send/resume", _sender.Name); } } if (IsClosed()) { _sender._mother.Trace("{0}: Send/close", _sender.Name); //Interlocked.Increment(ref Network.sends); return false; } //lock ((_receiver._inputPorts as ICollection).SyncRoot) try { Monitor.Enter(_receiver._lockObject); packet.ClearOwner(); _buffer.Put(packet); if (_receiver.Status == Component.States.Dormant || _receiver.Status == Component.States.NotStarted) _receiver.Activate(); else System.Threading.Monitor.PulseAll(this); _sender._network._active = true; _sender = null; } catch (ThreadInterruptedException e) { return false; } finally { Monitor.Exit(_receiver._lockObject); } Interlocked.Increment(ref Network.sends); return true; } }