
][\                 @   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	 Gd 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               @   sX   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  j   |  _ d  |  _ d  S)N)	threadingZLock_lock_fd)self r   7/usr/lib/python3.4/multiprocessing/semaphore_tracker.py__init__   s    zSemaphoreTracker.__init__c             C   s   |  j    |  j S)N)r   r   )r   r   r   r   getfd!   s    
zSemaphoreTracker.getfdc             C   s  |  j   |  j d k	 r d Sg  } y | j t j j    Wn t k
 rQ Yn Xd } t j   \ } } z yW | j |  t	 j
   } | g t j   } | d | | g 7} t j | | |  Wn t j |    Yn
 X| |  _ Wd t j |  XWd QXd 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.Nz;from multiprocessing.semaphore_tracker import main;main(%d)z-c)r
   r   appendsysstderrfileno	Exceptionospiper   Zget_executabler   Z_args_from_interpreter_flagsZspawnv_passfdsclose)r   Zfds_to_passcmdrwZexeargsr   r   r   r   %   s*    
zSemaphoreTracker.ensure_runningc             C   s   |  j  d |  d S)z2Register name of semaphore with semaphore tracker.ZREGISTERN)_send)r   namer   r   r   r   C   s    zSemaphoreTracker.registerc             C   s   |  j  d |  d S)z4Unregister name of semaphore with semaphore tracker.Z
UNREGISTERN)r   )r   r   r   r   r   r   G   s    zSemaphoreTracker.unregisterc             C   sw   |  j    d j | |  j d  } t |  d k rF t d   n  t j |  j |  } | t |  k ss t  d  S)Nz{0}:{1}
asciii   zname too long)	r   formatencodelen
ValueErrorr   writer   AssertionError)r   r   r   msgnbytesr   r   r   r   K   s    
zSemaphoreTracker._sendN)	__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r   r      s   r   c          ,   C   s  t  j  t  j t  j  t  j  t  j t  j  x= t j t j f D]) } y | j   Wq? t k
 rg Yq? Xq? Wt	   } z t
 |  d   } x | D] } yg | j   j d  \ } } | d k r | j |  n, | d k r | j |  n t d |   Wq t k
 r4y t j t j     Wn Yn XYq Xq WWd QXWd | r|y t j d t |   Wq|t k
 rxYq|Xn  xu | D]m } zc | j d  } y t j |  Wn< t k
 r} z t j d	 | | f  WYd d } ~ Xn XWd XqWXd 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_infowarningswarnr"   decode_multiprocessingZ
sem_unlink)fdfcacheliner   r   er   r   r   main]   sJ    			.rE   )r   r-   r   r	   r<   r?    r   r   __all__objectr   Z_semaphore_trackerr   r   r   r   rE   r   r   r   r   <module>   s   ;					