
    }c              
       ,   d 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	m
Z
mZmZ 	 ddlZn# e$ r dZY nw xY wddlmZ ddlmZ  ej        e          Zeo
ej        dk    Z G d d	          Z G d
 d          Zddee         dedede
e         fdZdS )zParallel building utilities.    N)sqrt)AnyCallableDictListOptionalSequence)SphinxParallelError)loggingposixc            	       F    e Zd ZdZddeddfdZddeded	eddfd
ZddZ	dS )SerialTaskszEHas the same interface as ParallelTasks, but executes tasks directly.   nprocreturnNc                     d S N selfr   s     4lib/python3.11/site-packages/sphinx/util/parallel.py__init__zSerialTasks.__init__           	task_funcargresult_funcc                 T    | ||          }n
 |            }|r ||           d S d S r   r   )r   r   r   r   ress        r   add_taskzSerialTasks.add_task   sL     	)C..CC)++C 	K	 	r   c                     d S r   r   r   s    r   joinzSerialTasks.join&   r   r   r   NNr   N)
__name__
__module____qualname____doc__intr   r   r   r    r#   r   r   r   r   r      s        OO c $     (  ( ^b         r   r   c            	       p    e Zd ZdZdeddfdZdedededdfd	Zdd
edededdfdZ	ddZ
ddZdefdZdS )ParallelTasksz1Executes *nproc* tasks in parallel after forking.r   r   Nc                 v    || _         i | _        i | _        i | _        i | _        i | _        d| _        d| _        d S )Nr   )r   _result_funcs_args_procs_precvs_precvsWaiting	_pworking_taskidr   s     r   r   zParallelTasks.__init__-   s@    
2457
FH').0r   pipefuncr   c                    	 t          j                    }|                                5  | |            }n ||          }d d d            n# 1 swxY w Y   d}n`# t          $ rS}d}t	          j        |j        |          d                                         }|t	          j                    f}Y d }~nd }~ww xY wt          j	        |j
                   |                    ||j
        |f           d S )NFTr   )r   LogCollectorcollectBaseException	tracebackformat_exception_only	__class__strip
format_excconvert_serializablelogssend)	r   r6   r7   r   	collectorretfailederrerrmsgs	            r   _processzParallelTasks._process>   sC   	3,..I""$$ $ $ $$&&CC$s))C	$ $ $ $ $ $ $ $ $ $ $ $ $ $ $
 FF 	3 	3 	3F4S]CHHKQQSSF9/112CCCCCC	3 	$Y^444		69>3/00000s;   'A AA AA AA 
B9&A	B44B9r   r   c                 F   | j         }| xj         dz  c_         |pd | j        |<   || j        |<   t          j        d          \  }}t          j        d          }|                    | j        |||f          }|| j        |<   || j	        |<   | 
                                 d S )Nr   c                     d S r   r   )r   results     r   <lambda>z(ParallelTasks.add_task.<locals>.<lambda>Q   s    d r   Ffork)targetargs)r5   r/   r0   multiprocessingPipeget_contextProcessrI   r1   r3   	_join_one)	r   r   r   r   tidprecvpsendcontextprocs	            r   r    zParallelTasks.add_taskN   s    l"-"K2J2J3
3&+E22u!-f55dm5)S:QRRC#(C r   c                     	 | j         r1|                                 st          j        d           | j         /d S d S # t          $ r |                                   w xY w)Ng{Gz?)r4   rU   timesleep	Exception	terminater"   s    r   r#   zParallelTasks.joinZ   s    	. %~~'' %Jt$$$ . % % % % %  	 	 	NN	s	   6<  Ac                 .   t          | j                  D ]}| j        |                                          | j                            |           | j                            |           | j                            |           | xj        dz  c_        d S )Nr   )listr2   r1   r_   r/   popr4   )r   rV   s     r   r_   zParallelTasks.terminated   s    %% 	  	 CK&&(((""3'''KOOC   LS!!!NNaNNN	  	 r   c                    d}| j                                         D ]\  }}|                                r|                                \  }}}|r	t	          | |D ]}t
                              |            | j                            |          | j	                            |          |           | j
        |                                          | j                             |           | xj        dz  c_        d} n| j        r|| j        | j        k     rl| j                                        \  }}	|	| j         |<   | j
        |                                          | xj        dz  c_        | j        r| j        | j        k     l|S )NFr   T)r2   itemspollrecvr
   loggerhandler/   rb   r0   r1   r#   r4   r3   r   popitemstart)
r   
joined_anyrV   r6   excrB   rL   lognewtidnewprecvs
             r   rU   zParallelTasks._join_onel   s   
++-- 	 	ICyy{{ $(IIKK!T6 7-v66 ' 'CMM#&&&&+"&&s++DJNN3,?,?HHHC %%'''  %%%!#!
 ! 	 dntz&A 	 #2::<<FH#+DL K%%'''NNaNN	 ! 	 dntz&A 	  r   r%   r&   )r'   r(   r)   r*   r+   r   r   r   rI   r    r#   r_   boolrU   r   r   r   r-   r-   *   s        ;;c d    "1S 1 1s 1t 1 1 1 1 
 
( 
 
( 
^b 
 
 
 
          4      r   r-   
   	argumentsr   maxbatchr   c                      t                     }||z  |k    r"t          t          ||z  |z                      dk    rdt          |          \  }}|r|dz  } fdt	          |          D             S )Nr   r   c                 6    g | ]}|z  |d z   z           S r$   r   ).0irr   	chunksizes     r   
<listcomp>zmake_chunks.<locals>.<listcomp>   s0    QQQQIa)mQUi$778QQQr   )lenr+   r   divmodrange)rr   r   rs   nargsnchunksrestrx   s   `     @r   make_chunksr      s    	NNEIH 8UU]X56677	A~ 	5),,MGT 1QQQQQ%..QQQQr   )rq   )r*   osr\   r<   mathr   typingr   r   r   r   r   r	   rQ   ImportErrorsphinx.errorsr
   sphinx.utilr   	getLoggerr'   rg   nameparallel_availabler   r-   strr+   r   r   r   r   <module>r      s   " " 				            @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @   OOO . - - - - -      		8	$	$ %;G);        $X X X X X X X XvR R8C= R R RTRUY R R R R R Rs   + 55