a
    zeG                     @   s   d dg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ej	dkr\ddl
Z
dZnddlZdZejejB ZdZerd	Znd
Zdd ZG dd  d ZdZG dd dZdS )SharedMemoryShareableList    )partialNntFT   z/psm_Zwnsm_c                  C   s"   t tt d } tt|  }|S )N   )_SHM_SAFE_NAME_LENGTHlen_SHM_NAME_PREFIXsecretsZ	token_hex)nbytesname r   3/usr/lib/python3.9/multiprocessing/shared_memory.py_make_filename'   s    r   c                   @   s   e Zd ZdZdZdZdZejZ	dZ
er*dndZdddZd	d
 Zdd Zdd Zedd Zedd Zedd Zdd Zdd ZdS )r   Ni  TFr   c           
   	   C   s  |dkst d|r0ttjB | _|dkr0t d|d u rL| jtj@ sLt dtrD|d u rt }ztj	|| j| j
d| _W n ty   Y qZY n0 || _qqZn.| jrd| n|}tj	|| j| j
d| _|| _z<|r|rt| j| t| j}|j}t| j|| _W n ty&   |    Y n0 ddlm} || jd	 n*|r|d u rZt n|}ttjtjtj|d
? d@ |d@ |}zjt }|tjkr|d urttj t!tj |tjnW t"| qJtjd||d| _W t"| nt"| 0 || _qnqJnb|| _t#tj$d|}z"t%|tj$ddd}	W t"| nt"| 0 t&|	}tjd||d| _|| _'t(| j| _)d S )Nr   z!'size' must be a positive integerz4'size' must be a positive number different from zeroz&'name' can only be None if create=True)mode/   )registershared_memory    l    r   )ZtagnameF)*
ValueError_O_CREXosO_RDWR_flagsO_EXCL
_USE_POSIXr   _posixshmemZshm_open_mode_fdFileExistsError_name_prepend_leading_slash	ftruncatefstatst_sizemmap_mmapOSErrorunlinkresource_trackerr   _winapiZCreateFileMappingZINVALID_HANDLE_VALUEZNULLZPAGE_READWRITEZGetLastErrorZERROR_ALREADY_EXISTSerrnoEEXISTstrerrorZCloseHandleZOpenFileMappingZFILE_MAP_READZMapViewOfFileZVirtualQuerySize_size
memoryview_buf)
selfr   createsizeZstatsr   Z	temp_nameZh_mapZlast_error_codeZp_bufr   r   r   __init__J   s    






zSharedMemory.__init__c                 C   s$   z|    W n ty   Y n0 d S N)closer*   r4   r   r   r   __del__   s    zSharedMemory.__del__c                 C   s   | j | jd| jffS )NF)	__class__r   r6   r:   r   r   r   
__reduce__   s    zSharedMemory.__reduce__c                 C   s   | j j d| jd| j dS )N(z, size=))r<   __name__r   r6   r:   r   r   r   __repr__   s    zSharedMemory.__repr__c                 C   s   | j S r8   )r3   r:   r   r   r   buf   s    zSharedMemory.bufc                 C   s.   | j }tr*| jr*| j dr*| j dd  }|S )Nr   r   )r#   r   r$   
startswith)r4   Zreported_namer   r   r   r      s
    
zSharedMemory.namec                 C   s   | j S r8   )r1   r:   r   r   r   r6      s    zSharedMemory.sizec                 C   sX   | j d ur| j   d | _ | jd ur4| j  d | _trT| jdkrTt| j d| _d S )Nr   r   )r3   releaser)   r9   r   r!   r   r:   r   r   r   r9      s    



zSharedMemory.closec                 C   s2   t r.| jr.ddlm} t| j || jd d S )Nr   )
unregisterr   )r   r#   r,   rE   r   Z
shm_unlink)r4   rE   r   r   r   r+      s    
zSharedMemory.unlink)NFr   )r@   
__module____qualname__r#   r!   r)   r3   r   r   r   r    r   r$   r7   r;   r=   rA   propertyrB   r   r6   r9   r+   r   r   r   r   r   1   s&   
l



utf8c                   @   s  e Zd ZedededededdjdiZ	dZ
dd	 d
d	 dd	 dd	 dZedd Zd5d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!d" Zed#d$ Zed%d& Zed'd( Zed)d* Zed+d, Zed-d. Zed/d0 Zd1d2 Zd3d4 Z e!e"j#Z$dS )6r   qdzxxxxxxx?z%dsNzxxxxxx?x   c                 C   s   | S r8   r   valuer   r   r   <lambda>      zShareableList.<lambda>c                 C   s   |  dtS N    )rstripdecode	_encodingrM   r   r   r   rO     rP   c                 C   s
   |  dS rQ   )rS   rM   r   r   r   rO     rP   c                 C   s   d S r8   r   )_valuer   r   r   rO     rP   )r   r   r      c                 C   s:   t | ttd jfsdS t | tr$dS t | tr2dS dS d S )Nr   r   r   rW   )
isinstancestrbytesr<   rM   r   r   r   _extract_recreation_code  s    

z&ShareableList._extract_recreation_coder   c                   s  |d u s|d ur|pd}fdd|D }t |_d}dg_|D ]6}||d dkr\jnt|d d 7 }j| qDfdd|D }tdj d		| j
 j }t|d
