Exemplo n.º 1
0
        public unsafe static void UnregisterChannel(IChannel chnl)
        {
            bool flag = false;

            RuntimeHelpers.PrepareConstrainedRegions();
            try
            {
                Monitor.Enter(ChannelServices.s_channelLock, ref flag);
                if (chnl != null)
                {
                    RegisteredChannelList registeredChannelList = ChannelServices.s_registeredChannels;
                    int num = registeredChannelList.FindChannelIndex(chnl);
                    if (-1 == num)
                    {
                        throw new RemotingException(Environment.GetResourceString("Remoting_ChannelNotRegistered", new object[]
                        {
                            chnl.ChannelName
                        }));
                    }
                    RegisteredChannel[] registeredChannels = registeredChannelList.RegisteredChannels;
                    RegisteredChannel[] array           = new RegisteredChannel[registeredChannels.Length - 1];
                    IChannelReceiver    channelReceiver = chnl as IChannelReceiver;
                    if (channelReceiver != null)
                    {
                        channelReceiver.StopListening(null);
                    }
                    int num2 = 0;
                    int i    = 0;
                    while (i < registeredChannels.Length)
                    {
                        if (i == num)
                        {
                            i++;
                        }
                        else
                        {
                            array[num2] = registeredChannels[i];
                            num2++;
                            i++;
                        }
                    }
                    if (ChannelServices.perf_Contexts != null)
                    {
                        ChannelServices.perf_Contexts->cChannels--;
                    }
                    ChannelServices.s_registeredChannels = new RegisteredChannelList(array);
                }
                ChannelServices.RefreshChannelData();
            }
            finally
            {
                if (flag)
                {
                    Monitor.Exit(ChannelServices.s_channelLock);
                }
            }
        }
Exemplo n.º 2
0
        public static unsafe void UnregisterChannel(IChannel chnl)
        {
            bool lockTaken = false;

            RuntimeHelpers.PrepareConstrainedRegions();
            try
            {
                Monitor.Enter(ChannelServices.s_channelLock, ref lockTaken);
                if (chnl != null)
                {
                    RegisteredChannelList registeredChannelList = ChannelServices.s_registeredChannels;
                    int channelIndex = registeredChannelList.FindChannelIndex(chnl);
                    if (-1 == channelIndex)
                    {
                        throw new RemotingException(Environment.GetResourceString("Remoting_ChannelNotRegistered", (object)chnl.ChannelName));
                    }
                    RegisteredChannel[] registeredChannels = registeredChannelList.RegisteredChannels;
                    RegisteredChannel[] channels           = new RegisteredChannel[registeredChannels.Length - 1];
                    IChannelReceiver    channelReceiver    = chnl as IChannelReceiver;
                    if (channelReceiver != null)
                    {
                        channelReceiver.StopListening((object)null);
                    }
                    int index1 = 0;
                    int index2 = 0;
                    while (index2 < registeredChannels.Length)
                    {
                        if (index2 == channelIndex)
                        {
                            ++index2;
                        }
                        else
                        {
                            channels[index1] = registeredChannels[index2];
                            ++index1;
                            ++index2;
                        }
                    }
                    if ((IntPtr)ChannelServices.perf_Contexts != IntPtr.Zero)
                    {
                        --ChannelServices.perf_Contexts->cChannels;
                    }
                    ChannelServices.s_registeredChannels = new RegisteredChannelList(channels);
                }
                ChannelServices.RefreshChannelData();
            }
            finally
            {
                if (lockTaken)
                {
                    Monitor.Exit(ChannelServices.s_channelLock);
                }
            }
        }
