
    Ri                        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	 	 ddl
Z
dZddlmZ dd	lmZ e	rdd
lmZmZ 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 dw xY w)zParallel building utilities.    )annotationsN)sqrt)TYPE_CHECKINGTF)SphinxParallelError)logging)CallableSequence)Any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     L/home/agent/.friday_env/lib/python3.12/site-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.join2   r   r   )   r   intreturnNoneNN)r   (Callable[[Any], Any] | Callable[[], Any]r   r
   r   zCallable[[Any], Any] | Noner$   r%   r$   r%   )__name__
__module____qualname____doc__r   r   r    r   r   r   r   r      sB    O 37	;  1	
 
r   r   c                  d    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_precvs_waiting	_pworking_taskidr   s     r   r   zParallelTasks.__init__9   s<    
CE24
&(')/1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._processJ   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 # t        $ r | j                          Y y w xY w)Nr!   c                     y r   r   )r   results     r   <lambda>z(ParallelTasks.add_task.<locals>.<lambda>d   s    r   Ffork)targetargs)r6   r0   r1   multiprocessingPipeget_contextProcessrJ   r2   r4   	_join_one	Exception	terminate)	r   r   r   r   tidprecvpsendcontextprocs	            r   r   zParallelTasks.add_task\   s     ll"-"K2J3

3&++E2u&226:dmm5)S:QRC$)S!	NN 	 NN	s   1C CCc                    	 | j                   r2| j                         st        j                  d       | j                   r2| j	                          y # | j	                          w xY w)Ng{Gz?)r5   rV   timesleeprX   r   s    r   r    zParallelTasks.joinr   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   rX   r0   popr5   )r   rY   s     r   rX   zParallelTasks.terminate{   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   rc   r1   r2   r    r5   r4   r   popitemstart)
r   
joined_anyrY   rC   excrA   rM   lognewtidnewprecvs
             r   rV   zParallelTasks._join_one   sX   
++- 	ICyy{$(IIK!T6-v66 'CMM#&'+""&&s+DJJNN3,?HC %%'  %!#!
	 ""t~~

'B#33;;=FH#+DLL KK%%'NNaN	 ""t~~

'B r   r"   )rC   r
   rD   r'   r   r
   r$   r%   r&   )r   r'   r   r
   r   z Callable[[Any, Any], Any] | Noner$   r%   r(   )r$   bool)
r)   r*   r+   r,   r   rJ   r   r    rX   rV   r   r   r   r.   r.   6   sq    ;"11G1NQ1	1* 8<	;  6	
 
, 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DI'NSqIa)mq1u	&9:SSSs   A2)
   )rv   zSequence[str]r   r#   rw   r#   r$   z	list[Any])r,   
__future__r   osr_   r;   mathr   typingr   rR   HAS_MULTIPROCESSINGImportErrorsphinx.errorsr   sphinx.utilr   collections.abcr   r	   r
   	getLoggerr)   rh   nameparallel_availabler   r.   r}   r   r   r   <module>r      s    " " 	       . 2			8	$ )?RWW-?  .c cLT[    s   B BB