2022-05-23 00:16:32 +04:00

53 lines
1.7 KiB
Python

# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
import gc
import signal
import sys
import weakref
import pytest
from pyarrow import util
from pyarrow.tests.util import disabled_gc
def exhibit_signal_refcycle():
# Put an object in the frame locals and return a weakref to it.
# If `signal.getsignal` has a bug where it creates a reference cycle
# keeping alive the current execution frames, `obj` will not be
# destroyed immediately when this function returns.
obj = set()
signal.getsignal(signal.SIGINT)
return weakref.ref(obj)
def test_signal_refcycle():
# Test possible workaround for https://bugs.python.org/issue42248
with disabled_gc():
wr = exhibit_signal_refcycle()
if wr() is None:
pytest.skip(
"Python version does not have the bug we're testing for")
gc.collect()
with disabled_gc():
wr = exhibit_signal_refcycle()
assert wr() is not None
util._break_traceback_cycle_from_frame(sys._getframe(0))
assert wr() is None