Пример #1
0
        public void DropReference(Internal.ConsumerBase consumer)
        {
            if (consumer == null)
            {
                return;
            }

            Reference reference;

            try
            {
                m_consumerTableLock.AcquireReaderLock(-1);
                if (!m_consumerTable.TryGetValue(consumer, out reference))
                {
                    return;
                }
                int result = System.Threading.Interlocked.Decrement(ref reference.references);
                if (result == 0)
                {
                    m_consumerTableLock.UpgradeToWriterLock(-1);
                    m_consumerTable.Remove(consumer);
                    reference.handle.Free();
                }
            }
            finally
            {
                m_consumerTableLock.ReleaseLock();
            }
        }
Пример #2
0
        public System.IntPtr AddReference(Internal.ConsumerBase consumer)
        {
            if (consumer == null)
            {
                return(System.IntPtr.Zero);
            }

            Reference reference;

            m_consumerTableLock.AcquireReaderLock(System.Threading.Timeout.Infinite);
            try
            {
                if (!m_consumerTable.TryGetValue(consumer, out reference))
                {
                    System.Threading.LockCookie lockCookie = m_consumerTableLock.UpgradeToWriterLock(System.Threading.Timeout.Infinite);
                    try
                    {
                        reference = new Reference(GCHandle.Alloc(consumer));
                        m_consumerTable.Add(consumer, reference);
                    }
                    finally
                    {
                        m_consumerTableLock.DowngradeFromWriterLock(ref lockCookie);
                    }
                }
                System.Threading.Interlocked.Increment(ref reference.references);
            }
            finally
            {
                m_consumerTableLock.ReleaseReaderLock();
            }
            return(GCHandle.ToIntPtr(reference.handle));
        }
Пример #3
0
        private static void OnDropReference(System.IntPtr consumer,
                                            System.Int32 refCounter,
                                            out byte success)
        {
            success = Interface.ByteOf(false);
            try
            {
                Internal.ConsumerBase consumerBase = ConsumerHandler.ToConsumer(consumer);

                for (System.Int32 i = 0; i < refCounter; ++i)
                {
                    ConsumerHandler.Instance.DropReference(consumerBase);
                }
                success = Interface.ByteOf(true);
            }
            catch (System.Exception exc)
            {
                Typesystem.LibraryExceptions.Instance.Set(exc);
            }
        }