|d_n
t|_|d urt tjdj jjdjgjR   tjd		|jjjg fdd|D R   tjj
jjjg fdd|D R   tjjjjjg|R   n$t _ttjjjd_d S )Nr   c                    sP   g | ]H}t |ttfs$ jt| n& jt|  jt| j d   f qS )r   )rX   rY   rZ   _types_mappingtype
_alignmentr	   .0itemr:   r   r   
<listcomp>+  s   z*ShareableList.__init__.<locals>.<listcomp>r   r   sc                    s   g | ]}  |qS r   )r[   r`   r:   r   r   rc   =  s   rJ    T)r5   r6   c                 3   s&   | ]}t |tr| n|V  qd S r8   )rX   rY   encodera   v_encr   r   	<genexpr>X  rP   z)ShareableList.__init__.<locals>.<genexpr>c                 3   s   | ]}|  V  qd S r8   )rf   rg   ri   r   r   rk   ^  rP   rL   )r	   	_list_len_allocated_offsetsr_   intappendstructcalcsize_format_size_metainfojoin_format_packing_metainfo_format_back_transform_codesr   shmrU   	pack_intorB   _offset_data_start_offset_packing_formats_offset_back_transform_codeslistunpack_from)r4   Zsequencer   Z_formatsoffsetfmtZ_recreation_codesZrequested_sizer   )rj   r4   r   r7   (  s    

&




zShareableList.__init__c                 C   sj   |dkr|n|| j  }|| j ks*| j dk r2tdtd| jj| j|d  d }|d}|t	}|S )Nr    Requested position out of range.8srL   rR   )
rl   
IndexErrorrp   r|   rv   rB   ry   rS   rT   rU   )r4   positionrh   r~   
fmt_as_strr   r   r   _get_packing_formatq  s    

z!ShareableList._get_packing_formatc                 C   sF   || j ks| j dk rtdtd| jj| j| d }| j| }|S )Nr   r   b)rl   r   rp   r|   rv   rB   rz   _back_transforms_mapping)r4   r   transform_codeZtransform_functionr   r   r   _get_back_transform  s    
z!ShareableList._get_back_transformc                 C   sh   || j ks| j dk rtdtd| jj| j|d  |t | 	|}td| jj| j
| | d S )Nr   r   r   rL   r   )rl   r   rp   rw   rv   rB   ry   rf   rU   r[   rz   )r4   r   r   rN   r   r   r   r   !_set_packing_format_and_transform  s    
z/ShareableList._set_packing_format_and_transformc                 C   sv   |dkr|n|| j  }z.| j| j|  }t| || jj|\}W n ty^   tdY n0 | 	|}||}|S )Nr   zindex out of range)
rl   rx   rm   rp   r|   r   rv   rB   r   r   )r4   r   r}   rh   Zback_transformr   r   r   __getitem__  s    

zShareableList.__getitem__c           	      C   s   |dkr|n|| j  }z"| j| }| j| }| |}W n tyR   tdY n0 t|ttfsv| jt	| }|}n`| j|d  | }t|tr|
tn|}t||krtd|d dkr|}n| jt |f }| ||| t|| jj|| d S )Nr   zassignment index out of ranger   z(bytes/str item exceeds available storager   rd   )rl   rm   rx   r   r   rX   rY   rZ   r]   r^   rf   rU   r	   r   r   rp   rw   rv   rB   )	r4   r   rN   Zitem_offsetr}   Zcurrent_formatZ
new_formatZencoded_valueZallocated_lengthr   r   r   __setitem__  s8    

zShareableList.__setitem__c                 C   s   t | j| jjddfS )Nr\   r   )r   r<   rv   r   r:   r   r   r   r=     s    zShareableList.__reduce__c                 C   s   t d| jjdd S )NrJ   r   )rp   r|   rv   rB   r:   r   r   r   __len__  s    zShareableList.__len__c                 C   s"   | j j dt|  d| jjdS )Nr>   z, name=r?   )r<   r@   r{   rv   r   r:   r   r   r   rA     s    zShareableList.__repr__c                    s   d  fddt jD S )Nre   c                 3   s   | ]}  |V  qd S r8   )r   )ra   ir:   r   r   rk     s   z'ShareableList.format.<locals>.<genexpr>)rs   rangerl   r:   r   r:   r   format  s    zShareableList.formatc                 C   s   d| j d  S )NrJ   r   rl   r:   r   r   r   rr     s    z#ShareableList._format_size_metainfoc                 C   s
   d| j  S )Nr   r   r:   r   r   r   rt     s    z&ShareableList._format_packing_metainfoc                 C   s
   d| j  S )Nr   r   r:   r   r   r   ru     s    z*ShareableList._format_back_transform_codesc                 C   s   | j d d S )Nr   rL   r   r:   r   r   r   rx     s    z ShareableList._offset_data_startc                 C   s   | j | jd  S )Nr   )rx   rm   r:   r   r   r   ry     s    z%ShareableList._offset_packing_formatsc                 C   s   | j | jd  S )NrL   )ry   rl   r:   r   r   r   rz     s    z*ShareableList._offset_back_transform_codesc                    s   t  fdd| D S )Nc                 3   s   | ]} |kV  qd S r8   r   )ra   entryrM   r   r   rk     rP   z&ShareableList.count.<locals>.<genexpr>)sum)r4   rN   r   rM   r   count  s    zShareableList.countc                 C   s4   t | D ]\}}||kr|  S qt|dd S )Nz not in this container)	enumerater   )r4   rN   r   r   r   r   r   index
  s    
zShareableList.index)N)%r@   rF   rG   rn   floatboolrY   rZ   r<   r]   r_   r   staticmethodr[   r7   r   r   r   r   r   r=   r   rA   rH   r   rr   rt   ru   rx   ry   rz   r   r   classmethodtypesGenericAlias__class_getitem__r   r   r   r   r      sR   
I!







)__all__	functoolsr   r(   r   r.   rp   r   r   r   r-   r   r   O_CREATr   r   r   r
   r   r   rU   r   r   r   r   r   <module>   s,   

 E