U e5d@sdZddddddddgZd ZeZifd dZd dZd dZd dZdddZ ddZ Gddde Z Gddde Z dadaddZdS)a/Drop-in replacement for the thread module. Meant to be used as a brain-dead substitute so that threaded code does not need to be rewritten for when the thread module is not present. Suggested usage is:: try: import _thread except ImportError: import _dummy_thread as _thread errorstart_new_threadexit get_ident allocate_lockinterrupt_mainLockTypeRLocklcCst|ttkrtdt|ttkr4tddaz|||Wn.tk rZYnddl}|YnXdatrdat dS)aDummy implementation of _thread.start_new_thread(). Compatibility is maintained by making sure that ``args`` is a tuple and ``kwargs`` is a dictionary. If an exception is raised and it is SystemExit (which can be done by _thread.exit()) it is caught and nothing is done; all other exceptions are printed out by using traceback.print_exc(). If the executed function calls interrupt_main the KeyboardInterrupt will be raised when the function returns. z2nd arg must be a tuplez3rd arg must be a dictFNT) typetuple TypeErrordict_main SystemExit traceback print_exc _interruptKeyboardInterrupt)Zfunctionargskwargsrr%/usr/lib64/python3.8/_dummy_thread.pyrs cCstdS)z'Dummy implementation of _thread.exit().N)rrrrrr=scCsdS)zDummy implementation of _thread.get_ident(). Since this module should only be used when _threadmodule is not available, it is safe to assume that the current process is the only thread. Thus a constant can be safely returned. rrrrrrAscCstS)z0Dummy implementation of _thread.allocate_lock().rrrrrrJsNcCs|dk rtddS)z-Dummy implementation of _thread.stack_size().Nz'setting thread stack size not supportedr )r)sizerrr stack_sizeNsrcCstS)z0Dummy implementation of _thread._set_sentinel().rrrrr _set_sentinelTsrc@sFeZdZdZddZdddZeZdd Zd d Zd d Z ddZ dS)raClass implementing dummy implementation of _thread.LockType. Compatibility is maintained by maintaining self.locked_status which is a boolean that stores the state of the lock. Pickling of the lock, though, should not be done since if the _thread module is then used with an unpickled ``lock()`` from here problems could occur from this class not having atomic methods. cCs d|_dS)NF locked_statusselfrrr__init__cszLockType.__init__NcCsH|dks |rd|_dS|js&d|_dS|dkr@ddl}||dSdS)aDummy implementation of acquire(). For blocking calls, self.locked_status is automatically set to True and returned appropriately based on value of ``waitflag``. If it is non-blocking, then the value is actually checked and not set if it is already acquired. This is all done so that threading.Condition's assert statements aren't triggered and throw a little fit. NTr F)rtimesleep)r waitflagtimeoutr#rrracquirefs  zLockType.acquirecCs |dSN)release)r typvaltbrrr__exit__szLockType.__exit__cCs|js td|_dS)zRelease the dummy lock.FT)rrrrrrr)szLockType.releasecCs|jSr(rrrrrlockedszLockType.lockedcCs*d|jr dnd|jj|jjtt|fS)Nz<%s %s.%s object at %s>r.Zunlocked)r __class__ __module__ __qualname__hexidrrrr__repr__s   zLockType.__repr__)Nr") __name__r0r1__doc__r!r' __enter__r-r)r.r4rrrrrXs   cs:eZdZdZfddZd fdd Zfdd ZZS) raDummy implementation of threading._RLock. Re-entrant lock can be aquired multiple times and needs to be released just as many times. This dummy implemention does not check wheter the current thread actually owns the lock, but does accounting on the call counts. cstd|_dS)Nr )superr!_levelsrr/rrr!s zRLock.__init__Nr"cs$t||}|r |jd7_|S)zEAquire the lock, can be called multiple times in succession. r)r8r'r9)r r%r&r.r:rrr'sz RLock.acquirecs4|jdkrt|jdkr"t|jd8_dS)zERelease needs to be called once for every call to acquire(). r rN)r9rr8r)rr:rrr)s    z RLock.release)Nr")r5r0r1r6r!r'r) __classcell__rrr:rrs FTcCstr tndadS)z^Set _interrupt flag to True to have start_new_thread raise KeyboardInterrupt upon exiting.TN)rrrrrrrrs)N)r6__all__ TIMEOUT_MAX RuntimeErrorrrrrrrrobjectrrrrrrrrrs$    @