o V‡EV45ã@s˜ddlZddlZddlZddlZddlmZddlZddlmZddlmZdZ dd„e ddƒDƒZ d Z d d „Z dd d „Zdd„ZGdd„dejƒZdS)éN)Úfutures)Útest)Ú_utilsgš™™™™™©?cCsg|]}d|d‘qS)g{®Gáz„?gY@©)Ú.0Úxrrú;/usr/lib/python3/dist-packages/fasteners/tests/test_lock.pyÚ $ór éi,cCs.d}|D]\}}||kr||kr|d7}q|S©Nrér)ÚtimesÚstartÚendÚoverlapsÚsÚerrrÚ_find_overlaps+s  €rc st ¡‰t ¡‰‡‡fdd„}‡‡fdd„}|dur$td|ƒtd|ƒ}|dkrdtj|d.}d}td|ƒD] }| ||¡|d7}q6td|ƒD] }| ||¡|d7}qHWdƒn1s_wYg}g} t ˆƒD]\} } } | ˆj kr~|  | | f¡ql|   | | f¡ql|| fS)Ncópˆ ¡*t ¡}t t|ttƒ¡t ¡}ˆ ˆj||f¡t t ¡WdƒdS1s1wYdS©N) Ú read_lockrÚnowÚtimeÚsleepÚ WORK_TIMESÚlenÚappendÚREADERÚ NAPPY_TIME©ÚidentÚ enter_timeÚ exit_time©ÚlockÚ start_stopsrrÚ read_func7s  "øz#_spawn_variation..read_funccrr) Ú write_lockrrrrrrrÚWRITERrr r$rrÚ write_funcBs  "ûz$_spawn_variation..write_funcr©Ú max_workersr ) Ú collectionsÚdequeÚ fastenersÚReaderWriterLockÚmaxrÚThreadPoolExecutorÚrangeÚsubmitÚlistr)r) ÚreadersÚwritersr,r'r*rÚcountÚ_iÚ writer_timesÚ reader_timesÚ lock_typerÚstoprr$rÚ_spawn_variation3s0     þû  r>cCstj|d}d|_|S)N)ÚtargetT)Ú threadingÚThreadÚdaemon)r?ÚtrrrÚ_daemon_thread`s rDc@s˜eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$S)%ÚReadWriteLockTestécó¶t ¡‰tjdd‰ˆ ¡t ¡‰t ¡‰‡‡‡fdd„‰‡‡fdd„}g}td|jƒD]}t |ƒ}|  |¡| ¡q-|rI|  ¡}|  ¡|s?|  gtˆƒ¡|  gtˆƒ¡dS)Nr ©Údurationc s†ˆ ¡5tˆƒdkrˆ |¡ˆ ˆ¡ˆ |¡zt t ¡d¡Wˆ |¡nˆ |¡wWdƒdS1s.acquire_checkcs(t ¡}ˆ ¡sˆ|ƒˆ ¡rdSdSr)r@Úcurrent_threadÚexpiredrO©rTÚwatchrrÚrun{sÿz5ReadWriteLockTest.test_no_double_writers..runr©r/r0rÚ StopWatchrr-r.r3Ú THREAD_COUNTrDrÚpopÚjoinÚ assertEqualr5©ÚselfrYÚthreadsÚirCr©rTrRrSr%rXrÚtest_no_double_writersis$    þz(ReadWriteLockTest.test_no_double_writerscrG)Nr rHc sš|rˆj}nˆj}|ƒ7|stˆƒdkrˆ |¡ˆ ˆ¡ˆ |¡zt t ¡d¡Wˆ |¡nˆ |¡wWdƒdS1sFwYdSrJ) rr(rrrLrrrMrN)rPÚreaderÚ lock_funcrQrrrT“s    "ôzKReadWriteLockTest.test_no_concurrent_readers_writers..acquire_checkcs4t ¡}ˆ ¡sˆ|t ddg¡ƒˆ ¡rdSdS)NTF)r@rUrVrMÚchoicerOrWrrrY¦sÿzAReadWriteLockTest.test_no_concurrent_readers_writers..runrrZr`rrdrÚ"test_no_concurrent_readers_writersŒs$   þz4ReadWriteLockTest.test_no_concurrent_readers_writerscó>t ¡‰ˆ ˆj¡‡‡fdd„}ˆ t|¡ˆ ˆj¡dS)Ncó6ˆ ¡ ˆ ˆjˆj¡tdƒ‚1swYdS©NÚBroken)r(r_r)ÚownerÚ RuntimeErrorr©r%rarrÚblow_up»ó þz4ReadWriteLockTest.test_writer_abort..blow_up©r/r0Ú assertFalsernÚ assertRaisesro©rarqrrprÚtest_writer_abort·ó   z#ReadWriteLockTest.test_writer_abortcrj)Ncrkrl)rr_rrnrorrprrrqÇrrz4ReadWriteLockTest.test_reader_abort..blow_uprsrvrrprÚtest_reader_abortÃrxz#ReadWriteLockTest.test_reader_abortcs¦t ¡‰t ¡‰‡fdd„}‡‡fdd„}tjdd!}tddƒD]}|ddkr/| |¡q!| |¡q!Wdƒn1s?wY| d t d d „ˆDƒƒ¡dS) Nc sPˆ ¡ˆ ¡tdƒ‚1swYWdƒdS1s!wYdSrl)rror©r%rrÚdouble_bad_readerÓs  ÿ"ÿzEReadWriteLockTest.test_double_reader_abort..double_bad_readercó:ˆ ¡ˆ ˆj¡WdƒdS1swYdSr©r(rrnr©Ú activatedr%rrÚ happy_writerØó "ÿz@ReadWriteLockTest.test_double_reader_abort..happy_writerrFr+réé cSóg|]}|dkr|‘qS©Úwr©rÚarrrr ãr z>ReadWriteLockTest.test_double_reader_abort..) r/r0r-r.rr2r3r4r_r)rar{r€rrcrr~rÚtest_double_reader_abortÏs    üÿz*ReadWriteLockTest.test_double_reader_abortcs¦t ¡‰t ¡‰t ¡‰‡‡‡fdd„}‡‡fdd„}t|ƒ}| ¡ˆ t ¡|  ˆ  ¡¡t|ƒ}| ¡|  ¡|  ¡|  dtˆƒ¡|  ddgtˆƒ¡dS)Nc sˆ ¡:ˆ ¡ˆjst d¡ˆjr ˆ ¡ˆ ˆj¡Wdƒn1s)wYWdƒdSWdƒdS1sAwYdS)Ngü©ñÒMbP?)rÚsetÚhas_pending_writersrrrrnr©rrRr%rrÚ double_readerês  ÿ ÿü"üzBReadWriteLockTest.test_double_reader_writer..double_readercr|rr}rr~rrr€òrzAReadWriteLockTest.test_double_reader_writer..happy_writerr‚Úrr†)r/r0r-r.r@ÚEventrDrÚwaitÚ WAIT_TIMEOUTÚ assertTrueÚis_setr^r_rr5)rarr€rfÚwriterrrŒrÚtest_double_reader_writerås z+ReadWriteLockTest.test_double_reader_writercóÚt ¡‰t ¡‰‡‡fdd„}‡‡fdd„}tjdd)}tddƒD]}|ddkr8|j|t|d dkƒd q"| |¡q"Wdƒn1sHwYd d „ˆDƒ}d d „ˆDƒ}|  dt |ƒ¡|  dt |ƒ¡dS)NcóFˆ ¡|r tdƒ‚ˆ ˆj¡WdƒdS1swYdSrl)rrorrn©rqr~rrÚchaotic_readeró "üz=ReadWriteLockTest.test_reader_chaotic..chaotic_readercr|rr}rr~rrr€rz;ReadWriteLockTest.test_reader_chaotic..happy_writerrFr+rr‚ér˜cSr„r…rr‡rrrr r z9ReadWriteLockTest.test_reader_chaotic..cSr„©rŽrr‡rrrr r rƒr © r/r0r-r.rr2r3r4Úboolr_r)rar™r€rrcr7r6rr~rÚtest_reader_chaoticó  üÿz%ReadWriteLockTest.test_reader_chaoticcr–)Ncr—rl)r(rorrnr˜r~rrÚchaotic_writer"ršz=ReadWriteLockTest.test_writer_chaotic..chaotic_writercr|r)rrrnrr~rrÚ happy_reader)rz;ReadWriteLockTest.test_writer_chaotic..happy_readerrFr+rr‚r›r˜cSr„r…rr‡rrrr 4r z9ReadWriteLockTest.test_writer_chaotic..cSr„rœrr‡rrrr 5r r rƒr)rar¡r¢rrcr7r6rr~rÚtest_writer_chaoticr z%ReadWriteLockTest.test_writer_chaoticc CsÀt ¡}| ¡N| | ¡¡| ¡*| | ¡¡| ¡| | ¡¡Wdƒn1s2wYWdƒn1sAwYWdƒdSWdƒdS1sYwYdSr)r/r0r(r’Ú is_writerrÚ is_reader©rar%rrrÚtest_writer_reader_writer9s   ÿ€þþ"þz+ReadWriteLockTest.test_writer_reader_writercCsøg}t ¡}| ¡| | ¡¡| dt|ƒ¡Wdƒn1s$wY| ¡| d¡| |  ¡¡Wdƒn1sDwY| ¡| | ¡¡| dt|ƒ¡Wdƒn1sgwY|  | ¡¡|  |  ¡¡dSr ) r/r0rr’r¥r_rr(rr¤rt)raÚresultsr%rrrÚtest_single_reader_writerBs  þ  þ þz+ReadWriteLockTest.test_single_reader_writercsvt ¡‰‡fdd„}ˆ ¡| t|¡| ˆ ¡¡Wdƒn1s&wY| ˆ ¡¡| ˆ ¡¡dS)Ncs.ˆ ¡ WdƒdS1swYdSr)r(rrzrrÚ writer_funcTs "ÿz.writer_func)r/r0rrurortr¤r¥)rarªrrzrÚtest_reader_to_writerQs   þz'ReadWriteLockTest.test_reader_to_writercsxt ¡‰‡‡fdd„}ˆ ¡ˆ |ƒ¡ˆ ˆ ¡¡Wdƒn1s'wYˆ ˆ ¡¡ˆ ˆ ¡¡dS)NcsJˆ ¡ˆ ˆ ¡¡ˆ ˆ ¡¡WdƒdS1swYdSr)rr’r¤r¥rrprrÚ reader_funcbs "þz.reader_func)r/r0r(Ú assertIsNonertr¥r¤)rar¬rrprÚtest_writer_to_reader_s  þz'ReadWriteLockTest.test_writer_to_readerc Cs°t ¡}| ¡8| | ¡¡| | ¡¡| ¡| | ¡¡Wdƒn1s-wY| | ¡¡Wdƒn1sCwY| | ¡¡| | ¡¡dSr)r/r0r(rtr¥r’r¤r¦rrrÚtest_double_writernó  ÿûz$ReadWriteLockTest.test_double_writerc Cs°t ¡}| ¡8| | ¡¡| | ¡¡| ¡| | ¡¡Wdƒn1s-wY| | ¡¡Wdƒn1sCwY| | ¡¡| | ¡¡dSr)r/r0rr’r¥rtr¤r¦rrrÚtest_double_readerzr°z$ReadWriteLockTest.test_double_readercCsŠtddƒ\}}| dt|ƒ¡| dt|ƒ¡|D]\}}| dt|||ƒ¡| dt|||ƒ¡q|D]\}}| dt|||ƒ¡q4dS)Nrƒrr ©r>r_rr©rar:r;rr=rrrÚtest_multi_reader_multi_writer†s  ÿz0ReadWriteLockTest.test_multi_reader_multi_writercCsRtddƒ\}}| dt|ƒ¡| dt|ƒ¡|d\}}| dt|||ƒ¡dS)Né r rr²r³rrrÚtest_multi_reader_single_writers  z1ReadWriteLockTest.test_multi_reader_single_writercCsTtddƒ\}}| dt|ƒ¡| dt|ƒ¡|D]\}}| dt|||ƒ¡qdS)Nrrƒr r²r³rrrÚtest_multi_writer—s  ÿz#ReadWriteLockTest.test_multi_writerN)Ú__name__Ú __module__Ú __qualname__r\rerirwryr‰r•rŸr£r§r©r«r®r¯r±r´r¶r·rrrrrEfs&#+      rEr)r-rMr@rÚ concurrentrr/rrrr3rr‘rr>rDÚTestCaserErrrrÚs    -