a
    _Émgm  ć                   @   s   zd dl ZW n ey&   d dlZY n0 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   śI/var/www/html/idle/venv/lib/python3.9/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” |  g d¢|d
 j” |  g d¢|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   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   #!