o
    Q `                     @   s   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 ddl	m
Z
 ddlmZ ejrEdd	lmZ dd
lmZ ddlmZmZmZmZmZ G dd dejZG dd deZG dd deZG dd deZdS )z;

Implements a thread pool for parallel copying of files.

    )unicode_literalsN)Queue   )copy_file_internal)BulkCopyFailed)copy_file_data)FS)TracebackType)IOListOptionalTextTypec                       s(   e Zd ZdZ fddZdd Z  ZS )_Workerz,Worker thread that pulls tasks from a queue.c                    s   || _ tt|   d| _d S )NT)copiersuperr   __init__Zdaemon)selfr   	__class__ */usr/lib/python3/dist-packages/fs/_bulk.pyr      s   
z_Worker.__init__c              
   C   s   | j j}	 |jdd}z0z|d u rW W |  d S |  W n ty5 } z| j | W Y d }~nd }~ww W |  n|  w q)NT)block)r   queuegetZ	task_done	Exception	add_error)r   r   taskerrorr   r   r   run!   s   
z_Worker.run)__name__
__module____qualname____doc__r   r   __classcell__r   r   r   r   r      s    r   c                   @   s   e Zd ZdZdd ZdS )_TaskzBase class for a task.c                 C   s   dS )zTask implementation.Nr   r   r   r   r   __call__3   s    z_Task.__call__N)r    r!   r"   r#   r'   r   r   r   r   r%   0   s    r%   c                   @   s    e Zd ZdZdd Zdd ZdS )	_CopyTaskz-A callable that copies from one file another.c                 C   s   || _ || _d S N)src_filedst_file)r   r*   r+   r   r   r   r   ;   s   
z_CopyTask.__init__c                 C   sd   zt | j| jdd W z| j  W | j  d S | j  w z| j  W | j  w | j  w )Ni   )Z
chunk_size)r   r*   r+   closer&   r   r   r   r'   @   s   z_CopyTask.__call__N)r    r!   r"   r#   r   r'   r   r   r   r   r(   8   s    r(   c                   @   sJ   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )CopierzCopy files in worker threads.   c                 C   s2   |dk rt d|| _d | _g | _g | _d| _d S )Nr   znum_workers must be >= 0F)
ValueErrornum_workersr   workerserrorsrunning)r   r0   r   r   r   r   N   s   
zCopier.__init__c                    sL    j r!t j d _ fddt j D  _ jD ]}|  qd _dS )zStart the workers.)maxsizec                    s   g | ]}t  qS r   )r   ).0_r&   r   r   
<listcomp>\   s    z Copier.start.<locals>.<listcomp>TN)r0   r   r   ranger1   startr3   )r   workerr   r&   r   r9   X   s   


zCopier.startc                 C   sX   | j r'| jr'| jD ]}| jd q	| jD ]}|  q| jdd= | j  d| _ dS )z6Stop the workers (will block until they are finished).NF)r3   r0   r1   r   putjoin)r   Z_workerr:   r   r   r   stopa   s   




zCopier.stopc                 C   s   | j | dS )z"Add an exception raised by a task.N)r2   append)r   r   r   r   r   r   m   s   zCopier.add_errorc                 C   s   |    | S r)   )r9   r&   r   r   r   	__enter__q   s   zCopier.__enter__c                 C   s(   |    |d u r| jrt| jd S d S r)   )r=   r2   r   )r   exc_type	exc_value	tracebackr   r   r   __exit__u   s   
zCopier.__exit__c                 C   sl   | j du rt|||| dS ||d}z||d}W n ty(   |   w t||}| j | dS )z#Copy a file from one fs to another.Nrw)r   r   Zopenbinr   r,   r(   r;   )r   Zsrc_fsZsrc_pathZdst_fsZdst_pathr*   r+   r   r   r   r   copy   s   

zCopier.copyN)r.   )r    r!   r"   r#   r   r9   r=   r   r?   rC   rF   r   r   r   r   r-   K   s    

	
r-   )r#   Z
__future__r   Z	threadingtypingZsix.moves.queuer   rF   r   r2   r   Ztoolsr   ZTYPE_CHECKINGbaser   typesr	   r
   r   r   r   r   ZThreadr   objectr%   r(   r-   r   r   r   r   <module>   s     