3 \ã@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)ÚSemaphoreTrackercCstjƒ|_d|_d|_dS)N)Ú threadingZLockÚ_lockÚ_fdÚ_pid)Úself©rú9/usr/lib64/python3.6/multiprocessing/semaphore_tracker.pyÚ__init__s zSemaphoreTracker.__init__cCs|jƒ|jS)N)rr )r rrrÚgetfd"szSemaphoreTracker.getfdc Cs|j��|jdk rRtj|jtjƒ\}}|s0dStj|jƒd|_d|_tjdƒg}y|j t j j ƒƒWnt k r~YnXd}tjƒ\}}zlyB|j |ƒtjƒ}|gtjƒ}|d||g7}tj|||ƒ}Wntj|ƒ‚YnX||_||_Wdtj|ƒ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|jd|ƒdS)z2Register name of semaphore with semaphore tracker.ZREGISTERN)Ú_send)r ÚnamerrrrQszSemaphoreTracker.registercCs|jd|ƒdS)z4Unregister name of semaphore with semaphore tracker.Z UNREGISTERN)r#)r r$rrrrUszSemaphoreTracker.unregistercCs@|jƒdj||ƒjdƒ}t|ƒdkr.tdƒ‚tj|j|ƒ}dS)Nz{0}:{1} Úasciiiz name too long)rÚformatÚencodeÚlenÚ ValueErrorrÚwriter )r rr$ÚmsgÚnbytesrrrr#Ys  zSemaphoreTracker._sendN) Ú__name__Ú __module__Ú __qualname__rrrrrr#rrrrrs +rc-Csªtjtjtjƒtjtjtjƒx6tjtjfD]&}y |jƒWq.tk rRYq.Xq.Wt ƒ}z¨t |dƒ�”}xŒ|D]„}yJ|j ƒj dƒ\}}|dkrž|j |ƒn |dkr²|j|ƒn td|ƒ‚Wqrtk rôytjtjƒŽWn YnXYqrXqrWWdQRXWd|�rs   I