o
    JAfG                     @   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dd	lmZ ejejB Zd
ZerHd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   )resource_tracker   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   4/usr/lib/python3.10/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|rttjB | _|dkrt d|d u r&| jtj@ s&t dtr|d u rL	 t }ztj	|| j| j
d| _W n	 tyF   Y q,w || _	 n| jrSd| n|}tj	|| j| j
d| _|| _z|ro|rot| j| t| j}|j}t| j|| _W n ty   |    w t| jd n|r	 |d u rt n|}ttjtjtj|d	? d
@ |d
@ |}z1t }|tjkr|d urttj t!tj |tjW t"| qtjd||d| _W t"| nt"| w || _	 n1|| _t#tj$d|}zt%|tj$ddd}W t"| nt"| w 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=TrueT)mode/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unlinkr   register_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statsZ	temp_nameZh_mapZlast_error_codeZp_bufr   r   r   __init__K   s   



zSharedMemory.__init__c                 C   s$   z|    W d S  ty   Y d S w 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      	 | j S r8   )r3   r:   r   r   r   buf      zSharedMemory.bufc                 C   s0   	 | 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   rB   r8   )r1   r:   r   r   r   r6      rD   zSharedMemory.sizec                 C   sb   	 | j d ur| j   d | _ | jd ur| j  d | _tr-| jdkr/t| j d| _d S d S 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t| j t| jd d S d S d S )Nr   )r   r#   r   Z
shm_unlinkr   
unregisterr:   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   propertyrC   r   r6   r9   r+   r   r   r   r   r   2   s*    
k



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	_encodingrO   r   r   r   rQ     s    c                 C   s
   |  dS rS   )rU   rO   r   r   r   rQ     s   
 c                 C   s   d S r8   r   )_valuer   r   r   rQ     rR   )r   r   r	      c                 C   s8   	 t | ttd jfsdS t | trdS t | trdS dS )Nr   r   r	   rY   )
isinstancestrbytesr<   rO   r   r   r   _extract_recreation_code  s   

z&ShareableList._extract_recreation_coder   c                   s  |d u s|d urc|pd}fdd|D }t |_d}dg_|D ]}||d dkr.jnt|d d 7 }j| q"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   d S t _ttjjjd_d S )Nr   c                    sP   g | ]$}t |ttfs jt| n jt|  jt| j d   f qS )r   )rZ   r[   r\   _types_mappingtype
_alignmentr   .0itemr:   r   r   
<listcomp>*  s    z*ShareableList.__init__.<locals>.<listcomp>r   r   sc                    s   g | ]}  |qS r   )r]   rb   r:   r   r   re   <  s    
rL    T)r5   r6   c                 3   s(    | ]}t |tr| n|V  qd S r8   )rZ   r[   encoderc   v_encr   r   	<genexpr>W  s   & z)ShareableList.__init__.<locals>.<genexpr>c                 3   s    | ]}|  V  qd S r8   )rh   ri   rk   r   r   rm   ]  s    rN   )r   	_list_len_allocated_offsetsra   intappendstructcalcsize_format_size_metainfojoin_format_packing_metainfo_format_back_transform_codesr   shmrW   	pack_intorC   _offset_data_start_offset_packing_formats_offset_back_transform_codeslistunpack_from)r4   Zsequencer   Z_formatsoffsetfmtZ_recreation_codesZrequested_sizer   )rl   r4   r   r7   '  s   

&



zShareableList.__init__c                 C   sl   	 |dkr|n|| j  }|| j ks| j dk rtdtd| jj| j|d  d }|d}|t	}|S )Nr    Requested position out of range.8srN   rT   )
rn   
IndexErrorrr   r~   rx   rC   r{   rU   rV   rW   )r4   positionrj   r   
fmt_as_strr   r   r   _get_packing_formatp  s   

