o
    Ni                     @  s   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
 zddlZdZW n ey5   dZY nw ddlmZ dd	lmZ e	rLdd
lmZmZ eeZeoWejdkZG dd dZG dd dZddddZdS )zParallel building utilities.    )annotationsN)sqrt)TYPE_CHECKINGAnyTF)SphinxParallelError)logging)CallableSequenceposixc                   @  s4   e Zd ZdZddddZ		ddddZdddZd	S )SerialTaskszEHas the same interface as ParallelTasks, but executes tasks directly.   nprocintreturnNonec                 C     d S N selfr   r   r   H/home/ubuntu/.local/lib/python3.10/site-packages/sphinx/util/parallel.py__init__!      zSerialTasks.__init__N	task_funcr   argr   result_funcCallable | Nonec                 C  s,   |d ur	||}n| }|r|| d S d S r   r   )r   r   r   r   resr   r   r   add_task$   s   
zSerialTasks.add_taskc                 C  r   r   r   r   r   r   r   join.   r   zSerialTasks.joinr   r   r   r   r   NNr   r   r   r   r   r   r   r   r   r   )__name__
__module____qualname____doc__r   r   r    r   r   r   r   r      s    
r   c                   @  sP   e Zd ZdZdddZdddZ	ddddZd ddZd ddZd!ddZ	dS )"ParallelTasksz1Executes *nproc* tasks in parallel after forking.r   r   r   r   c                 C  s4   || _ i | _i | _i | _i | _i | _d| _d| _d S )Nr   )r   _result_funcs_args_procs_precvs_precvsWaiting	_pworking_taskidr   r   r   r   r   5   s   
zParallelTasks.__init__piper   funcr   r   c           	   
   C  s   z(t  }|  |d u r| }n||}W d    n1 s w   Y  d}W n% tyM } zd}t|j|d  }|t f}W Y d }~nd }~ww t 	|j
 |||j
|f d S )NFTr   )r   LogCollectorcollectBaseException	tracebackformat_exception_only	__class__strip
format_excconvert_serializablelogssend)	r   r2   r3   r   	collectorretfailederrerrmsgr   r   r   _processF   s"   
zParallelTasks._processNr   r   r   c           	      C  s   | j }|  j d7  _ |pdd | j|< || j|< td\}}td}|j| j|||fd}|| j|< || j	|< z| 
  W d S  tyN   |   Y d S w )Nr   c                 S  r   r   r   )r   resultr   r   r   <lambda>[   s    z(ParallelTasks.add_task.<locals>.<lambda>Ffork)targetargs)r1   r+   r,   multiprocessingPipeget_contextProcessrD   r-   r/   	_join_one	Exception	terminate)	r   r   r   r   tidprecvpsendcontextprocr   r   r   r   V   s   



zParallelTasks.add_taskc                 C  sF   z| j r|  std | j sW |   d S W |   d S |   w )Ng{Gz?)r0   rN   timesleeprP   r   r   r   r   r    i   s   
zParallelTasks.joinc                 C  sT   t | jD ]"}| j|   | j| | j| | j| |  jd8  _qd S )Nr   )listr.   r-   rP   r+   popr0   )r   rQ   r   r   r   rP   r   s   zParallelTasks.terminateboolc           
      C  s   d}| j  D ]D\}}| rK| \}}}|rt| |D ]}t| q| j|| j	|| | j
|   | j | |  jd8  _d} nq| jrx| j| jk rx| j \}}	|	| j |< | j
|   |  jd7  _| jrx| j| jk sU|S )NFr   T)r.   itemspollrecvr   loggerhandler+   rY   r,   r-   r    r0   r/   r   popitemstart)
r   
joined_anyrQ   r2   excr=   rE   lognewtidnewprecvr   r   r   rN   z   s,   
zParallelTasks._join_oner"   )r2   r   r3   r   r   r   r   r   r#   r$   r%   )r   rZ   )
r&   r'   r(   r)   r   rD   r   r    rP   rN   r   r   r   r   r*   2   s    



	r*   
   	argumentsSequence[str]r   r   maxbatchr   	list[Any]c                   sj   t  }|| |krtt|| | dkrdt|\}}|r)|d7 } fddt|D S )Nr   r   c                   s$   g | ]} | |d    qS r!   r   ).0irh   	chunksizer   r   
<listcomp>   s   $ zmake_chunks.<locals>.<listcomp>)lenr   r   divmodrange)rh   r   rj   nargsnchunksrestr   rn   r   make_chunks   s   rw   )rg   )rh   ri   r   r   rj   r   r   rk   )r)   
__future__r   osrV   r7   mathr   typingr   r   rJ   HAS_MULTIPROCESSINGImportErrorsphinx.errorsr   sphinx.utilr   collections.abcr   r	   	getLoggerr&   r^   nameparallel_availabler   r*   rw   r   r   r   r   <module>   s,    
a