You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
1.2 KiB
39 lines
1.2 KiB
# Copyright 2022-present MongoDB, Inc. |
|
# |
|
# Licensed 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 os |
|
import threading |
|
import weakref |
|
|
|
_HAS_REGISTER_AT_FORK = hasattr(os, "register_at_fork") |
|
|
|
# References to instances of _create_lock |
|
_forkable_locks: weakref.WeakSet = weakref.WeakSet() |
|
|
|
|
|
def _create_lock() -> threading.Lock: |
|
"""Represents a lock that is tracked upon instantiation using a WeakSet and |
|
reset by pymongo upon forking. |
|
""" |
|
lock = threading.Lock() |
|
if _HAS_REGISTER_AT_FORK: |
|
_forkable_locks.add(lock) |
|
return lock |
|
|
|
|
|
def _release_locks() -> None: |
|
# Completed the fork, reset all the locks in the child. |
|
for lock in _forkable_locks: |
|
if lock.locked(): |
|
lock.release()
|
|
|