U
    Ê¹Öhm  ã                   @   sˆ   zd dl ZW n ek
r(   d dlZY nX d dlZd dlZd dlZddlmZ G dd„ dejƒZ	G dd„ dejƒZ
G dd	„ d	ejƒZdS )
é    Né   ©ÚRWLockc                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚWriterc                 C   s:   t j | ¡ || _|| _|| _|| _|| _d| _d| _	dS )aŸ  
        @param buffer_: common buffer_ shared by the readers and writers
        @type buffer_: list
        @type rw_lock: L{RWLock}
        @param init_sleep_time: sleep time before doing any action
        @type init_sleep_time: C{float}
        @param sleep_time: sleep time while in critical section
        @type sleep_time: C{float}
        @param to_write: data that will be appended to the buffer
        N)
Ú	threadingÚThreadÚ__init__Ú_Writer__bufferÚ_Writer__rw_lockÚ_Writer__init_sleep_timeÚ_Writer__sleep_timeÚ_Writer__to_writeÚ
entry_timeÚ	exit_time)ÚselfÚbuffer_Úrw_lockÚinit_sleep_timeÚ
sleep_timeZto_write© r   ú8./venv/lib/python3.8/site-packages/ecdsa/test_rw_lock.pyr      s    zWriter.__init__c                 C   sR   t  | j¡ | j ¡  t   ¡ | _t  | j¡ | j | j	¡ t   ¡ | _
| j ¡  d S ©N)ÚtimeÚsleepr   r
   Zwriter_acquirer   r   r	   Úappendr   r   Zwriter_release©r   r   r   r   Úrun(   s    


z
Writer.runN©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚReaderc                 C   s:   t j | ¡ || _|| _|| _|| _d| _d| _d| _	dS )a\  
        @param buffer_: common buffer shared by the readers and writers
        @type buffer_: list
        @type rw_lock: L{RWLock}
        @param init_sleep_time: sleep time before doing any action
        @type init_sleep_time: C{float}
        @param sleep_time: sleep time while in critical section
        @type sleep_time: C{float}
        N)
r   r   r   Ú_Reader__bufferÚ_Reader__rw_lockÚ_Reader__init_sleep_timeÚ_Reader__sleep_timeÚbuffer_readr   r   )r   r   r   r   r   r   r   r   r   3   s    
zReader.__init__c                 C   sR   t  | j¡ | j ¡  t   ¡ | _t  | j¡ t | j	¡| _
t   ¡ | _| j ¡  d S r   )r   r   r$   r#   Zreader_acquirer   r%   ÚcopyÚdeepcopyr"   r&   r   Zreader_releaser   r   r   r   r   I   s    


z
Reader.runNr   r   r   r   r   r!   2   s   r!   c                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zed	d
„ ƒZedd„ ƒZ	dS )ÚRWLockTestCasec                 C   sö   |   ¡ \}}}| t||ddƒ¡ | t||dddƒ¡ | t||ddƒ¡ | t||ddƒ¡ |  |¡ |  g |d j¡ |  dg|d j¡ |  dg|d j¡ |  |d j|d j	k¡ |  |d j	|d j	k¡ |  |d j|d jk ¡ d S )	Nr   çš™™™™™É?çš™™™™™Ù?r   ç333333Ó?ç      à?é   é   )
Ú_RWLockTestCase__init_variablesr   r!   r   Ú'_RWLockTestCase__start_and_join_threadsÚassertEqualr&   Ú
assertTruer   r   ©r   r   r   Úthreadsr   r   r   Ú test_readers_nonexclusive_accessT   s    
z/RWLockTestCase.test_readers_nonexclusive_accessc                 C   s¦   |   ¡ \}}}| t||dddƒ¡ | t||dddƒ¡ | t||ddƒ¡ |  |¡ |  ddg|d j¡ |  |d j|d j	k¡ |  |d j|d jk¡ d S )Nr   r+   r   çš™™™™™¹?r.   r*   ©
r0   r   r   r!   r1   r2   r&   r3   r   r   r4   r   r   r   Útest_writers_exclusive_accessj   s    
z,RWLockTestCase.test_writers_exclusive_accessc                 C   s,  |   ¡ \}}}| t||dddƒ¡ | t||ddƒ¡ | t||dddƒ¡ | t||ddƒ¡ | t||ddƒ¡ |  |¡ |  dg|d j¡ |  ddg|d j¡ |  ddg|d	 j¡ |  |d j|d j	k ¡ |  |d j|d j	k¡ |  |d j|d j	k¡ |  |d j|d	 j	k¡ d S )
Nr   r   r7   r+   r*   r.   r,   r/   é   r8   r4   r   r   r   Útest_writer_priorityy   s    
z#RWLockTestCase.test_writer_priorityc                 C   s”  |   ¡ \}}}| t||dddƒ¡ | t||ddƒ¡ | t||dddƒ¡ | t||ddƒ¡ | t||ddƒ¡ | t||d	dd
ƒ¡ |  |¡ |  dg|d j¡ |  ddd
g|d
 j¡ |  ddd
g|d j¡ |  |d j|d j	k ¡ |  |d j|d j	k¡ |  |d j|d j	k¡ |  |d j|d
 j	k¡ |  |d j|d j	k¡ |  |d j|d
 j	k¡ |  |d j|d j	k¡ d S )Nr   r   r7   g333333ã?r*   r.   r,   r+   r-   r/   r:   é   r8   r4   r   r   r   Útest_many_writers_priorityŽ   s$    
z)RWLockTestCase.test_many_writers_priorityc                  C   s   g } t ƒ }g }| ||fS r   r   )r   r   r5   r   r   r   Z__init_variables¨   s    zRWLockTestCase.__init_variablesc                 C   s(   | D ]}|  ¡  q| D ]}| ¡  qd S r   )ÚstartÚjoin)r5   Útr   r   r   Z__start_and_join_threads¯   s    
z'RWLockTestCase.__start_and_join_threadsN)
r   r   r    r6   r9   r;   r=   Ústaticmethodr0   r1   r   r   r   r   r)   S   s   
r)   )Z	unittest2ZunittestÚImportErrorr   r   r'   Z_rwlockr   r   r   r!   ZTestCaser)   r   r   r   r   Ú<module>   s   #!