
    TAi(                       S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKJrJr  SSKJrJrJr  SSKJr  SSKJr  SSKJr  SS	KJrJr  SS
KJr  SSKJr  SSK J!r!  SSK"J#r#  \\$\   \$\   4   r%\\RL                  \RL                  4   r&\/ S4   r'\\&\'\(/S4   r)SS jr*S r+SS jr,SS jr-SS jr. " S S\5      r/\S 5       r0\" SS9r1\S 5       r2\S 5       r3g)z<OCRmyPDF's multiprocessing/multithreading abstraction layer.    )annotationsN)CallableIterable)ProcessPoolExecutorThreadPoolExecutoras_completed)suppress)Union)Console)Executorhookimpl)RichLoggingHandler)RichProgressBarInputFileError)remove_all_log_handlersc                &     U R                  5       nUc  g[        R                  " UR                  5      nUR	                  U5        MH  ! [
         a<    SSKn[        S[        R                  S9  UR                  [        R                  S9   NGf = f)a  Listen to the worker processes and forward the messages to logging.

For simplicity this is a thread rather than a process. Only one process
should actually write to sys.stderr or whatever we're using, so if this is
made into a process the main application needs to be directed to it.

See:
https://docs.python.org/3/howto/logging-cookbook.html#logging-to-a-single-file-from-multiple-processes
Nr   zLogging problem)file)getlogging	getLoggernamehandle	Exception	tracebackprintsysstderr	print_exc)qrecordloggerr   s       `/var/www/html/land-ocr/venv/lib/python3.13/site-packages/ocrmypdf/builtin_plugins/concurrency.pylog_listenerr$   $   s|     
	1UUWF~&&v{{3FMM&!   	1##**5SZZ0		1s   A
 1A
 
ABBc                     [        S5      e)z)Handle SIGBUS signal at the worker level.z-A worker process lost access to an input filer   )argss    r#   process_sigbusr'   <   s    
H
II    c                   [         R                   " [         R                  [         R                  5        [        [        5         [         R                   " [         R
                  [        5        SSS5        [        R                  " 5       n[        U5        UR                  U5        UR                  [        R                  R                  U 5      5        U" 5         g! , (       d  f       Nu= f)z!Initialize a process pool worker.N)signalSIGINTSIG_IGNr	   AttributeErrorSIGBUSr'   r   r   r   setLevel
addHandlerhandlersQueueHandler)r    	user_initloglevelroots       r#   process_initr6   A   s     MM&--0 
.	!fmm^4 
"
 DD! 	MM(OOG$$11!45K
 
"	!s   *C
C*c                    A A[        [        5         [        R                  " [        R                  [        R
                  15        SSS5        U" 5         g! , (       d  f       N= f)zBegin a thread pool worker.N)r	   r-   r*   pthread_sigmask	SIG_BLOCKr.   )r    r3   r4   s      r#   thread_initr:   W   sD    		.	!v//&--A 
" K
	 
"	!s   5A
A%c                    U (       d   SSK Jn  AU (       a#  [        R                  " S5      n[
        n[        nO"[        R                  " S5      n[        n[        nX#U4$ ! [         a    Sn  N^f = f)Nr   )SemLockT)
multiprocessing.synchronizer<   ImportErrorqueueQueuer   r:   multiprocessingr   r6   )use_threadsr<   	loq_queueexecutor_classinitializers        r#   setup_executorrG   c   sg    	; KKO	+!#))"-	,"k11  	K	s   A   A/.A/c                  >    \ rS rSrSr              SS jrSrg)StandardExecutor|   z+Standard OCRmyPDF concurrent task executor.c          
     $   [        U5      u  pn
[        R                  " [        U4S9nUR	                  5         U R
                  " S0 UD6 nU	" UU
X[        R                  " S5      R                  4S9 nU Vs/ s H  oR                  " U/UQ76 PM     nn [        U5       H  nUR                  5       nU" UU5        M      UR%                  S 5         S S S 5        S S S 5        UR'                  5         g s  snf ! [         a    UR                  SSS9  e [         a7    [        R                   R#                  SS5      (       d  UR                  SSS9  e f = f! UR%                  S 5        f = f! , (       d  f       N= f! , (       d  f       N= f)	N)targetr&    )max_workersrF   initargsFT)waitcancel_futuresPYTEST_CURRENT_TEST )rG   	threadingThreadr$   start
pbar_classr   r   levelsubmitr   resultKeyboardInterruptshutdownr   osenvironr   
put_nowaitjoin)selfrC   rN   progress_kwargsworker_initializertasktask_argumentstask_finished	log_queuerE   rF   listenerpbarexecutorr&   futuresfuturerZ   s                     r#   _executeStandardExecutor._execute   si    2@1L.	; ##<ylK OO.o.$''#9J9J29N9T9TU @NOt3d3GO+*73F#]]_F!&$/ 4$ $$T*5 /> 	1 P
 % !!uT!B zz~~&;R@@ %%5%F $$T*5  /.s[   )F4E09C7E0+C<E0F7E0<AEEE--E00
E>	:F
FrS   N)rC   boolrN   intrb   dictrc   r   rd   r   re   r   rf   r   )__name__
__module____qualname____firstlineno____doc__rm   __static_attributes__rS   r(   r#   rI   rI   |   sP    58 8 	8
 8 %8 8 !8  8r(   rI   c                    [        U S9$ )zReturn the default executor.)rW   )rI   )progressbar_classs    r#   get_executorrz      s     '899r(   T)r   c                     S n U $ )z&Return the default progress bar class.c                 (    [        U 0 UDS[        0D6$ )Nconsole)r   RICH_CONSOLE)r&   kwargss     r#   partial_RichProgressBar6get_progressbar_class.<locals>.partial_RichProgressBar   s    EEEEr(   rS   )r   s    r#   get_progressbar_classr      s    F #"r(   c                     [        [        S9$ )z+Return the default logging console handler.)r}   )r   r~   rS   r(   r#   get_logging_consoler      s     l33r(   )r    rA   )r    rA   r3   UserInitreturnNone)rC   ro   r   z"tuple[Queue, Executor, WorkerInit])4rv   
__future__r   r   logging.handlersrB   r]   r@   r*   r   rT   collections.abcr   r   concurrent.futuresr   r   r   
contextlibr	   typingr
   rich.consoler   RichConsoleocrmypdfr   r   ocrmypdf._loggingr   ocrmypdf._progressbarr   ocrmypdf.exceptionsr   ocrmypdf.helpersr   typeFuturesExecutorClassrA   r   rp   
WorkerInitr$   r'   r6   r:   rG   rI   rz   r~   r   r   rS   r(   r#   <module>r      s   C "    	   
  . T T   / ' 0 1 . 4	d#677  	o##U[[01BHuh,d23
10J
,	22;x ;| 
: 
:
 $' 
# 
# 
4 
4r(   