o
    éT•jÈ6  ã                   @   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 )Néÿÿÿÿz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,
þ
*
ÿ
