File: //usr/local/lib/python3.10/multiprocessing/__pycache__/shared_memory.cpython-310.pyc
o
�iH � @ s� d Z ddgZddlmZ ddlZddlZddlZddlZddlZddl Z ej
dkr0ddlZdZnddl
Z
dZd d
lmZ ejejB ZdZerIdZnd
Zdd� ZG dd� d�ZdZG dd� d�ZdS )z�Provides shared memory for direct access across processes.
The API of this package is currently provisional. Refer to the
documentation for details.
�SharedMemory�
ShareableList� )�partialN�ntFT� )�resource_tracker� z/psm_Zwnsm_c C sB t tt� d } | dksJ d��tt�| � }t|�t ksJ �|S )z6Create a random filename for the shared memory object.� z_SHM_NAME_PREFIX too long)�_SHM_SAFE_NAME_LENGTH�len�_SHM_NAME_PREFIX�secretsZ token_hex)�nbytes�name� r �:/usr/local/lib/python3.10/multiprocessing/shared_memory.py�_make_filename( s
r c @ s� e Zd ZdZdZdZdZdZej Z
dZerdndZ
ddd �Zd
d� Zdd
� Zdd� Zedd� �Zedd� �Zedd� �Zdd� Zdd� ZdS )r a� Creates a new shared memory block or attaches to an existing
shared memory block.
Every shared memory block is assigned a unique name. This enables
one process to create a shared memory block with a particular name
so that a different process can attach to that same shared memory
block using that same name.
As a resource for sharing data across processes, shared memory blocks
may outlive the original process that created them. When one process
no longer needs access to a shared memory block that might still be
needed by other processes, the close() method should be called.
When a shared memory block is no longer needed by any process, the
unlink() method should be called to ensure proper cleanup.N���i� TFr c C sx |dkst d��|rttjB | _|dkrt d��|d u r&| jtj@ s&t d��tr�|d u rL t� }z
tj || j| j
d�| _W n tyF Y q,w || _
n| jrSd| n|}tj || j| j
d�| _|| _
z|ro|rot�| j|� t�| j�}|j}t�| j|�| _W n ty� | �� � w t�| j
d� n�|r� |d u r�t� n|}t�tjtjtj|d ? d
@ |d
@ |�}z1t�� }|tjkr�|d ur�ttj t�!tj �|tj��W t�"|� q�tjd||d�| _W t�"|� nt�"|� w || _
n?|| _
t�#tj$d
|�}zt�%|tj$ddd�}W t�"|� nt�"|� w zt�&|�}W t�'|� nt�'|� w tjd||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 )ZtagnameF)+�
ValueError�_O_CREX�os�O_RDWR�_flags�O_EXCL�
_USE_POSIXr �_posixshmemZshm_open�_mode�_fd�FileExistsError�_name�_prepend_leading_slash� ftruncate�fstat�st_size�mmap�_mmap�OSError�unlinkr �register�_winapiZCreateFileMappingZINVALID_HANDLE_VALUEZNULLZPAGE_READWRITEZGetLastErrorZERROR_ALREADY_EXISTS�errno�EEXIST�strerrorZCloseHandleZOpenFileMappingZ
FILE_MAP_READZ
MapViewOfFileZVirtualQuerySizeZUnmapViewOfFile�_size�
memoryview�_buf) �selfr �create�sizeZstatsZ temp_nameZh_mapZlast_error_codeZp_bufr r r �__init__K s� ����
�
����zSharedMemory.__init__c C s$ z| � � W d S ty Y d S w �N)�closer* �r4 r r r �__del__� s
�zSharedMemory.__del__c C s | j | jd| jffS )NF)� __class__r r6 r: r r r �
__reduce__� s ��zSharedMemory.__reduce__c C s | j j� d| j�d| j� d�S )N�(z, size=�))r<