+
    üÐjÿ  ã                   óÔ   € R t ^ RIHt  ! R R4      tR tR]n        R tR tR tR	 t	RR
 lt
]! 4       tR tR tR tRsRsRsRs ^ RIt]t]
! R4       . ROtR#   ] d    Rt Li ; i)zT
A module to provide some very basic threading primitives, such as
synchronization.
©Úwrapsc                   ó*   a € ] tR t^t o RtR tRtV tR# )Ú	DummyLockz>
Hack to allow locks to be unpickled on an unthreaded system.
c                ó   € \         R3# ©N© ©Úunpickle_lock©Úselfs   &Ú;/usr/lib/python3/dist-packages/twisted/python/threadable.pyÚ
__reduce__ÚDummyLock.__reduce__   s   € Ü˜rÐ"Ð"ó    r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__static_attributes__Ú__classdictcell__©Ú__classdict__s   @r   r   r      s   ø‡ € ñ÷#ð #r   r   c                  ó:   € \         e   \        4       # \        4       # ©N)ÚthreadingmoduleÚXLockr   r   r   r   r
   r
      s   € ÜÒ"Ü‹wˆä‹{Ðr   Tc                 óü   € R V P                   9  dQ   \        P                  4        R V P                   9  d   \        4       V P                   R &   \        P	                  4        V P
                  P                  4        R# )Ú_threadable_lockN)Ú__dict__Ú_synchLockCreatorÚacquirer   Úreleaser   r   s   &r   Ú	_synchPrer$   !   sU   € Ø §¡Ô.Ü×!Ñ!Ô#Ø T§]¡]Ô2Ü05³ˆD�M‰MÐ,Ñ-Ü×!Ñ!Ô#Ø×Ñ×!Ñ!Ö#r   c                 ó:   € V P                   P                  4        R # r   )r   r#   r   s   &r   Ú
_synchPostr&   *   s   € Ø×Ñ×!Ñ!Ö#r   c                 ó0   a€ \        S4      V3R  l4       pV# )c                 ój   <€ \        V 4        S! V .VO5/ VB \        V 4       #   \        T 4       i ; ir   )r$   r&   )r   ÚargsÚkwargsÚfunctions   &*,€r   ÚsyncÚ_sync.<locals>.sync/   s2   ø€ ä�$Œð	Ù˜DÐ2 4Ò2¨6Ñ2ä�tÕøŒJ�tÕús   Ž% ¥2r   )Úklassr+   r,   s   &f r   Ú_syncr/   .   s    ø€ Ü
ˆ8ƒ_ôó ðð €Kr   c                 ó¢   € \         eG   V  F>  pVP                   F+  p\        WP                  V,          4      p\	        WV4       K-  	  K@  	  R# R# )a  
Make all methods listed in each class' synchronized attribute synchronized.

The synchronized attribute should be a list of strings, consisting of the
names of methods that must be synchronized. If we are running in threaded
mode these methods will be wrapped with a lock.
N)r   Úsynchronizedr/   r    Úsetattr)Úklassesr.   Ú
methodNamer,   s   *   r   Úsynchronizer5   :   sF   € ô Ò"ÛˆEØ#×0Ô0�
Ü˜U§N¡N°:Õ$>Ó?�Ü˜¨4Ö0ó 1ó ñ #r   c                óÔ   € V '       dI   \         '       g;   \        e(   Rs  ! R R\        P                  4      s\        4       sR# \        R4      hR# \         '       d   \        R4      hR# )zZInitialize threading.

Don't bother calling this.  If it needs to happen, it will happen.
NTc                   ó&   a € ] tR t^Ut o R tRtV tR# )r   c                ó   € \         R3# r   r	   r   s   &r   r   ÚXLock.__reduce__V   s   € Ü -¨rÐ2Ð2r   r   N)r   r   r   r   r   r   r   r   s   @r   r   r   U   s   ø‡ € ÷3ð 3r   r   z:Cannot initialize threading, platform lacks thread supportzCannot uninitialize threads)Úthreadedr   Ú_RLockr   r!   ÚRuntimeError)Úwith_threadss   &r   Úinitr>   I   s^   € ÷ ß‹xÜÒ*Ø�ô3œO×2Ñ2ô 3ô %*£GÒ!ä"ØPóð ñ ÷ ‹8ÜÐ<Ó=Ð=ár   c                  óZ   € \         f   \        # \         P                  4       P                  # r   )r   Ú_dummyIDÚcurrent_threadÚidentr   r   r   ÚgetThreadIDrC   h   s"   € ÜÒÜˆÜ×)Ñ)Ó+×1Ñ1Ð1r   c                 ó$   € \         \        4       8H  # )zCAre we in the thread responsible for I/O requests (the event loop)?)ÚioThreadrC   r   r   r   ÚisInIOThreadrF   n   s   € ä”{“}Ñ$Ð$r   c                 ó   € \        4       sR# )z8Mark the current thread as responsible for I/O requests.N)rC   rE   r   r   r   ÚregisterAsIOThreadrH   s   s   € ô ‹}‚Hr   NF)é   )rF   rH   rC   r   )r   Ú	functoolsr   r   r
   Ú__safe_for_unpickling__r$   r&   r/   r5   r>   Úobjectr@   rC   rF   rH   rE   r:   r!   r   Ú	threadingÚ_threadingmoduler   ÚImportErrorÚ__all__r   r   r   Ú<module>rQ      s¤   ðñ
õ ÷#ñ #òð )-€Ô %ò$ò$ò	ò1ôñ8 ‹8€ò2ò%ò
ð €Ø€àÐ Ø€ðÛ(ð '€OÙˆ„Jò I‚øð ô Ø‚Oðús   ÁA Á	A'Á&A'