B ÇÍ·g½w âã@sŒddlZddlZddlZddlZddlZddlZddlmZddlmZdddgZ Gdd „d e ƒZ e ƒZ e j Z e jZe jZe jZd d „ZdS) éNé)Úspawn)ÚutilÚensure_runningÚregisterÚ unregisterc@s<eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd S)ÚSemaphoreTrackercCst ¡|_d|_d|_dS)N)Ú threadingZLockÚ_lockÚ_fdÚ_pid)Úself©rúD/opt/alt/python37/lib/python3.7/multiprocessing/semaphore_tracker.pyÚ__init__s zSemaphoreTracker.__init__cCs| ¡|jS)N)rr )r rrrÚgetfd"szSemaphoreTracker.getfdc Cs|j|jdk rRt |jtj¡\}}|s0dSt |j¡d|_d|_t d¡g}y|  t j   ¡¡Wnt k r~YnXd}t ¡\}}zlyB|  |¡t ¡}|gt ¡}|d||g7}t |||¡}Wnt |¡‚YnX||_||_Wdt |¡XWdQRXdS)z®Make sure that semaphore tracker process is running. This can be run from any process. Usually a child process will use the semaphore created by its parent.NzWsemaphore_tracker: process died unexpectedly, relaunching. Some semaphores might leak.z;from multiprocessing.semaphore_tracker import main;main(%d)z-c)r r ÚosÚwaitpidÚWNOHANGÚcloser ÚwarningsÚwarnÚappendÚsysÚstderrÚfilenoÚ ExceptionÚpiperZget_executablerZ_args_from_interpreter_flagsZspawnv_passfds) r ÚpidZstatusZ fds_to_passÚcmdÚrÚwZexeÚargsrrrr&s8        zSemaphoreTracker.ensure_runningcCs| d|¡dS)z2Register name of semaphore with semaphore tracker.ZREGISTERN)Ú_send)r ÚnamerrrrQszSemaphoreTracker.registercCs| d|¡dS)z4Unregister name of semaphore with semaphore tracker.Z UNREGISTERN)r#)r r$rrrrUszSemaphoreTracker.unregistercCs`| ¡d ||¡ d¡}t|ƒdkr.tdƒ‚t |j|¡}|t|ƒks\td |t|ƒ¡ƒ‚dS)Nz{0}:{1} Úasciiiz name too longznbytes {0:n} but len(msg) {1:n}) rÚformatÚencodeÚlenÚ ValueErrorrÚwriter ÚAssertionError)r rr$ÚmsgÚnbytesrrrr#Ys zSemaphoreTracker._sendN) Ú__name__Ú __module__Ú __qualname__rrrrrr#rrrrrs +rcCsªt tjtj¡t tjtj¡x6tjtjfD]&}y | ¡Wq.tk rRYq.Xq.Wt ƒ}z¨t |dƒ”}xŒ|D]„}yJ|  ¡  d¡\}}|dkrž|  |¡n |dkr²| |¡n td|ƒ‚Wqrtk rôytjt ¡ŽWn YnXYqrXqrWWdQRXWd|rs   J