Exemple #1
0
        private void ReadAsyncUnixMessage(object data)
        {
            ITransportHeaders       transportHeader;
            IClientChannelSinkStack clientChannelSinkStack = (IClientChannelSinkStack)data;
            UnixConnection          unixConnection         = (UnixConnection)clientChannelSinkStack.Pop(this);

            try
            {
                if (UnixMessageIO.ReceiveMessageStatus(unixConnection.Stream, unixConnection.Buffer) != MessageStatus.MethodMessage)
                {
                    throw new RemotingException("Unknown response message from server");
                }
                Stream stream = UnixMessageIO.ReceiveMessageStream(unixConnection.Stream, out transportHeader, unixConnection.Buffer);
                unixConnection.Release();
                unixConnection = null;
                clientChannelSinkStack.AsyncProcessResponse(transportHeader, stream);
            }
            catch
            {
                if (unixConnection != null)
                {
                    unixConnection.Release();
                }
                throw;
            }
        }
Exemple #2
0
        public void ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            UnixConnection connection = null;

            try
            {
                if (requestHeaders == null)
                {
                    requestHeaders = new TransportHeaders();
                }
                requestHeaders["__RequestUri"] = ((IMethodMessage)msg).Uri;
                connection = UnixConnectionPool.GetConnection(this._path);
                UnixMessageIO.SendMessageStream(connection.Stream, requestStream, requestHeaders, connection.Buffer);
                connection.Stream.Flush();
                if (UnixMessageIO.ReceiveMessageStatus(connection.Stream, connection.Buffer) != MessageStatus.MethodMessage)
                {
                    throw new RemotingException("Unknown response message from server");
                }
                responseStream = UnixMessageIO.ReceiveMessageStream(connection.Stream, out responseHeaders, connection.Buffer);
            }
            finally
            {
                if (connection != null)
                {
                    connection.Release();
                }
            }
        }
 public void ReleaseConnection(UnixConnection entry)
 {
     lock (_pool)
     {
         entry.ControlTime = DateTime.Now; // Initialize timeout
         _pool.Add(entry);
         Monitor.Pulse(_pool);
     }
 }
 private void CancelConnection(UnixConnection entry)
 {
     try
     {
         entry.Stream.Close();
         _activeConnections--;
     }
     catch
     {
     }
 }
        public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg,
                                        ITransportHeaders headers, Stream requestStream)
        {
            UnixConnection connection = null;
            bool           isOneWay   = RemotingServices.IsOneWay(((IMethodMessage)msg).MethodBase);

            try
            {
                if (headers == null)
                {
                    headers = new TransportHeaders();
                }
                headers ["__RequestUri"] = ((IMethodMessage)msg).Uri;

                // Sends the stream using a connection from the pool
                // and creates a WorkItem that will wait for the
                // response of the server

                connection = UnixConnectionPool.GetConnection(_path);
                UnixMessageIO.SendMessageStream(connection.Stream, requestStream, headers, connection.Buffer);
                connection.Stream.Flush();

                if (!isOneWay)
                {
                    sinkStack.Push(this, connection);
                    ThreadPool.QueueUserWorkItem(new WaitCallback(data =>
                    {
                        try {
                            ReadAsyncUnixMessage(data);
                        }
                        catch {}
                    }), sinkStack);
                }
                else
                {
                    connection.Release();
                }
            }
            catch
            {
                if (connection != null)
                {
                    connection.Release();
                }
                if (!isOneWay)
                {
                    throw;
                }
            }
        }
 private UnixConnection CreateConnection()
 {
     try
     {
         ReusableUnixClient client = new ReusableUnixClient(_path);
         UnixConnection     entry  = new UnixConnection(this, client);
         _activeConnections++;
         return(entry);
     }
     catch (Exception ex)
     {
         throw new RemotingException(ex.Message);
     }
 }
        public UnixConnection GetConnection()
        {
            UnixConnection connection = null;

            lock (_pool)
            {
                do
                {
                    if (_pool.Count > 0)
                    {
                        // There are available connections

                        connection = (UnixConnection)_pool[_pool.Count - 1];
                        _pool.RemoveAt(_pool.Count - 1);
                        if (!connection.IsAlive)
                        {
                            CancelConnection(connection);
                            connection = null;
                            continue;
                        }
                    }

                    if (connection == null && _activeConnections < UnixConnectionPool.MaxOpenConnections)
                    {
                        // No connections available, but the max connections
                        // has not been reached yet, so a new one can be created
                        // Create the connection outside the lock
                        break;
                    }

                    // No available connections in the pool
                    // Wait for somewone to release one.

                    if (connection == null)
                    {
                        Monitor.Wait(_pool);
                    }
                }while (connection == null);
            }

            if (connection == null)
            {
                return(CreateConnection());
            }
            else
            {
                return(connection);
            }
        }
        private UnixConnection CreateConnection()
        {
            UnixConnection unixConnection;

            try
            {
                UnixConnection unixConnection1 = new UnixConnection(this, new ReusableUnixClient(this._path));
                this._activeConnections++;
                unixConnection = unixConnection1;
            }
            catch (Exception exception)
            {
                throw new RemotingException(exception.Message);
            }
            return(unixConnection);
        }
 public void PurgeConnections()
 {
     lock (_pool)
     {
         for (int n = 0; n < _pool.Count; n++)
         {
             UnixConnection entry = (UnixConnection)_pool[n];
             if ((DateTime.Now - entry.ControlTime).TotalSeconds > UnixConnectionPool.KeepAliveSeconds)
             {
                 CancelConnection(entry);
                 _pool.RemoveAt(n);
                 n--;
             }
         }
     }
 }
        public void ReleaseConnection(UnixConnection entry)
        {
            ArrayList arrayLists = this._pool;

            Monitor.Enter(arrayLists);
            try
            {
                entry.ControlTime = DateTime.Now;
                this._pool.Add(entry);
                Monitor.Pulse(this._pool);
            }
            finally
            {
                Monitor.Exit(arrayLists);
            }
        }
        public UnixConnection GetConnection()
        {
            UnixConnection item       = null;
            ArrayList      arrayLists = this._pool;

            Monitor.Enter(arrayLists);
            try
            {
                do
                {
                    if (this._pool.Count > 0)
                    {
                        item = (UnixConnection)this._pool[this._pool.Count - 1];
                        this._pool.RemoveAt(this._pool.Count - 1);
                        if (!item.IsAlive)
                        {
                            this.CancelConnection(item);
                            item = null;
                            continue;
                        }
                    }
                    if (item != null || this._activeConnections >= UnixConnectionPool.MaxOpenConnections)
                    {
                        if (item != null)
                        {
                            continue;
                        }
                        Monitor.Wait(this._pool);
                    }
                    else
                    {
                        break;
                    }
                }while (item == null);
            }
            finally
            {
                Monitor.Exit(arrayLists);
            }
            if (item != null)
            {
                return(item);
            }
            return(this.CreateConnection());
        }
