
    Fe                       d Z 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	m
Z
mZ 	 ddlZdZddlmZ dd	lmZ e	rdd
lmZ  ej*                  e      Zexr ej0                  dk(  Z G d d      Z G d d      ZdddZy# e$ r dZY \w xY w)zParallel building utilities.    )annotationsN)sqrt)TYPE_CHECKINGAnyCallableTF)SphinxParallelError)logging)Sequenceposixc                  <    e Zd ZdZdddZ	 d	 	 	 	 	 	 	 d	dZd
dZy)SerialTaskszEHas the same interface as ParallelTasks, but executes tasks directly.c                     y N selfnprocs     6/usr/lib/python3/dist-packages/sphinx/util/parallel.py__init__zSerialTasks.__init__            Nc                >    |	 ||      }n |       }|r	 ||       y y r   r   )r   	task_funcargresult_funcress        r   add_taskzSerialTasks.add_task#   s)     ?C.C+C r   c                     y r   r   r   s    r   joinzSerialTasks.join-   r   r   )   r   intreturnNoneNNr   r   r   r   r   zCallable | Noner$   r%   r$   r%   )__name__
__module____qualname____doc__r   r   r    r   r   r   r   r      s;    O TX!(+AP	r   r   c                  R    e Zd ZdZd	dZd
dZ	 d	 	 	 	 	 	 	 ddZddZddZddZ	y)ParallelTasksz1Executes *nproc* tasks in parallel after forking.c                t    || _         i | _        i | _        i | _        i | _        i | _        d| _        d| _        y )Nr   )r   _result_funcs_args_procs_precvs_precvsWaiting	_pworking_taskidr   s     r   r   zParallelTasks.__init__4   s<    
2424
&(').0r   c                   	 t        j                         }|j                         5  | |       }n ||      }d d d        d}t        j                  j                         |j                  ||j                  f       y # 1 sw Y   IxY w# t        $ rS}d}t	        j
                  |j                  |      d   j                         }|t	        j                         f}Y d }~d }~ww xY w)NFTr   )r	   LogCollectorcollectBaseException	tracebackformat_exception_only	__class__strip
format_excconvert_serializablelogssend)	r   pipefuncr   	collectorretfailederrerrmsgs	            r   _processzParallelTasks._processE   s    	3,,.I""$ $;&Cs)C	$
 F
 	$$Y^^4		69>>3/0$ $  	3F44S]]CHKQQSF9//12C	3s.   $B B
B B
B 	C)A	C$$C)Nc                   | j                   }| xj                   dz  c_         |xs d | j                  |<   || j                  |<   t        j                  d      \  }}t        j
                  d      }|j                  | j                  |||f      }|| j                  |<   || j                  |<   | j                          y )Nr!   c                     y r   r   )r   results     r   <lambda>z(ParallelTasks.add_task.<locals>.<lambda>Z   s    r   Ffork)targetargs)r6   r0   r1   multiprocessingPipeget_contextProcessrJ   r2   r4   	_join_one)	r   r   r   r   tidprecvpsendcontextprocs	            r   r   zParallelTasks.add_taskU   s     ll"-"K2J3

3&++E2u&226:dmm5)S:QRC#(C r   c                    	 | j                   r2| j                         st        j                  d       | j                   r2| j	                          y # | j	                          w xY w)Ng{Gz?)r5   rV   timesleep	terminater   s    r   r    zParallelTasks.joinc   sD    	..~~'JJt$ ..
 NNDNNs   =A A#c                >   t        | j                        D ]  }| j                  |   j                          | j                  j                  |       | j                  j                  |       | j                  j                  |       | xj                  dz  c_         y )Nr!   )listr3   r2   r_   r0   popr5   )r   rW   s     r   r_   zParallelTasks.terminatel   ss    % 	 CKK&&(""3'KKOOC LLS!NNaN	 r   c                L   d}| j                   j                         D ]  \  }}|j                         s|j                         \  }}}|rt	        | |D ]  }t
        j                  |         | j                  j                  |      | j                  j                  |      |       | j                  |   j                          | j                   j                  |       | xj                  dz  c_        d} n | j                  r| j                  | j                  k  r| j                  j                         \  }}	|	| j                   |<   | j                  |   j!                          | xj                  dz  c_        | j                  r| j                  | j                  k  r|S )NFr!   T)r3   itemspollrecvr   loggerhandler0   rb   r1   r2   r    r5   r4   r   popitemstart)
r   
joined_anyrW   rC   excrA   rM   lognewtidnewprecvs
             r   rV   zParallelTasks._join_onet   sX   
++- 	ICyy{$(IIK!T6-v66 'CMM#&'+""&&s+DJJNN3,?HC %%'  %!#!
	 !!dnntzz&A#22::<FH#+DLL KK%%'NNaN	 !!dnntzz&A r   r"   )rC   r   rD   r   r   r   r$   r%   r&   r'   r(   )r$   bool)
r)   r*   r+   r,   r   rJ   r   r    r_   rV   r   r   r   r.   r.   1   sJ    ;"1" TX!(+AP	 r   r.   c                    t        |       }||z  }||k\  rt        t        ||z  |z              }|dk(  rd}t        ||      \  }}|r|dz  }t	        |      D cg c]  }| ||z  |dz   |z    c}S c c}w )Nr   r!   )lenr#   r   divmodrange)	argumentsr   maxbatchnargs	chunksizenchunksrestis           r   make_chunksr|      s    	NEIHUU]X567	A~	5),MGT1BG.QQIa)mQUi$78QQQs   A2)
   )ru   zSequence[str]r   r#   rv   r#   r$   z	list[Any])r,   
__future__r   osr]   r;   mathr   typingr   r   r   rR   HAS_MULTIPROCESSINGImportErrorsphinx.errorsr   sphinx.utilr	   collections.abcr
   	getLoggerr)   rg   nameparallel_availabler   r.   r|   r   r   r   <module>r      s    " " 	    / /  . (			8	$ %;G);  (Y YxR    s   A? ?B	B	