Example #1
0
 /// <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();
 }
Example #2
0
        /// <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);
            }
        }
Example #3
0
        /// <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;
            }
        }