o
    f6                     @   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 e5y   d2Z4Y nw d3d4 Z6d5d6 Z7d7d8 Z8d9d: Z9d;d< Z:d=d> Z;dS )@    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       t rt jt| g|R   d S d S N)_loggerlogr   msgargs r    +/usr/lib/python3.10/multiprocessing/util.pyr   ,      r   c                 G   r   r   )r   r   DEBUGr   r    r    r!   r   0   r"   r   c                 G   r   r   )r   r   INFOr   r    r    r!   r   4   r"   r   c                 G   r   r   )r   r   r   r   r    r    r!   r   8   r"   r   c                  C   s   ddl } |   zAts<| tadt_ttdr#tt	 t
t	 n tjt	di f tjt	di f W |   tS W |   tS W |   tS |   w )z0
    Returns logger used by multiprocessing
    r   N
unregisterr    )logging_acquireLockr   	getLoggerLOGGER_NAME	propagatehasattratexitr%   _exit_functionregister_exithandlersremoveappend_releaseLock)r&   r    r    r!   r	   <   s(   



r	   c                 C   sJ   ddl }t }|t}| }|| || | r!||  dat	S )zB
    Turn on logging and add a handler which prints to stderr
    r   NT)
r&   r	   	FormatterDEFAULT_LOGGING_FORMATStreamHandlersetFormatter
addHandlersetLevel_log_to_stderrr   )levelr&   logger	formatter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 )NlinuxTgetandroidapilevelF)sysplatformr+   r    r    r    r!   #_platform_supports_abstract_socketsl   s
   

rB   c                 C   sD   | sdS t | tr| d dkS t | tr| d dkS td| d)NFr    zaddress type of z unrecognized)
isinstancebytesstr	TypeError)addressr    r    r!   is_abstract_socket_namespacet   s   

rI   c                 C   s*   | | t  }|d urd |jd< d S d S )Ntempdir)r   current_process_config)rmtreerJ   rK   r    r    r!   _remove_temp_dir   s
   rN   c                  C   sf   t  jd} | d u r1dd l}dd l}|jdd} td|  td t	|j
| fdd | t  jd< | S )NrJ   r   zpymp-)prefixzcreated temp directory %si)r   exitpriority)r   rK   rL   getshutiltempfilemkdtempr   r   rN   rM   )rJ   rR   rS   r    r    r!   r      s   
r   c                  C   sf   t t } |   | D ]$\\}}}}z|| W q ty0 } ztd| W Y d }~qd }~ww d S )Nz after forker raised exception %s)list_afterfork_registryitemssort	Exceptionr   )rW   indexidentfuncobjer    r    r!   _run_after_forkers   s   r_   c                 C   s   | t ttt| |f< d S r   )rV   next_afterfork_counterid)r]   r\   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 r'td|| _	|| _
|p0i | _|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)rD   intrG   formattypeweakrefref_weakref
ValueError	_callback_args_kwargsr`   _finalizer_counter_keyosgetpid_pid_finalizer_registry)selfr]   callbackr   kwargsrP   r    r    r!   __init__   s    

zFinalize.__init__c                 C   s   z|| j = W n ty   |d Y dS w | j| kr"|d d}n|d| j| j| j | j| ji | j}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)rn   KeyErrorrq   rj   rk   rl   rh   )rs   wrrr   r   rp   resr    r    r!   __call__   s    zFinalize.__call__c                 C   sD   zt | j= W n
 ty   Y dS w d | _ | _ | _ | _| _dS )z3
        Cancel finalization of the object
        N)rr   rn   rw   rh   rj   rk   rl   rs   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
        )rn   rr   r{   r    r    r!   still_active   s   
zFinalize.still_activec              	   C   s   z|   }W n ttfy   d }Y nw |d u rd| jj S d| jjt| jd| jf }| jr8|dt| j 7 }| j	rD|dt| j	 7 }| j
d d urV|dt| j
d  7 }|d S )	Nz<%s object, dead>z<%s object, callback=%s__name__z, args=z	, kwargs=r   z, exitpriority=>)rh   AttributeErrorrG   	__class__r~   getattrrj   rk   rF   rl   rn   )rs   r]   xr    r    r!   __repr__   s$   zFinalize.__repr__)r    NN)r~   
__module____qualname____doc__rv   rr   r   ro   rp   rz   r|   r}   r   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 ]'}t |}|durOtd	| z|  W q( tyN   d
dl}|  Y q(w q(du rZt   dS 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>  s    z!_run_finalizers.<locals>.<lambda>c                    s   | d d uo| d  kS r   r    r   )minpriorityr    r!   r         c                    s   g | ]} |r|qS r    r    ).0key)fr    r!   
<listcomp>#  r   z#_run_finalizers.<locals>.<listcomp>T)reversez
calling %sr   )	rr   rU   rX   rQ   r   rY   	traceback	print_excclear)r   keysr   	finalizerr   r    )r   r   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 sBda | d |d |d | d ur9| D ]}|jr(| d|j |j  q| D ]}| d|j |  q,|d |  d S 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   daemonname_popen	terminatejoin)r   r   r   active_childrenrK   r   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   )	threadingLock_lockacquirereleaser   r   _at_fork_reinitr{   r    r    r!   rv   q  s   


zForkAwareThreadLock.__init__c                 C   s   | j   d S r   )r   r   r{   r    r    r!   r   w  s   z#ForkAwareThreadLock._at_fork_reinitc                 C   
   | j  S r   )r   	__enter__r{   r    r    r!   r   z  s   
zForkAwareThreadLock.__enter__c                 G   s   | j j| S r   )r   __exit__)rs   r   r    r    r!   r   }     zForkAwareThreadLock.__exit__N)r~   r   r   rv   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   r   r   )__dict__r   )r]   r    r    r!   r     s   
 z)ForkAwareLocal.__init__.<locals>.<lambda>)r   r{   r    r    r!   rv     s   zForkAwareLocal.__init__c                 C   s   t | dfS )Nr    )re   r{   r    r    r!   
__reduce__  r   zForkAwareLocal.__reduce__N)r~   r   r   rv   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   )rU   MAXFDrX   rangelenro   
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y   Y nw zttjtj} zt| dddt _W W d S    t|    ttfyD   Y d S w )Nzutf-8F)encodingclosefd)	r@   stdincloseOSErrorri   ro   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w zt j  W d S  ttfy'   Y d S w r   )r@   stdoutflushr   ri   stderrr    r    r    r!   _flush_std_streams  s   r   c                 C   s   dd l }tttt|}t \}}z(||t| gd|d d dddddd||ddd d d dd W t	| t	| S t	| t	| w )Nr   Tr   F)
_posixsubprocesstuplesortedmaprc   ro   pipe	fork_execfsencoder   )pathr   passfdsr   errpipe_read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)ro   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   _cleanupr   r   _forkserver_stopr   _resource_trackerr   
gc_collectreap_children)r   r   r   r    r    r!   _cleanup_tests  s   

r   r   )<ro   	itertoolsr@   rf   r,   r   
subprocessr    r   __all__NOTSETr   r#   r$   r   r)   r4   r   r9   r   r   r   r   r	   r
   rB   rI   abstract_sockets_supportedrN   r   WeakValueDictionaryrV   countra   r_   r   rr   rm   objectr   r   r   r   r   rK   r-   r.   r   localr   sysconfr   rY   r   r   r   r   r   r   r    r    r    r!   <module>   sr   	

		
V,

*