Exemplo n.º 3
0
        internal static unsafe void RegisterChannelInternal(IChannel chnl, bool ensureSecurity)
        {
            if (chnl == null)
            {
                throw new ArgumentNullException("chnl");
            }
            bool lockTaken = false;

            RuntimeHelpers.PrepareConstrainedRegions();
            try
            {
                Monitor.Enter(ChannelServices.s_channelLock, ref lockTaken);
                string channelName = chnl.ChannelName;
                RegisteredChannelList registeredChannelList = ChannelServices.s_registeredChannels;
                if (channelName == null || channelName.Length == 0 || -1 == registeredChannelList.FindChannelIndex(chnl.ChannelName))
                {
                    if (ensureSecurity)
                    {
                        ISecurableChannel securableChannel = chnl as ISecurableChannel;
                        if (securableChannel != null)
                        {
                            securableChannel.IsSecured = ensureSecurity;
                        }
                        else
                        {
                            throw new RemotingException(Environment.GetResourceString("Remoting_Channel_CannotBeSecured", (object)(chnl.ChannelName ?? chnl.ToString())));
                        }
                    }
                    RegisteredChannel[] registeredChannels = registeredChannelList.RegisteredChannels;
                    RegisteredChannel[] channels           = registeredChannels != null ? new RegisteredChannel[registeredChannels.Length + 1] : new RegisteredChannel[1];
                    if (!ChannelServices.unloadHandlerRegistered && !(chnl is CrossAppDomainChannel))
                    {
                        AppDomain.CurrentDomain.DomainUnload   += new EventHandler(ChannelServices.UnloadHandler);
                        ChannelServices.unloadHandlerRegistered = true;
                    }
                    int channelPriority = chnl.ChannelPriority;
                    int index;
                    for (index = 0; index < registeredChannels.Length; ++index)
                    {
                        RegisteredChannel registeredChannel = registeredChannels[index];
                        if (channelPriority > registeredChannel.Channel.ChannelPriority)
                        {
                            channels[index] = new RegisteredChannel(chnl);
                            break;
                        }
                        channels[index] = registeredChannel;
                    }
                    if (index == registeredChannels.Length)
                    {
                        channels[registeredChannels.Length] = new RegisteredChannel(chnl);
                    }
                    else
                    {
                        for (; index < registeredChannels.Length; ++index)
                        {
                            channels[index + 1] = registeredChannels[index];
                        }
                    }
                    if ((IntPtr)ChannelServices.perf_Contexts != IntPtr.Zero)
                    {
                        ++ChannelServices.perf_Contexts->cChannels;
                    }
                    ChannelServices.s_registeredChannels = new RegisteredChannelList(channels);
                    ChannelServices.RefreshChannelData();
                }
                else
                {
                    throw new RemotingException(Environment.GetResourceString("Remoting_ChannelNameAlreadyRegistered", (object)chnl.ChannelName));
                }
            }
            finally
            {
                if (lockTaken)
                {
                    Monitor.Exit(ChannelServices.s_channelLock);
                }
            }
        }
Exemplo n.º 4
0
        internal unsafe static void RegisterChannelInternal(IChannel chnl, bool ensureSecurity)
        {
            if (chnl == null)
            {
                throw new ArgumentNullException("chnl");
            }
            bool flag = false;

            RuntimeHelpers.PrepareConstrainedRegions();
            try
            {
                Monitor.Enter(ChannelServices.s_channelLock, ref flag);
                string channelName = chnl.ChannelName;
                RegisteredChannelList registeredChannelList = ChannelServices.s_registeredChannels;
                if (channelName != null && channelName.Length != 0 && -1 != registeredChannelList.FindChannelIndex(chnl.ChannelName))
                {
                    throw new RemotingException(Environment.GetResourceString("Remoting_ChannelNameAlreadyRegistered", new object[]
                    {
                        chnl.ChannelName
                    }));
                }
                if (ensureSecurity)
                {
                    ISecurableChannel securableChannel = chnl as ISecurableChannel;
                    if (securableChannel == null)
                    {
                        throw new RemotingException(Environment.GetResourceString("Remoting_Channel_CannotBeSecured", new object[]
                        {
                            chnl.ChannelName ?? chnl.ToString()
                        }));
                    }
                    securableChannel.IsSecured = ensureSecurity;
                }
                RegisteredChannel[] registeredChannels = registeredChannelList.RegisteredChannels;
                RegisteredChannel[] array;
                if (registeredChannels == null)
                {
                    array = new RegisteredChannel[1];
                }
                else
                {
                    array = new RegisteredChannel[registeredChannels.Length + 1];
                }
                if (!ChannelServices.unloadHandlerRegistered && !(chnl is CrossAppDomainChannel))
                {
                    AppDomain.CurrentDomain.DomainUnload   += ChannelServices.UnloadHandler;
                    ChannelServices.unloadHandlerRegistered = true;
                }
                int channelPriority = chnl.ChannelPriority;
                int i;
                for (i = 0; i < registeredChannels.Length; i++)
                {
                    RegisteredChannel registeredChannel = registeredChannels[i];
                    if (channelPriority > registeredChannel.Channel.ChannelPriority)
                    {
                        array[i] = new RegisteredChannel(chnl);
                        break;
                    }
                    array[i] = registeredChannel;
                }
                if (i == registeredChannels.Length)
                {
                    array[registeredChannels.Length] = new RegisteredChannel(chnl);
                }
                else
                {
                    while (i < registeredChannels.Length)
                    {
                        array[i + 1] = registeredChannels[i];
                        i++;
                    }
                }
                if (ChannelServices.perf_Contexts != null)
                {
                    ChannelServices.perf_Contexts->cChannels++;
                }
                ChannelServices.s_registeredChannels = new RegisteredChannelList(array);
                ChannelServices.RefreshChannelData();
            }
            finally
            {
                if (flag)
                {
                    Monitor.Exit(ChannelServices.s_channelLock);
                }
            }
        }