z!ShareableList._get_packing_formatc                 C   sH   	 || j ks| j dk rtdtd| jj| j| d }| j| }|S )Nr   r   b)rn   r   rr   r~   rx   rC   r|   _back_transforms_mapping)r4   r   transform_codeZtransform_functionr   r   r   _get_back_transform  s   
z!ShareableList._get_back_transformc                 C   sj   	 || 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   rN   r   )rn   r   rr   ry   rx   rC   r{   rh   rW   r]   r|   )r4   r   r   rP   r   r   r   r   !_set_packing_format_and_transform  s    
z/ShareableList._set_packing_format_and_transformc                 C   sr   |dkr|n|| j  }z| j| j|  }t| || jj|\}W n ty-   tdw | 	|}||}|S )Nr   zindex out of range)
rn   rz   ro   rr   r~   r   rx   rC   r   r   )r4   r   r   rj   Zback_transformr   r   r   __getitem__  s   

zShareableList.__getitem__c           	      C   s   |dkr|n|| j  }z| j| }| j| }| |}W n ty'   tdw t|ttfs9| jt	| }|}n0| j|d  | }t|trL|
tn|}t||krXtd|d dkra|}n| jt |f }| ||| t|| jj|| d S )Nr   zassignment index out of ranger   z(bytes/str item exceeds available storager   rf   )rn   ro   rz   r   r   rZ   r[   r\   r_   r`   rh   rW   r   r   r   rr   ry   rx   rC   )	r4   r   rP   Zitem_offsetr   Zcurrent_formatZ
new_formatZencoded_valueZallocated_lengthr   r   r   __setitem__  s:   

zShareableList.__setitem__c                 C   s   t | j| jjddfS )Nr^   r   )r   r<   rx   r   r:   r   r   r   r=        zShareableList.__reduce__c                 C   s   t d| jjdd S )NrL   r   )rr   r~   rx   rC   r:   r   r   r   __len__  r   zShareableList.__len__c                 C   s"   | j j dt|  d| jjdS )Nr>   z, name=r?   )r<   r@   r}   rx   r   r:   r   r   r   rA     s   "zShareableList.__repr__c                    s    	 d  fddt jD S )Nrg   c                 3   s    | ]}  |V  qd S r8   )r   )rc   ir:   r   r   rm     s    

z'ShareableList.format.<locals>.<genexpr>)ru   rangern   r:   r   r:   r   format  s   zShareableList.formatc                 C   s   	 d| j d  S )NrL   r   rn   r:   r   r   r   rt     s   z#ShareableList._format_size_metainfoc                 C      	 d| j  S )Nr   r   r:   r   r   r   rv        
z&ShareableList._format_packing_metainfoc                 C   r   )Nr   r   r:   r   r   r   rw     r   z*ShareableList._format_back_transform_codesc                 C   s   | j d d S )Nr	   rN   r   r:   r   r   r   rz     s   z ShareableList._offset_data_startc                 C   s   | j | jd  S )Nr   )rz   ro   r:   r   r   r   r{        z%ShareableList._offset_packing_formatsc                 C   s   | j | jd  S )NrN   )r{   rn   r:   r   r   r   r|      r   z*ShareableList._offset_back_transform_codesc                    s   	 t  fdd| D S )Nc                 3   s    | ]} |kV  qd S r8   r   )rc   entryrO   r   r   rm     s    z&ShareableList.count.<locals>.<genexpr>)sum)r4   rP   r   rO   r   count  s   zShareableList.countc                 C   s2   	 t | D ]\}}||kr|  S qt|d)Nz not in this container)	enumerater   )r4   rP   r   r   r   r   r   index	  s   zShareableList.indexr8   )%r@   rH   rI   rp   floatboolr[   r\   r<   r_   ra   r   staticmethodr]   r7   r   r   r   r   r   r=   r   rA   rJ   r   rt   rv   rw   rz   r{   r|   r   r   classmethodtypesGenericAlias__class_getitem__r   r   r   r   r      sV    
I!







)__all__	functoolsr   r(   r   r.   rr   r   r   r   r-   r   r   rg   r   O_CREATr   r   r
   r   r   r   rW   r   r   r   r   r   <module>   s2    

 C