예제 #1
0
        private void DisposeAll()
        {
            CollectOnce?.Invoke(this, new CollectArgs()
            {
                ObjectCount = _objQueue.Count
            });
#if FINALIZER_CHECK
            lock (_queueLock)
#endif
            {
#if FINALIZER_CHECK
                ValidateRefCount();
#endif
                IPyDisposable obj;
                while (_objQueue.TryDequeue(out obj))
                {
                    try
                    {
                        obj.Dispose();
                        Runtime.CheckExceptionOccurred();
                    }
                    catch (Exception e)
                    {
                        // We should not bother the main thread
                        ErrorHandler?.Invoke(this, new ErrorArgs()
                        {
                            Error = e
                        });
                    }
                }
            }
        }
예제 #2
0
        private void DisposeAll()
        {
            CollectOnce?.Invoke(this, new CollectArgs()
            {
                ObjectCount = _objQueue.Count
            });
#if FINALIZER_CHECK
            lock (_queueLock)
#endif
            {
#if FINALIZER_CHECK
                ValidateRefCount();
#endif
                IntPtr obj;
                Runtime.PyErr_Fetch(out var errType, out var errVal, out var traceback);

                try
                {
                    while (!_objQueue.IsEmpty)
                    {
                        if (!_objQueue.TryDequeue(out obj))
                        {
                            continue;
                        }

                        Runtime.XDecref(obj);
                        try
                        {
                            Runtime.CheckExceptionOccurred();
                        }
                        catch (Exception e)
                        {
                            var handler = ErrorHandler;
                            if (handler is null)
                            {
                                throw new FinalizationException(
                                          "Python object finalization failed",
                                          disposable: obj, innerException: e);
                            }

                            handler.Invoke(this, new ErrorArgs()
                            {
                                Error = e
                            });
                        }
                    }
                }
                finally
                {
                    // Python requires finalizers to preserve exception:
                    // https://docs.python.org/3/extending/newtypes.html#finalization-and-de-allocation
                    Runtime.PyErr_Restore(errType, errVal, traceback);
                }
            }
        }
예제 #3
0
        private void DisposeAll()
        {
            CollectOnce?.Invoke(this, new CollectArgs()
            {
                ObjectCount = _objQueue.Count
            });
            IDisposable obj;

            while (_objQueue.TryDequeue(out obj))
            {
                obj.Dispose();
            }
        }
예제 #4
0
        private void DisposeAll()
        {
            CollectOnce?.Invoke(this, new CollectArgs()
            {
                ObjectCount = _objQueue.Count
            });
#if FINALIZER_CHECK
            lock (_queueLock)
#endif
            {
#if FINALIZER_CHECK
                ValidateRefCount();
#endif
                IPyDisposable obj;
                while (_objQueue.TryDequeue(out obj))
                {
                    try
                    {
                        obj.Dispose();
                    }
                    catch (Exception e)
                    {
                        var handler = ErrorHandler;
                        if (handler is null)
                        {
                            throw new FinalizationException(
                                      "Python object finalization failed",
                                      disposable: obj, innerException: e);
                        }

                        handler.Invoke(this, new ErrorArgs()
                        {
                            Error = e
                        });
                    }
                }
            }
        }