£Á°èZ¨Ä…–K§‚«“ô4“ÒÙ´dîfUÙÃÅ WKbyÊ¦•êŽ…È®FÒ¿ÊÎóCozá¬S@6{Í:›œêZÌ:Š•_%:¢¾¾~;‘Ã~èŠ©ÊÇí`ÔÑ©úë™µ'5I¿fš×WO%ø9¾«¾DK|€ùÍD”Ýs]nHÕ¶ê×Ó¼ãžªéUWŸÈË%DÒÕ¬ï‘]/Åcx  ‰ï2ß]ä6G[]S£ÔÏ¯rs{úëóµmÒï#UQxo·õÞCe]"±/aÙ&Eã4ú9Jé_ÞåëdãöKë)AÞ                  ¯¹ægƒÛowÐø^d™ý½ßB7áyMä9ÜÖUã
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<html>
B
     f[                 @   s   d dl Z d dlZd dlZd dlZd dlZd dlZddlmZ ddlmZ dddgZ	G dd	 d	e
Ze ZejZejZejZejZd
d ZdS )    N   )spawn)utilensure_runningregister
unregisterc               @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )SemaphoreTrackerc             C   s   t  | _d | _d | _d S )N)	threadingZLock_lock_fd_pid)self r   F/opt/alt/python37/lib64/python3.7/multiprocessing/semaphore_tracker.py__init__   s    
zSemaphoreTracker.__init__c             C   s   |    | jS )N)r   r   )r   r   r   r   getfd"   s    zSemaphoreTracker.getfdc       	   
   C   s  | j  | jdk	rRt| jtj\}}|s0dS t| j d| _d| _td g }y|	t
j  W n tk
r~   Y nX d}t \}}zlyB|	| t }|gt  }|d|| g7 }t|||}W n   t|  Y nX || _|| _W dt| X W dQ R X dS )zMake 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piper   Zget_executabler   Z_args_from_interpreter_flagsZspawnv_passfds)	r   pidZstatusZfds_to_passcmdrwZexeargsr   r   r   r   &   s8    





zSemaphoreTracker.ensure_runningc             C   s   |  d| dS )z2Register name of semaphore with semaphore tracker.ZREGISTERN)_send)r   namer   r   r   r   Q   s    zSemaphoreTracker.registerc             C   s   |  d| dS )z4Unregister name of semaphore with semaphore tracker.Z
UNREGISTERN)r#   )r   r$   r   r   r   r   U   s    zSemaphoreTracker.unregisterc             C   s`   |    d||d}t|dkr.tdt| j|}|t|ks\td|t|d S )Nz{0}:{1}
asciii   zname too longznbytes {0:n} but len(msg) {1:n})	r   formatencodelen
ValueErrorr   writer   AssertionError)r   r   r$   msgnbytesr   r   r   r#   Y   s    zSemaphoreTracker._sendN)	__name__
__module____qualname__r   r   r   r   r   r#   r   r   r   r   r      s   +r   c             C   s  t  t jt j t  t jt j x6tjtjfD ]&}y|  W q. tk
rR   Y q.X q.W t	 }zt
| d}x|D ]}yJ| d\}}|dkr|| n |dkr|| ntd| W qr tk
r   ytjt   W n   Y nX Y qrX qrW W dQ R X W d|r<ytdt|  W n tk
r:   Y nX xf|D ]^}zT|d}yt| W n6 tk
r } ztd	||f  W dd}~X Y nX W dX qBW X dS )
zRun semaphore tracker.rb   :s   REGISTERs
   UNREGISTERzunrecognized command %rNzRsemaphore_tracker: There appear to be %d leaked semaphores to clean up at shutdownr%   zsemaphore_tracker: %r: %s)signalSIGINTSIG_IGNSIGTERMr   stdinstdoutr   r   setopenstripsplitaddremoveRuntimeError
excepthookexc_infor   r   r(   decode_multiprocessingZ
sem_unlink)fdfcacheliner   r$   er   r   r   mainl   sJ    



(rI   )r   r3   r   r	   r   rC    r   r   __all__objectr   Z_semaphore_trackerr   r   r   r   rI   r   r   r   r   <module>   s   
J