a
    8Sic?                     @   s$  d dl Z d dl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
 d dlmZ zd dlZW n eyv   Y n0 G dd deZG dd	 d	eZe Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zd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(d) Z#dS )+    N)check_serializing_named_tensor)register_after_fork)ForkingPickler)Unionc                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	StorageWeakRefzA weak reference to a Storage.

    The cdata member is a Python number containing the integer representation of
    the Storage pointer.c                 C   s   |  | _tjj| _d S N)	_weak_refcdatatorchStorage_free_weak_ref)selfstorage r   \/var/www/html/django/DPS/env/lib/python3.9/site-packages/torch/multiprocessing/reductions.py__init__   s    
zStorageWeakRef.__init__c                 C   s   t j| jS r   )r
   r   _expiredr	   r   r   r   r   expired"   s    zStorageWeakRef.expiredc                 C   s   |  | j d S r   )r   r	   r   r   r   r   __del__%   s    zStorageWeakRef.__del__N)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r      s   r   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )SharedCachez9dictionary from multiprocessing handles to StorageWeakRefc                 C   s   d| _ |   t| tj d S )N   )limit_after_forkr   r   r   r   r   r   r   ,   s    zSharedCache.__init__c                 C   s   t  | _d S r   )	threadingLocklockr   r   r   r   r   6   s    zSharedCache._after_forkc                 C   s6   | j  t| |W  d    S 1 s(0    Y  d S r   )r    dictget)r   keyr   r   r   r"   9   s    zSharedCache.getc                 C   sN   | j 4 t| || t| | jkr,|   W d    n1 s@0    Y  d S r   )r    r!   __setitem__lenr   free_dead_references)r   r#   storage_refr   r   r   r$   =   s    zSharedCache.__setitem__c                 C   sF   d}t |  D ] \}}| r(| |= q|d7 }qtd|d | _d S )Nr      r      )listitemsr   maxr   )r   Zliver#   r'   r   r   r   r&   C   s    
z SharedCache.free_dead_referencesN)	r   r   r   r   r   r   r"   r$   r&   r   r   r   r   r   )   s   
r   c                 C   s   t jj| |S r   )r
   cudaEventfrom_ipc_handle)devicehandler   r   r   rebuild_eventQ   s    r2   c                 C   s   |   }t| j|ffS r   )
ipc_handler2   r0   )eventr1   r   r   r   reduce_eventU   s    r5   c                 C   sJ   |\}}}}t j||||}| t jjjkr@t jjj||d}n||_|S )Nrequires_grad)r
   _utils_rebuild_tensornn	parameter	Parameterr7   )clsr   metadatastorage_offsetsizestrider7   tr   r   r   rebuild_tensorZ   s    rC   c              
   C   s   |d u s|dkr |d||d}nZt |||	f}|d u rjtj  |||||	||||}t|t||	f< n|j|||d tj	tj
j| |d|||}| tjjjkrtjjj||
d}n|
|_|S )Nr   )dtyper0   )r0   wrap_storagerD   r6   )storage_from_cacher
   r-   
_lazy_init_new_shared_cudar   shared_cache_release_ipc_counterr8   r9   r   _TypedStorage_untypedr:   r;   r<   r7   )Z
tensor_clstensor_sizeZtensor_stridetensor_offsetZstorage_clsrD   Zstorage_devicestorage_handlestorage_size_bytesstorage_offset_bytesr7   ref_counter_handleref_counter_offsetevent_handleevent_sync_requiredr   rB   r   r   r   rebuild_cuda_tensorg   s2    
	rW   c                 C   s   |   }| jr| jstdt|  tjj|  |j	r|
 \}}}}}}}}	|  }
t|t|< tt| |  |  |
t|| j||||| j||||	ffS |  |  |  | jf}tt| ||ffS )NzCowardly refusing to serialize non-leaf tensor which requires_grad, since autograd does not support crossing process boundaries.  If you just want to transfer the data, call detach() on the tensor before serializing (e.g., putting it on the queue).)r   r7   is_leafRuntimeErrorr   r
   utilshookswarn_if_has_hooksis_cuda_share_cuda_r?   r   rJ   rW   typer@   rA   rD   rC   )tensorr   r0   r1   rQ   rR   rS   rT   rU   rV   rO   r>   r   r   r   reduce_tensor   sR    \ra   c                 C   s   t | }|j|jfS r   )osfstatst_inost_dev)fdstatr   r   r   fd_id  s    
rh   c                 C   s$   t |}|d u rd S tj|jS r   )rJ   r"   r
   _UntypedStorage_new_with_weak_ptrr	   )r=   r#   r'   r   r   r   rG   !  s    
rG   c              	   C   sl   |  }zRt| t|}|d ur0|W t| S | ||}t|tt|< |W t| S t| 0 d S r   )detachrG   rh   rb   closeZ_new_shared_fd_cpur   rJ   )r=   dfr@   rf   r   r   r   r   rebuild_storage_fd(  s    

rn   c                 C   sv   t | |}|d ur| S |d u r4tj|||}n.|tj| }tj|||}tj||d}t|t	|< | S NrE   )
rG   _shared_decrefr
   ri   _new_shared_filename_cpur8   _element_sizerL   r   rJ   )r=   managerr1   r@   rD   r   Z	byte_sizeuntyped_storager   r   r   rebuild_storage_filename5  s    
ru   c                 C   s   |  S r   r   )r=   r   r   r   rebuild_storage_emptyE  s    rv   c                 C   s   t jj| |dS ro   )r
   r   rL   )r   rD   r   r   r   rebuild_typed_storageH  s    rw   c                 C   s   t | j| jffS r   )rw   _storagerD   r   r   r   r   reduce_typed_storageL  s    rz   c                 C   s
   || dS )N)rF   r   )r   storage_typer   r   r   rebuild_typed_storage_childO  s    r|   c                 C   s   t | jt| ffS r   )r|   rx   r_   ry   r   r   r   reduce_typed_storage_childS  s    r}   c                 C   s   ddl m} | jrtdn| dkr\|  }|d }t}t| tjrR|| j	f7 }| 
  nF|  dkrvtt| ffS |  \}}tj|}t|}||f}t}t| t|< |t| f| fS )Nr(   )get_sharing_strategyz>Cannot pickle CUDA storage; try pickling a CUDA tensor insteadfile_systemr   ) r~   r]   rY   _share_filename_cpu_ru   
isinstancer
   rL   rD   _shared_increfr@   rv   r_   _share_fd_cpu_multiprocessing	reductionDupFdrh   rn   r   rJ   )r   r~   r>   	cache_keyZrebuildrf   r@   rm   r   r   r   reduce_storageV  s&    


r   c                  C   s   t tjjt tjD ](} | jdkr2t | t qt | t	 qt tj
jt tjD ]} t | t qVt tjt t tjjjt d S )Nri   )r   registerr
   r-   r.   r5   _storage_classesr   r   r}   r   rL   rz   _tensor_classesra   Tensorr:   r;   r<   )rB   r   r   r   init_reductionsp  s    


r   )N)$r
   torch.utils.hookstorch._namedtensor_internalsr   rb   r   r   Zmultiprocessing.utilr   Zmultiprocessing.reductionr   typingr   Zmultiprocessing.resource_sharerImportErrorobjectr   r!   r   rJ   r2   r5   rC   rW   ra   rh   rG   rn   ru   rv   rw   rz   r|   r}   r   r   r   r   r   r   <module>   s@   %& 
