Yf @ 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)utilensure_runningregister 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) threadingZLock_lock_fd)self r F/opt/alt/python35/lib64/python3.5/multiprocessing/semaphore_tracker.py__init__ s zSemaphoreTracker.__init__c C s | j | j S)N)r r )r r r r getfd! s zSemaphoreTracker.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 QRXd 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 appendsysstderrfileno Exceptionospiper Zget_executabler Z_args_from_interpreter_flagsZspawnv_passfdsclose)r Zfds_to_passcmdrwZexeargsr r r r % s* zSemaphoreTracker.ensure_runningc C s | j d | d S)z2Register name of semaphore with semaphore tracker.ZREGISTERN)_send)r namer r r r C s zSemaphoreTracker.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 zSemaphoreTracker.unregisterc C st | j d j | | j d } t | d k rC t d t j | j | } | t | k sp t d S)Nz{0}:{1} asciii z name too long) r formatencodelen ValueErrorr writer AssertionError)r r r msgnbytesr r r r K s zSemaphoreTracker._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 r4y t j t j Wn Yn XYq Xq WWd QRXWd | rzy t j d t | Wn t k ryYn Xxu | D]m } zc | j d } y t j | Wn<