a
    If6                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ ddlm	Z	 g dZ
d ZdZdZdZd	Zd
ZdZdadadd Zdd Zdd Zdd Zdd Zd?ddZdd Zdd Ze Zdd Zdd  Ze Z e! Z"d!d" Z#d#d$ Z$i Z%e! Z&G d%d& d&e'Z(d@d'd(Z)d)d* Z*da+eee)e	j,e	j-fd+d,Z.e/e. G d-d. d.e'Z0G d/d0 d0ej1Z2ze 3d1Z4W n e5y   d2Z4Y n0 d3d4 Z6d5d6 Z7d7d8 Z8d9d: Z9d;d< Z:d=d> Z;dS )A    N)_args_from_interpreter_flags   )process)	sub_debugdebuginfosub_warning
get_loggerlog_to_stderrget_temp_dirregister_after_fork
is_exitingFinalizeForkAwareThreadLockForkAwareLocalclose_all_fds_exceptSUBDEBUG
SUBWARNING   
         multiprocessingz+[%(levelname)s/%(processName)s] %(message)sFc                 G   s   t rt jt| g|R   d S N)_loggerlogr   msgargs r   %lib/python3.9/multiprocessing/util.pyr   ,   s    r   c                 G   s   t rt jt| g|R   d S r   )r   r   DEBUGr   r   r   r    r   0   s    r   c                 G   s   t rt jt| g|R   d S r   )r   r   INFOr   r   r   r    r   4   s    r   c                 G   s   t rt jt| g|R   d S r   )r   r   r   r   r   r   r    r   8   s    r   c                  C   s   ddl } |   zdtsj| tadt_ttdrFtt	 t
t	 n$tjt	di f tjt	di f W |   n
|   0 tS )z0
    Returns logger used by multiprocessing
    r   N
unregisterr   )loggingZ_acquireLockr   Z	getLoggerLOGGER_NAMEZ	propagatehasattratexitr#   _exit_functionregisterZ_exithandlersremoveappendZ_releaseLock)r$   r   r   r    r	   <   s    


r	   c                 C   sJ   ddl }t }|t}| }|| || | rB||  dat	S )zB
    Turn on logging and add a handler which prints to stderr
    r   NT)
r$   r	   Z	FormatterDEFAULT_LOGGING_FORMATZStreamHandlerZsetFormatterZ
addHandlerZsetLevel_log_to_stderrr   )levelr$   ZloggerZ	formatterZhandlerr   r   r    r
   W   s    



r
   c                   C   s    t jdkrdS tt drdS dS )NZlinuxTZgetandroidapilevelF)sysplatformr&   r   r   r   r    #_platform_supports_abstract_socketsl   s
    

r1   c                 C   sH   | sdS t | tr| d dkS t | tr4| d dkS td| dd S )NFr    zaddress type of z unrecognized)
isinstancebytesstr	TypeError)Zaddressr   r   r    is_abstract_socket_namespacet   s    

r7   c                 C   s&   | | t  }|d ur"d |jd< d S )Ntempdir)r   current_process_config)rmtreer8   r9   r   r   r    _remove_temp_dir   s    r<   c                  C   sf   t  jd} | d u rbdd l}dd l}|jdd} td|  td t	|j
| fdd | t  jd< | S )Nr8   r   zpymp-)prefixzcreated temp directory %si)r   exitpriority)r   r9   r:   getshutiltempfileZmkdtempr   r   r<   r;   )r8   r@   rA   r   r   r    r      s    
r   c                  C   sh   t t } |   | D ]J\\}}}}z|| W q ty` } ztd| W Y d }~qd }~0 0 qd S )Nz after forker raised exception %s)list_afterfork_registryitemssort	Exceptionr   )rD   indexZidentfuncobjer   r   r    _run_after_forkers   s    rK   c                 C   s   | t ttt| |f< d S r   )rC   next_afterfork_counterid)rI   rH   r   r   r    r      s    r   c                   @   sF   e Zd ZdZdddZdeeejfddZ	dd	 Z
d
d Zdd ZdS )r   zA
    Class which supports object finalization using weakrefs
    r   Nc                 C   s   |d ur&t |ts&td|t||d ur>t|| | _n|d u rNtd|| _	|| _
|p`i | _|ttf| _t | _| t| j< d S )Nz3Exitpriority ({0!r}) must be None or int, not {1!s}z+Without object, exitpriority cannot be None)r3   intr6   formattypeweakrefref_weakref
ValueError	_callback_args_kwargsrL   _finalizer_counter_keyosgetpid_pid_finalizer_registry)selfrI   callbackr   kwargsr>   r   r   r    __init__   s     

zFinalize.__init__c                 C   s   z|| j = W n ty&   |d Y nf0 | j| krB|d d}n(|d| j| j| j | j| ji | j}d | _ | _ | _ | _| _ |S dS )zQ
        Run the callback unless it has already been called or cancelled
        zfinalizer no longer registeredz+finalizer ignored because different processNz/finalizer calling %s with args %s and kwargs %s)rZ   KeyErrorr]   rV   rW   rX   rT   )r_   wrr^   r   r\   resr   r   r    __call__   s    zFinalize.__call__c                 C   sB   zt | j= W n ty   Y n 0 d | _ | _ | _ | _| _dS )z3
        Cancel finalization of the object
        N)r^   rZ   rc   rT   rV   rW   rX   r_   r   r   r    cancel   s    zFinalize.cancelc                 C   s
   | j tv S )zS
        Return whether this finalizer is still waiting to invoke callback
        )rZ   r^   rg   r   r   r    still_active   s    zFinalize.still_activec              	   C   s   z|   }W n ttfy&   d }Y n0 |d u r<d| jj S d| jjt| jd| jf }| jrp|dt| j 7 }| j	r|dt| j	 7 }| j