Exemple #12
0
        private void ReadAsyncUnixMessage(object data)
        {
            // This method is called by a new thread to asynchronously
            // read the response to a request

            // The stack was provided as state data in QueueUserWorkItem
            IClientChannelSinkStack stack = (IClientChannelSinkStack)data;

            // The first sink in the stack is this sink. Pop it and
            // get the status data, which is the UnixConnection used to send
            // the request
            UnixConnection connection = (UnixConnection)stack.Pop(this);

            try
            {
                ITransportHeaders responseHeaders;

                // Read the response, blocking if necessary
                MessageStatus status = UnixMessageIO.ReceiveMessageStatus(connection.Stream, connection.Buffer);

                if (status != MessageStatus.MethodMessage)
                {
                    throw new RemotingException("Unknown response message from server");
                }

                Stream responseStream = UnixMessageIO.ReceiveMessageStream(connection.Stream, out responseHeaders, connection.Buffer);

                // Free the connection, so it can be reused
                connection.Release();
                connection = null;

                // Ok, proceed with the other sinks
                stack.AsyncProcessResponse(responseHeaders, responseStream);
            }
            catch
            {
                if (connection != null)
                {
                    connection.Release();
                }
                throw;
            }
        }
        public void PurgeConnections()
        {
            ArrayList arrayLists = this._pool;

            Monitor.Enter(arrayLists);
            try
            {
                for (int i = 0; i < this._pool.Count; i++)
                {
                    UnixConnection item = (UnixConnection)this._pool[i];
                    if ((DateTime.Now - item.ControlTime).TotalSeconds > (double)UnixConnectionPool.KeepAliveSeconds)
                    {
                        this.CancelConnection(item);
                        this._pool.RemoveAt(i);
                        i--;
                    }
                }
            }
            finally
            {
                Monitor.Exit(arrayLists);
            }
        }
Exemple #14
0
        public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg, ITransportHeaders headers, Stream requestStream)
        {
            UnixConnection connection = null;
            bool           flag       = RemotingServices.IsOneWay(((IMethodMessage)msg).MethodBase);

            try
            {
                if (headers == null)
                {
                    headers = new TransportHeaders();
                }
                headers["__RequestUri"] = ((IMethodMessage)msg).Uri;
                connection = UnixConnectionPool.GetConnection(this._path);
                UnixMessageIO.SendMessageStream(connection.Stream, requestStream, headers, connection.Buffer);
                connection.Stream.Flush();
                if (flag)
                {
                    connection.Release();
                }
                else
                {
                    sinkStack.Push(this, connection);
                    ThreadPool.QueueUserWorkItem(new WaitCallback(this.ReadAsyncUnixMessage), sinkStack);
                }
            }
            catch
            {
                if (connection != null)
                {
                    connection.Release();
                }
                if (!flag)
                {
                    throw;
                }
            }
        }
Exemple #15
0
		private void CancelConnection(UnixConnection entry)
		{
			try
			{
				entry.Stream.Close();
				_activeConnections--;
			}
			catch
			{
			}
		}
Exemple #16
0
		public void ReleaseConnection (UnixConnection entry)
		{
			lock (_pool)
			{
				entry.ControlTime = DateTime.Now;	// Initialize timeout
				_pool.Add (entry);
				Monitor.Pulse (_pool);
			}
		}
Exemple #17
0
		private UnixConnection CreateConnection()
		{
			try
			{
				ReusableUnixClient client = new ReusableUnixClient (_path);
				UnixConnection entry = new UnixConnection(this, client);
				_activeConnections++;
				return entry;
			}
			catch (Exception ex)
			{
				throw new RemotingException (ex.Message);
			}
		}