
    d                    4   U d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ 	 d dl	m
Z
 n# e$ r
 ej        Z
Y nw xY w e
            Z e
            Z ej                    Zded<   d Zd	 Zdd
ZdddZd ZddZ G d d          Z G d d          Zd Zd ZdS )    )annotationsN)MutableMapping)Any)SerializableLockz#MutableMapping[Any, threading.Lock]_FILE_LOCKSc                ~    	 t           |          }n-# t          $ r  t          j                    x}t           | <   Y nw xY w|S N)r   KeyError	threadingLock)keylocks     5lib/python3.11/site-packages/xarray/backends/locks.py_get_threaded_lockr      sP    33 3 3 3"+."2"22{33Ks    '::c                *    ~ t          j                    S r	   )multiprocessingr   )r   s    r   _get_multiprocessing_lockr   !   s     	!!!    c                    | t           S | dk    rt           S | dk    rt          S | dk    r	 ddlm} n# t          $ r d}Y nw xY w|S t          |           )zReturns an appropriate function for creating resource locks.

    Parameters
    ----------
    scheduler : str or None
        Dask scheduler being used.

    See Also
    --------
    dask.utils.get_scheduler_lock
    Nthreadedr   distributedr   )r   )r   r   dask.distributedr   ImportErrorr
   )	schedulerDistributedLocks     r   _get_lock_makerr   (   s     !!	j	 	 !!	'	'	'((	m	#	#	#@@@@@@@ 	# 	# 	#"OOO	#y!!!s   2 A Areturn
str | Nonec                   	 ddl }ddlm}  || |          }n# t          $ r Y dS w xY w	 ddlm} t          |j        |          rdS n# t          t          f$ r Y nw xY w	 ||j	        j
        u rdS n# t          $ r Y nw xY wdS )zDetermine the dask scheduler that is being used.

    None is returned if no dask scheduler is active.

    See Also
    --------
    dask.base.get_scheduler
    r   N)get_scheduler)Clientr   r   r   )dask	dask.baser    r   r   r!   
isinstance__self__AttributeErrorr   get)r'   
collectionr"   r    
actual_getr!   s         r   _get_schedulerr*   G   s     	++++++"]3
33

   tt++++++j)622 	! =	!(    -111$$ 2    :s/    
''A	 	AA!A2 2
A?>A?c                R    t                      }t          |          } ||           S )a  Get a scheduler appropriate lock for writing to the given resource.

    Parameters
    ----------
    key : str
        Name of the resource for which to acquire a lock. Typically a filename.

    Returns
    -------
    Lock object that can be used like a threading.Lock object.
    )r*   r   )r   r   
lock_makers      r   get_write_lockr-   m   s*       I ++J:c??r   Tc                X    |r|                                  S |                      |          S )zAcquire a lock, possibly in a non-blocking fashion.

    Includes backwards compatibility hacks for old versions of Python, dask
    and dask-distributed.
    acquire)r   blockings     r   r0   r0   ~   s.      	&||~~ ||H%%%r   c                  >    e Zd ZdZd ZddZd Zd Zd Zd Z	d	 Z
d
S )CombinedLockzA combination of multiple locks.

    Like a locked door, a CombinedLock is locked if any of its constituent
    locks are locked.
    c                H    t          t          |                    | _        d S r	   )tuplesetlocks)selfr7   s     r   __init__zCombinedLock.__init__   s    3u::&&


r   Tc                D    t          fd| j        D                       S )Nc              3  :   K   | ]}t          |           V  dS ))r1   Nr/   ).0r   r1   s     r   	<genexpr>z'CombinedLock.acquire.<locals>.<genexpr>   s0      KK74(333KKKKKKr   )allr7   r8   r1   s    `r   r0   zCombinedLock.acquire   s(    KKKK
KKKKKKr   c                B    | j         D ]}|                                 d S r	   )r7   releaser8   r   s     r   rA   zCombinedLock.release   s,    J 	 	DLLNNNN	 	r   c                B    | j         D ]}|                                 d S r	   )r7   	__enter__rB   s     r   rD   zCombinedLock.__enter__   s0    J 	 	DNN	 	r   c                .    | j         D ]} |j        |  d S r	   )r7   __exit__)r8   argsr   s      r   rF   zCombinedLock.__exit__   s/    J 	! 	!DDM4   	! 	!r   c                >    t          d | j        D                       S )Nc              3  $   K   | ]}|j         V  d S r	   )locked)r<   r   s     r   r=   z&CombinedLock.locked.<locals>.<genexpr>   s$      6644;666666r   )anyr7   r8   s    r   rJ   zCombinedLock.locked   s!    664:666666r   c                2    dt          | j                  dS )NzCombinedLock())listr7   rL   s    r   __repr__zCombinedLock.__repr__   s    4tDJ//4444r   NT)__name__
__module____qualname____doc__r9   r0   rA   rD   rF   rJ   rP    r   r   r3   r3      s         ' ' 'L L L L    ! ! !7 7 75 5 5 5 5r   r3   c                  2    e Zd ZdZd	dZd Zd Zd Zd ZdS )
	DummyLockz;DummyLock provides the lock API without any actual locking.Tc                    d S r	   rV   r?   s     r   r0   zDummyLock.acquire       r   c                    d S r	   rV   rL   s    r   rA   zDummyLock.release   rZ   r   c                    d S r	   rV   rL   s    r   rD   zDummyLock.__enter__   rZ   r   c                    d S r	   rV   )r8   rG   s     r   rF   zDummyLock.__exit__   rZ   r   c                    dS )NFrV   rL   s    r   rJ   zDummyLock.locked   s    ur   NrQ   )	rR   rS   rT   rU   r0   rA   rD   rF   rJ   rV   r   r   rX   rX      sj        EE             r   rX   c                   g }| D ]I}t          |t                    r|                    |j                   2||                    |           Jt          |          }|dk    rt          |          S |dk    r|d         S t                      S )z/Combine a sequence of locks into a single lock.N   r   )r$   r3   extendr7   appendlenrX   )r7   	all_locksr   	num_lockss       r   combine_locksrf      s    I # #dL)) 	#TZ((((T"""II1}}I&&&	a|{{r   c                .    | | du rt                      S | S )z'Ensure that the given object is a lock.NF)rX   )r   s    r   ensure_lockrh      s    |tu}}{{Kr   r	   )NN)r   r   rQ   )
__future__r   r   r   weakrefcollections.abcr   typingr   
dask.utilsr   r   r   	HDF5_LOCKNETCDFC_LOCKWeakValueDictionaryr   __annotations__r   r   r   r*   r-   r0   r3   rX   rf   rh   rV   r   r   <module>rr      s   " " " " " " "          * * * * * *      &+++++++ & & & ~& 	!! 4O73N3P3P P P P P  " " "" " " "># # # # #L  "& & & &$5 5 5 5 5 5 5 5@       &  $    s   ( 77