B °-_A-ã@s,ddddddgZddlZddlZddlZddlZddlZdd lmZdd lmZdd lm Z ydd lm Z m Z Wne k rŒe d ƒ‚YnXe edƒƒ\ZZej jZGdd„deƒZ Gdd„de ƒZGdd„deƒZGdd„de ƒZGdd„de ƒZGdd„deƒZGdd„deƒZGdd„dejƒZdS)ÚLockÚRLockÚ SemaphoreÚBoundedSemaphoreÚ ConditionÚEventéNé)Úcontext)Úprocess)Úutil)ÚSemLockÚ sem_unlinkz—This platform lacks a functioning sem_open implementation, therefore, the required synchronization primitives needed will not function, see issue 3770.éc@s\eZdZe ¡Zdd„Zedd„ƒZdd„Z dd„Z d d „Z d d „Z d d„Z edd„ƒZdS)r c Csö|dkrtj ¡}| ¡}tjdkp*|dk}xPtdƒD]<}y t ||||  ¡|¡}|_ Wnt k rnYq6XPq6Wt dƒ‚t   d|j¡| ¡tjdkr´dd„} t  || ¡|j jdk ròdd lm} | |j jƒt j|tj|j jfd d dS) NÚwin32Úforkédzcannot find name for semaphorezcreated semlock with handle %scSs|j ¡dS)N)Ú_semlockÚ _after_fork)Úobj©rú1/usr/lib/python3.7/multiprocessing/synchronize.pyrGsz%SemLock.__init__.._after_forkr)Úregisterr)Z exitpriority)r Z_default_contextZ get_contextZget_start_methodÚsysÚplatformÚrangeÚ_multiprocessingr Ú _make_namerÚFileExistsErrorr ÚdebugÚhandleÚ _make_methodsZregister_after_forkÚnameÚsemaphore_trackerrZFinalizeÚ_cleanup) ÚselfÚkindÚvalueÚmaxvalueÚctxr!Z unlink_nowÚiÚslrrrrrÚ__init__2s.       zSemLock.__init__cCs ddlm}t|ƒ||ƒdS)Nr)Ú unregister)r"r,r )r!r,rrrr#Ts zSemLock._cleanupcCs|jj|_|jj|_dS)N)rÚacquireÚrelease)r$rrrr Zs zSemLock._make_methodscCs |j ¡S)N)rÚ __enter__)r$rrrr/^szSemLock.__enter__cGs |jj|ŽS)N)rÚ__exit__)r$Úargsrrrr0aszSemLock.__exit__cCsDt |¡|j}tjdkr,t ¡ |j¡}n|j}||j|j |j fS)Nr) r Úassert_spawningrrrZget_spawning_popenZduplicate_for_childrr%r'r!)r$r*ÚhrrrÚ __getstate__ds   zSemLock.__getstate__cCs,tjj|Ž|_t d|d¡| ¡dS)Nz recreated blocker with handle %rr)rr Z_rebuildrr rr )r$ÚstaterrrÚ __setstate__mszSemLock.__setstate__cCsdt ¡jdttjƒfS)Nz%s-%sZ semprefix)r Úcurrent_processZ_configÚnextr Ú_randrrrrrrszSemLock._make_nameN)Ú__name__Ú __module__Ú __qualname__ÚtempfileZ_RandomNameSequencer9r+Ú staticmethodr#r r/r0r4r6rrrrrr .s"  r c@s&eZdZd dd„Zdd„Zdd„ZdS) rrcCstj|t|t|ddS)N)r()r r+Ú SEMAPHOREÚ SEM_VALUE_MAX)r$r&r(rrrr+}szSemaphore.__init__cCs |j ¡S)N)rÚ _get_value)r$rrrÚ get_value€szSemaphore.get_valuecCs8y|j ¡}Wntk r&d}YnXd|jj|fS)NÚunknownz<%s(value=%s)>)rrAÚ ExceptionÚ __class__r:)r$r&rrrÚ__repr__ƒs  zSemaphore.__repr__N)r)r:r;r<r+rBrFrrrrr{s c@seZdZddd„Zdd„ZdS)rrcCstj|t|||ddS)N)r()r r+r?)r$r&r(rrrr+szBoundedSemaphore.__init__cCs>y|j ¡}Wntk r&d}YnXd|jj||jjfS)NrCz<%s(value=%s, maxvalue=%s)>)rrArDrEr:r')r$r&rrrrF“s  zBoundedSemaphore.__repr__N)r)r:r;r<r+rFrrrrrŽs c@seZdZdd„Zdd„ZdS)rcCstj|tdd|ddS)Nr)r()r r+r?)r$r(rrrr+¡sz Lock.__init__cCsyf|j ¡r8t ¡j}t ¡jdkrd|dt ¡j7}n,|j ¡dkrLd}n|j ¡dkr`d}nd}Wnt k r~d}YnXd |j j |fS) NÚ MainThreadú|rÚNonerÚSomeOtherThreadÚSomeOtherProcessrCz<%s(owner=%s)>) rÚ_is_miner r7r!Ú threadingÚcurrent_threadrAÚ_countrDrEr:)r$r!rrrrF¤s   z Lock.__repr__N)r:r;r<r+rFrrrrrŸsc@seZdZdd„Zdd„ZdS)rcCstj|tdd|ddS)Nr)r()r r+ÚRECURSIVE_MUTEX)r$r(rrrr+ºszRLock.__init__cCs¬y||j ¡rBt ¡j}t ¡jdkr6|dt ¡j7}|j ¡}n8|j ¡dkrZd\}}n |j ¡dkrrd\}}nd\}}Wnt k r˜d\}}YnXd |j j ||fS) NrGrHr)rIrr)rJÚnonzero)rKrQ)rCrCz <%s(%s, %s)>) rrLr r7r!rMrNrOrArDrEr:)r$r!ÚcountrrrrF½s      zRLock.__repr__N)r:r;r<r+rFrrrrr¸sc@sleZdZddd„Zdd„Zdd„Zdd „Zd d „Zd d „Zdd„Z ddd„Z ddd„Z dd„Z ddd„Z dS)rNcCs>|p | ¡|_| d¡|_| d¡|_| d¡|_| ¡dS)Nr)rÚ_lockrÚ_sleeping_countÚ _woken_countÚ_wait_semaphorer )r$Úlockr(rrrr+Ôs    zCondition.__init__cCst |¡|j|j|j|jfS)N)r r2rSrTrUrV)r$rrrr4Ûs zCondition.__getstate__cCs |\|_|_|_|_| ¡dS)N)rSrTrUrVr )r$r5rrrr6àszCondition.__setstate__cCs |j ¡S)N)rSr/)r$rrrr/åszCondition.__enter__cGs |jj|ŽS)N)rSr0)r$r1rrrr0èszCondition.__exit__cCs|jj|_|jj|_dS)N)rSr-r.)r$rrrr ës zCondition._make_methodscCsJy|jj ¡|jj ¡}Wntk r4d}YnXd|jj|j|fS)NrCz <%s(%s, %s)>)rTrrArUrDrEr:rS)r$Z num_waitersrrrrFïs   zCondition.__repr__c Cs‚|jj ¡stdƒ‚|j ¡|jj ¡}xt|ƒD]}|j ¡q4Wz|j  d|¡S|j  ¡xt|ƒD]}|j  ¡qjWXdS)Nz,must acquire() condition before using wait()T) rSrrLÚAssertionErrorrTr.rOrrVr-rU)r$ÚtimeoutrRr)rrrÚwait÷s   zCondition.waitrcCs¸|jj ¡stdƒ‚|j d¡r(tdƒ‚x(|j d¡rP|j d¡}|s*tdƒ‚q*Wd}x*||kr€|j d¡r€|j ¡|d7}qXW|r´xt |ƒD]}|j ¡qWx|j d¡r²q¤WdS)Nzlock is not ownedFz;notify: Should not have been able to acquire_wait_semaphorez>notify: Bug in sleeping_count.acquire- res should not be Falserr) rSrrLrXrVr-rUrTr.r)r$ÚnZresZsleepersr)rrrÚnotifys   zCondition.notifycCs|jtjddS)N)r[)r\rÚmaxsize)r$rrrÚ notify_all(szCondition.notify_allcCsh|ƒ}|r|S|dk r$t ¡|}nd}d}x6|sb|dk rP|t ¡}|dkrPP| |¡|ƒ}q.W|S)Nr)ÚtimeZ monotonicrZ)r$Z predicaterYÚresultZendtimeZwaittimerrrÚwait_for+s   zCondition.wait_for)N)N)r)N)r:r;r<r+r4r6r/r0r rFrZr\r^rarrrrrÒs   c@s6eZdZdd„Zdd„Zdd„Zdd„Zd d d „Zd S) rcCs | | ¡¡|_| d¡|_dS)Nr)rrÚ_condrÚ_flag)r$r(rrrr+CszEvent.__init__c Cs0|j |j d¡r"|j ¡dSdSQRXdS)NFT)rbrcr-r.)r$rrrÚis_setGs   z Event.is_setc Cs6|j&|j d¡|j ¡|j ¡WdQRXdS)NF)rbrcr-r.r^)r$rrrÚsetNs  z Event.setc Cs"|j|j d¡WdQRXdS)NF)rbrcr-)r$rrrÚclearTsz Event.clearNc CsT|jD|j d¡r |j ¡n |j |¡|j d¡rF|j ¡dSdSQRXdS)NFT)rbrcr-r.rZ)r$rYrrrrZXs     z Event.wait)N)r:r;r<r+rdrerfrZrrrrrAs c@sZeZdZddd„Zdd„Zdd„Zedd „ƒZejd d „ƒZed d „ƒZ e jd d „ƒZ dS)ÚBarrierNc CsRddl}ddlm}|| d¡dƒ}| ¡}| |||||f¡d|_d|_dS)Nrr)Ú BufferWrapperr)r)ÚstructÚheaprhZcalcsizerr6Ú_staterO) r$ZpartiesÚactionrYr(rirhÚwrapperZcondrrrr+js zBarrier.__init__cCs.|\|_|_|_|_|_|j ¡ d¡|_dS)Nr))Ú_partiesÚ_actionÚ_timeoutrbÚ_wrapperZcreate_memoryviewÚcastÚ_array)r$r5rrrr6sszBarrier.__setstate__cCs|j|j|j|j|jfS)N)rnrorprbrq)r$rrrr4xs zBarrier.__getstate__cCs |jdS)Nr)rs)r$rrrrk|szBarrier._statecCs||jd<dS)Nr)rs)r$r&rrrrk€scCs |jdS)Nr)rs)r$rrrrO„szBarrier._countcCs||jd<dS)Nr)rs)r$r&rrrrOˆs)NN) r:r;r<r+r6r4ÚpropertyrkÚsetterrOrrrrrghs   rg)Ú__all__rMrr=rr_Úr r r r r Ú ImportErrorÚlistrrPr?r@ÚobjectrrrrrrrgrrrrÚ s.    Mo'