
    j5j                       U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZmZ ddlmZmZmZ ddlmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ ddlm Z  ddl!m"Z" ddl#m$Z$ erIddlm%Z% ejL                  jN                  ejN                  z  Z'de(d<   eg df   Z)de(d<   ee'e)e*gdf   Z+de(d<   e,e   e,e   z  Z-ddZ.d Z/d dZ0d dZ1d!dZ2 G d de      Z3ed        Z4 ed      Z5ed        Z6ed        Z7y)"z<OCRmyPDF's multiprocessing/multithreading abstraction layer.    )annotationsN)CallableIterable)ProcessPoolExecutorThreadPoolExecutoras_completed)suppress)TYPE_CHECKING)Console)Executorhookimpl)RichLoggingHandler)RichProgressBarInputFileError)remove_all_log_handlers)	TypeAliasr   QueueUserInit
WorkerInitc                *   	 	 | j                         }|yt        j                  |j                        }|j	                  |       E# t
        $ rB ddl}t        dt        j                         |j                  t        j                         Y Kw xY w)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       Z/var/www/html/qr/venv/lib/python3.12/site-packages/ocrmypdf/builtin_plugins/concurrency.pylog_listenerr(   '   s|     
	1UUWF~&&v{{3FMM&!   	1##**5SZZ0		1s   A 0A ABBc                     t        d      )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                   t        j                   t         j                  t         j                         t        t              5  t        j                   t         j
                  t               ddd       t        j                         }t        |       |j                  |       |j                  t        j                  j                  |               |        y# 1 sw Y   oxY w)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_initr:   D   s     MM&--0 
.	! 5fmm^45
 DD! 	MM(OOG$$11!45K
5 5s   )CC"c                    ~ ~t        t              5  t        j                  t        j                  t        j
                  h       ddd        |        y# 1 sw Y   xY w)zBegin a thread pool worker.N)r	   r1   r.   pthread_sigmask	SIG_BLOCKr2   )r$   r7   r8   s      r'   thread_initr>   Z   sO    		.	! Bv//&--AB K
	B Bs   4AAc                    | s	 ddl m} ~| r"t        j                  d      }t
        }t        }n!t        j                  d      }t        }t        }|||fS # t        $ r d} Y Ww xY w)Nr   )SemLockT)
multiprocessing.synchronizer@   ImportErrorqueuer   r   r>   multiprocessingr   r:   )use_threadsr@   	loq_queueexecutor_classinitializers        r'   setup_executorrJ   f   si    	; KKO	+!#))"-	,"nk11  	K	s   A A#"A#c                  4    e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZy)StandardExecutorz+Standard OCRmyPDF concurrent task executor.c          
        t        |      \  }}	}
t        j                  t        |f      }|j	                           | j
                  di |5 } |	||
||t        j                  d      j                  f      5 }|D cg c]  } |j                  |g|  }}	 t        |      D ]  }|j                         } |||        	 |j%                  d        	 d d d        d d d        |j'                          y c c}w # t        $ r |j                  dd        t        $ r5 t        j                   j#                  dd      s|j                  dd        w xY w# |j%                  d        w xY w# 1 sw Y   xY w# 1 sw Y   xY w)	N)targetr*    )max_workersrI   initargsFT)waitcancel_futuresPYTEST_CURRENT_TEST )rJ   	threadingThreadr(   start
pbar_classr   r   levelsubmitr   resultKeyboardInterruptshutdownr   osenvironr   
put_nowaitjoin)selfrF   rP   progress_kwargsworker_initializertasktask_argumentstask_finished	log_queuerH   rI   listenerpbarexecutorr*   futuresfuturer\   s                     r'   _executezStandardExecutor._execute   s    2@1L.	>; ##<ylK DOO.o.	+26''#%79J9J29N9T9TU	+ @NOxt3d3OGO+*73 0F#]]_F!&$/0$ $$T*9	+ 	+@ 	1 P
 % !!uT!B zz~~&;R@ %%5%F $$T*9	+ 	+ 	+ 	+s[   ,E=:E1?C9E1)C>E1E=9E1>AEEE..E11E:	6E==FN)rF   boolrP   intrd   dictre   r   rf   r   rg   r   rh   r   )__name__
__module____qualname____doc__ro   rU   r,   r'   rL   rL      sP    58 8 	8
 8 %8 8 !8  8r,   rL   c                    t        |       S )zReturn the default executor.)rY   )rL   )progressbar_classs    r'   get_executorry      s     '899r,   T)r"   c                     d } | S )z&Return the default progress bar class.c                 (    t        | i |dt        iS )Nconsole)r   RICH_CONSOLE)r*   kwargss     r'   partial_RichProgressBarz6get_progressbar_class.<locals>.partial_RichProgressBar   s    EEEEr,   rU   )r   s    r'   get_progressbar_classr      s    F #"r,   c                 "    t        t              S )z+Return the default logging console handler.)r|   )r   r}   rU   r,   r'   get_logging_consoler      s     l33r,   )r$   r   )r$   r   r7   r   returnNone)rF   rp   r   z"tuple[Queue, Executor, WorkerInit])8rv   
__future__r   r   logging.handlersrE   multiprocessing.queuesr_   rD   r.   r!   rV   collections.abcr   r   concurrent.futuresr   r   r   
contextlibr	   typingr
   rich.consoler   RichConsoleocrmypdfr   r   ocrmypdf._loggingr   ocrmypdf._progressbarr   ocrmypdf.exceptionsr   ocrmypdf.helpersr   r   queuesr   __annotations__r   rq   r   typeFuturesExecutorClassr(   r+   r:   r>   rJ   rL   ry   r}   r   r   rU   r,   r'   <module>r      s#   C "     	   
  . T T    / ' 0 1 . 4 &--33ekkAE9A"2t8,Hi,$eXs%;T%ABJ	B./$7J2KK 10J
,	22;x ;| 
: 
:
 $' 
# 
# 
4 
4r,   