???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................U
    e5d                     @   sB  d dl Z d dlZddlmZ ddlmZ ddlmZmZ ejZ	dddd	d
dgZ
e je je je je je je je je je je je je je jdZdd Zdd Zdd ZdddddZddddd	Zdd
 Zd&ddZ dd Z!dd Z"dd Z#dZ$i Z%e& Z'G dd de(Z)G d d! d!e)Z*G d"d# d#e)Z+G d$d% d%e+Z,dS )'    N   )heap)get_context)	reductionassert_spawningRawValueRawArrayValueArraycopysynchronized)cubBhHiIlLqQfdc                 C   s    t | }t|}t| |d S N)ctypessizeofr   ZBufferWrapperrebuild_ctype)type_sizewrapper r"   4/usr/lib64/python3.8/multiprocessing/sharedctypes.py
_new_value'   s    

r$   c                 G   s<   t | | }t|}tt|dt| |j|  |S )z>
    Returns a ctypes object allocated from shared memory
    r   )typecode_to_typegetr$   r   memset	addressofr   __init__)typecode_or_typeargsr   objr"   r"   r#   r   ,   s
    
c                 C   sj   t | | }t|trD|| }t|}tt|dt| |S |t	| }t|}|j
|  |S dS )z=
    Returns a ctypes array allocated from shared memory
    r   N)r%   r&   
isinstanceintr$   r   r'   r(   r   lenr)   )r*   size_or_initializerr   r,   resultr"   r"   r#   r   6   s    

T)lockctxc                G   sX   t | f| }|dkr|S |dkr4|p*t }| }t|dsJtd| t|||dS )z6
    Return a synchronization wrapper for a Value
    FTNacquire%r has no method 'acquire'r3   )r   r   RLockhasattrAttributeErrorr   )r*   r2   r3   r+   r,   r"   r"   r#   r	   F   s    

c                C   sT   t | |}|dkr|S |dkr0|p&t }| }t|dsFtd| t|||dS )z9
    Return a synchronization wrapper for a RawArray
    Fr4   r5   r6   r7   )r   r   r8   r9   r:   r   )r*   r0   r2   r3   r,   r"   r"   r#   r
   T   s    


c                 C   s   t t| }| t|d< |S )Nr   )r$   typer   Zpointer)r,   Znew_objr"   r"   r#   r   b   s    c                 C   s   t | trtd|pt }t | tjr4t| ||S t | tjrd| jtj	krXt
| ||S t| ||S t| }zt| }W nR tk
r   dd |jD }dd |D }d|j }t|tf| }t|< Y nX || ||S d S )Nzobject already synchronizedc                 S   s   g | ]}|d  qS )r   r"   ).0Zfieldr"   r"   r#   
<listcomp>v   s     z synchronized.<locals>.<listcomp>c                 S   s   i | ]}|t |qS r"   )make_property)r<   namer"   r"   r#   
<dictcomp>w   s      z synchronized.<locals>.<dictcomp>Synchronized)r-   SynchronizedBaseAssertionErrorr   r   Z_SimpleCDatarA   r
   _type_c_charSynchronizedStringSynchronizedArrayr;   class_cacheKeyErrorZ_fields___name__)r,   r2   r3   clsZsclsnamesr   Z	classnamer"   r"   r#   r   g   s"    

c                 C   s@   t |  t| tjr(t| j| j| jffS tt| | jd ffS d S r   )	r   r-   r   r
   r   rD   _wrapperZ_length_r;   )r,   r"   r"   r#   reduce_ctype   s    rN   c                 C   s8   |d k	r| | } t | t | }| |}||_|S r   )_ForkingPicklerregisterrN   Zcreate_memoryviewZfrom_bufferrM   )r   r!   ZlengthZbufr,   r"   r"   r#   r      s    
r   c                 C   sP   z
t |  W S  tk
rJ   i }tt| fd  | ||  t | < ||   Y S X d S )N   )
prop_cacherI   exectemplate)r?   r   r"   r"   r#   r>      s    
r>   z
def get%s(self):
    self.acquire()
    try:
        return self._obj.%s
    finally:
        self.release()
def set%s(self, value):
    self.acquire()
    try:
        self._obj.%s = value
    finally:
        self.release()
%s = property(get%s, set%s)
c                   @   sF   e 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 )rB   Nc                 C   sB   || _ |r|| _n|ptdd}| | _| jj| _| jj| _d S )NT)Zforce)_obj_lockr   r8   r5   release)selfr,   r2   r3   r"   r"   r#   r)      s    

zSynchronizedBase.__init__c                 C   s
   | j  S r   )rV   	__enter__rX   r"   r"   r#   rY      s    zSynchronizedBase.__enter__c                 G   s   | j j| S r   )rV   __exit__)rX   r+   r"   r"   r#   r[      s    zSynchronizedBase.__exit__c                 C   s   t |  t| j| jffS r   )r   r   rU   rV   rZ   r"   r"   r#   
__reduce__   s    zSynchronizedBase.__reduce__c                 C   s   | j S r   rU   rZ   r"   r"   r#   get_obj   s    zSynchronizedBase.get_objc                 C   s   | j S r   )rV   rZ   r"   r"   r#   get_lock   s    zSynchronizedBase.get_lockc                 C   s   dt | j| jf S )Nz<%s wrapper for %s>)r;   rJ   rU   rZ   r"   r"   r#   __repr__   s    zSynchronizedBase.__repr__)NN)
rJ   
__module____qualname__r)   rY   r[   r\   r^   r_   r`   r"   r"   r"   r#   rB      s   

rB   c                   @   s   e Zd ZedZdS )rA   valueN)rJ   ra   rb   r>   rc   r"   r"   r"   r#   rA      s   rA   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )rG   c                 C   s
   t | jS r   )r/   rU   rZ   r"   r"   r#   __len__   s    zSynchronizedArray.__len__c              
   C   s&   |  | j | W  5 Q R  S Q R X d S r   r]   )rX   r   r"   r"   r#   __getitem__   s    zSynchronizedArray.__getitem__c              	   C   s   |  || j |< W 5 Q R X d S r   r]   )rX   r   rc   r"   r"   r#   __setitem__   s    zSynchronizedArray.__setitem__c              
   C   s*   |  | j || W  5 Q R  S Q R X d S r   r]   )rX   startstopr"   r"   r#   __getslice__   s    zSynchronizedArray.__getslice__c              	   C   s"   |  || j ||< W 5 Q R X d S r   r]   )rX   rg   rh   valuesr"   r"   r#   __setslice__   s    zSynchronizedArray.__setslice__N)rJ   ra   rb   rd   re   rf   ri   rk   r"   r"   r"   r#   rG      s
   rG   c                   @   s   e Zd ZedZedZdS )rF   rc   rawN)rJ   ra   rb   r>   rc   rl   r"   r"   r"   r#   rF      s   rF   )NN)-r   weakref r   r   contextr   r   ZForkingPicklerrO   __all__rE   Zc_wcharZc_byteZc_ubyteZc_shortZc_ushortZc_intZc_uintZc_longZc_ulongZ
c_longlongZc_ulonglongZc_floatZc_doubler%   r$   r   r   r	   r
   r   r   rN   r   r>   rT   rR   WeakKeyDictionaryrH   objectrB   rA   rG   rF   r"   r"   r"   r#   <module>
   sL          

	 