
    ob;                        d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	 ddl
mZ ddlmZ ej                  rdd	lmZmZmZmZmZmZ dd
lmZ ddlmZ  G d dej2                        Z G d de      Z G d de      Z G d de      Zy)z;

Implements a thread pool for parallel copying of files.

    )unicode_literalsN)Queue   )copy_file_internalcopy_modified_time)BulkCopyFailed)copy_file_data)IOListOptionalTextTupleType)TracebackType)FSc                   (     e Zd ZdZ fdZd Z xZS )_Workerz,Worker thread that pulls tasks from a queue.c                 F    || _         t        t        |           d| _        y )NT)copiersuperr   __init__daemon)selfr   	__class__s     */usr/lib/python3/dist-packages/fs/_bulk.pyr   z_Worker.__init__   s    gt%'    c                 :   | j                   j                  }	 |j                  d      }	 |	 |j                          y  |        |j                          ?# t        $ r%}| j                   j                  |       Y d }~:d }~ww xY w# |j                          w xY w)NT)block)r   queueget	task_done	Exception	add_error)r   r   taskerrors       r   runz_Worker.run#   s    !!9949(D"<
 !	  !   -%%e,,- !s.   A A 	B B ;B  BB B)__name__
__module____qualname____doc__r   r&   __classcell__)r   s   @r   r   r      s    6"r   r   c                       e Zd ZdZd Zy)_TaskzBase class for a task.c                      y)zTask implementation.N r   s    r   __call__z_Task.__call__5   s    r   N)r'   r(   r)   r*   r1   r/   r   r   r-   r-   2   s
     #r   r-   c                       e Zd ZdZd Zd Zy)	_CopyTaskz-A callable that copies from one file another.c                      || _         || _        y N)src_filedst_file)r   r6   r7   s      r   r   z_CopyTask.__init__=   s      r   c                    	 t        | j                  | j                  d       	 | j                  j                          | j                  j                          y # | j                  j                          w xY w# 	 | j                  j                          | j                  j                          w # | j                  j                          w xY wxY w)Ni   )
chunk_size)r	   r6   r7   closer0   s    r   r1   z_CopyTask.__call__B   s    	&4==$--KP&##%##%##%&##%##%##%s.   "A9 A A69C;B0C0CCN)r'   r(   r)   r*   r   r1   r/   r   r   r3   r3   :   s    7!
&r   r3   c                   >    e Zd ZdZd
dZd Zd Zd Zd Zd Z	ddZ
y	)CopierzCopy files in worker threads.c                     |dk  rt        d      || _        || _        g | _        d | _        g | _        g | _        d| _        y )Nr   znum_workers must be >= 0F)
ValueErrornum_workerspreserve_time	all_tasksr   workerserrorsrunning)r   r?   r@   s      r   r   zCopier.__init__P   sH    ?788&*
r   c                    | j                   rmt        | j                         | _        t        | j                         D cg c]  }t	        |        c}| _        | j
                  D ]  }|j                           d| _        yc c}w )zStart the workers.)maxsizeTN)r?   r   r   ranger   rB   startrD   )r   _workers      r   rH   zCopier.start\   sg    t'7'78DJ389I9I3JKaGDMKDL,,  Ls   Bc                 x   | j                   r| j                  r| j                  D ]  }| j                  j	                  d        | j                  D ]  }|j                           | j                  r| j                  D ]
  }t        |   | j                  dd= | j                  j                          d| _         y)z6Stop the workers (will block until they are finished).NF)	rD   r?   rB   r   putjoinr@   rA   r   )r   _workerrJ   argss       r   stopzCopier.stope   s    <<D,,  << %

t$%,,  !! NN .D&-. QJJOOr   c                 :    | j                   j                  |       y)z"Add an exception raised by a task.N)rC   append)r   r%   s     r   r#   zCopier.add_errory   s    5!r   c                 &    | j                          | S r5   )rH   r0   s    r   	__enter__zCopier.__enter__}   s    

r   c                 l    | j                          |"| j                  rt        | j                        y y r5   )rP   rC   r   )r   exc_type	exc_value	tracebacks       r   __exit__zCopier.__exit__   s0     			 -- "-r   c                 d   | j                   t        ||||| j                         y| j                  j	                  ||||f       |j                  |d      }	 |j                  |d      }t        ||      }| j                   j                  |       y# t        $ r |j                           w xY w)z#Copy a file from one fs to another.N)r@   rw)
r   r   r@   rA   rR   openbinr"   r:   r3   rL   )	r   src_fssrc_pathdst_fsdst_pathr@   r6   r7   r$   s	            r   copyzCopier.copy   s     ::&($BTBT NN!!68VX"FG~~h4H!>>(C8 Xx0DJJNN4 	   s   B B/N)   F)F)r'   r(   r)   r*   r   rH   rP   r#   rT   rY   rb   r/   r   r   r<   r<   M   s(    '
(".!r   r<   )r*   
__future__r   typing	threadingsix.moves.queuer   rb   r   r   rC   r   toolsr	   TYPE_CHECKINGr
   r   r   r   r   r   typesr   baser   Threadr   objectr-   r3   r<   r/   r   r   <module>rn      sn    (   ! 8 " !	<<#"i "0#F #& &&O!V O!r   