d d ur|dt| j
d  7 }|d S )	Nz<%s object, dead>z<%s object, callback=%s__name__z, args=z	, kwargs=r   z, exitpriority=>)rT   AttributeErrorr6   	__class__rj   getattrrV   rW   r5   rX   rZ   )r_   rI   xr   r   r    __repr__   s"    
zFinalize.__repr__)r   NN)rj   
__module____qualname____doc__rb   r^   r   r[   r\   rf   rh   ri   rp   r   r   r   r    r      s   

r   c              	      s   t du rdS du rdd  nfdd  fddtt D }|jdd |D ]N}t |}|durPtd	| z
|  W qP ty   d
dl}|  Y qP0 qPdu rt   dS )z
    Run all finalizers whose exit priority is not None and at least minpriority

    Finalizers with highest priority are called first; finalizers with
    the same priority will be called in reverse order of creation.
    Nc                 S   s   | d d uS Nr   r   pr   r   r    <lambda>      z!_run_finalizers.<locals>.<lambda>c                    s   | d d uo| d  kS rt   r   ru   )minpriorityr   r    rw     rx   c                    s   g | ]} |r|qS r   r   ).0key)fr   r    
<listcomp>#  rx   z#_run_finalizers.<locals>.<listcomp>T)reversez
calling %sr   )	r^   rB   rE   r?   r   rF   	traceback	print_excclear)ry   keysr{   	finalizerr   r   )r|   ry   r    _run_finalizers  s$    



r   c                   C   s   t p
t du S )z6
    Returns true if the process is shutting down
    N)_exitingr   r   r   r    r   8  s    r   c                 C   s   t sda | d |d |d | d urr| D ] }|jr0| d|j |j  q0| D ]}| d|j |  qX|d |  d S )NTzprocess shutting downz2running all "atexit" finalizers with priority >= 0r   z!calling terminate() for daemon %szcalling join() for process %sz)running the remaining "atexit" finalizers)r   ZdaemonnameZ_popenZ	terminatejoin)r   r   r   active_childrenr9   rv   r   r   r    r(   @  s    	



r(   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r   c                 C   s.   t  | _| jj| _| jj| _t| tj d S r   )	threadingZLock_lockacquirereleaser   r   _at_fork_reinitrg   r   r   r    rb   q  s    


zForkAwareThreadLock.__init__c                 C   s   | j   d S r   )r   r   rg   r   r   r    r   w  s    z#ForkAwareThreadLock._at_fork_reinitc                 C   s
   | j  S r   )r   	__enter__rg   r   r   r    r   z  s    zForkAwareThreadLock.__enter__c                 G   s   | j j| S r   )r   __exit__)r_   r   r   r   r    r   }  s    zForkAwareThreadLock.__exit__N)rj   rq   rr   rb   r   r   r   r   r   r   r    r   p  s   r   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s   t | dd  d S )Nc                 S   s
   | j  S r   )__dict__r   )rI   r   r   r    rw     rx   z)ForkAwareLocal.__init__.<locals>.<lambda>)r   rg   r   r   r    rb     s    zForkAwareLocal.__init__c                 C   s   t | dfS )Nr   )rQ   rg   r   r   r    
__reduce__  s    zForkAwareLocal.__reduce__N)rj   rq   rr   rb   r   r   r   r   r    r     s   r   SC_OPEN_MAX   c                 C   sb   t | dtg } |   | d tks,J dtt| d D ] }t| | d | |d   q<d S )Nzfd too larger   )rB   MAXFDrE   rangelenr[   
closerange)fdsir   r   r    r     s
    r   c               	   C   s   t jd u rd S zt j  W n ttfy2   Y n0 z@ttjtj} zt| ddt _W n   t|   Y n0 W n ttfy   Y n0 d S )NF)closefd)	r/   stdincloseOSErrorrU   r[   opendevnullO_RDONLY)fdr   r   r    _close_stdin  s    

r   c                	   C   sP   zt j  W n ttfy$   Y n0 zt j  W n ttfyJ   Y n0 d S r   )r/   stdoutflushrl   rU   stderrr   r   r   r    _flush_std_streams  s    r   c                 C   s   dd l }tttt|}t \}}zP||t| gd|d d dddddd||ddd d d dd W t	| t	| S t	| t	| 0 d S )Nr   Tr   F)
_posixsubprocesstuplesortedmaprO   r[   pipeZ	fork_execfsencoder   )pathr   Zpassfdsr   Zerrpipe_readZerrpipe_writer   r   r    spawnv_passfds  s     

  
r   c                  G   s   | D ]}t | qdS )z/Close each file descriptor given as an argumentN)r[   r   )r   r   r   r   r    	close_fds  s    r   c                  C   sZ   ddl m}  t  ddlm} |j  ddlm} |j	  t
  |   |   dS )zKCleanup multiprocessing resources when multiprocessing tests
    completed.r   )support)
forkserver)resource_trackerN)testr   r   Z_cleanupr   r   Z_forkserverZ_stopr   Z_resource_trackerr   Z
gc_collectZreap_children)r   r   r   r   r   r    _cleanup_tests  s    

r   )N)N)<r[   	itertoolsr/   rR   r'   r   
subprocessr    r   __all__ZNOTSETr   r!   r"   r   r%   r,   r   r-   r   r   r   r   r	   r
   r1   r7   Zabstract_sockets_supportedr<   r   WeakValueDictionaryrC   countrM   rK   r   r^   rY   objectr   r   r   r   r   r9   r(   r)   r   Zlocalr   sysconfr   rF   r   r   r   r   r   r   r   r   r   r    <module>
   sn   

		V
,
*



