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(); } }
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)); }
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); } }