ó
å™xTc           @   s	  d  d l  m Z d  d l m Z d  d l m Z d  d l m Z d  d l m Z 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 Z d  d l Z d  d l Z d e j f d „  ƒ  YZ e j ƒ  Z d	 e j f d
 „  ƒ  YZ d e j f d „  ƒ  YZ d e j f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d Z d Z d e f d „  ƒ  YZ y d  d l  Z  Wn' e! k
 rÉd e f d „  ƒ  YZ" n< Xd e  j# f d „  ƒ  YZ$ d „  Z% d e j f d „  ƒ  YZ" d S(   iÿÿÿÿ(   t   division(   t   easy_pickle(   t   Abort(   t   object_oriented_patterns(   t   adopt_init_argsNt   thread_with_callback_and_waitc           B   sA   e  Z d d i  d  „ Z d „  Z d „  Z d „  Z e d „ Z RS(   c         C   s{   | |  _  | |  _ t | ƒ |  _ |  j |  j d <| |  _ | |  _ t j d ƒ |  _ t j d ƒ |  _	 t
 j j |  ƒ d  S(   Nt   callbacki    (   t   _runt	   _run_argst   dictt	   _run_kwdst   _callback_proxyt	   _callbackt   _first_callbackt   Queuet   _caller_waitt   _queuet	   threadingt   Threadt   __init__(   t   selft   runR   t   first_callbackt   run_argst   run_kwds(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR      s    				c         C   s   |  j  |  j |  j Ž  d  S(   N(   R   R   R
   (   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR   #   s    c         C   s   |  j  ƒ  |  j j ƒ  d  S(   N(   t   startR   t   get(   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyt!   start_and_wait_for_first_callback&   s    
c         O   s|   |  j  d  k	 r= |  j  | | Ž  } d  |  _  |  j j d  ƒ n |  j | | Ž  } | t k r_ t S|  j j ƒ  } | rx t S| S(   N(   R   t   NoneR   t   putR   t   FalseR   R   (   R   t   argst   kwdst   resultt   last_iteration(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR   *   s    	c         C   s#   |  j  ƒ  r |  j j | ƒ n  |  S(   N(   t   isAliveR   R   (   R   R"   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyt   resume8   s    N(    (	   t   __name__t
   __module__R   R   R   R   R   R   R$   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR      s   			t   queue_monitor_threadc           B   s&   e  Z d  d „ Z d „  Z d „  Z RS(   g      ð?c         C   s8   | |  _  | |  _ t |  _ | |  _ t j j |  ƒ d  S(   N(   t   qt   cbR   t   _exitt   _sleep_intervalR   R   R   (   R   R(   R   t   sleep_interval(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR   @   s
    				c         C   sd   |  j  } xT |  j s_ |  j j ƒ  d k rO |  j j d d ƒ } |  j | ƒ q t j | ƒ q Wd  S(   Ni    t   timeouti   (   R+   R*   R(   t   qsizeR   R)   t   timet   sleep(   R   t   tR!   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR   G   s    	c         C   s   t  |  _ d  S(   N(   t   TrueR*   (   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyt   exitP   s    (   R%   R&   R   R   R3   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR'   ?   s   		t   file_monitor_threadc           B   s&   e  Z d  d „ Z d „  Z d „  Z RS(   g      ð?c         C   sY   t  j j | ƒ s t ‚ | |  _ | |  _ | |  _ t |  _ | |  _	 t
 j j |  ƒ d  S(   N(   t   ost   patht   isdirt   AssertionErrorR)   t   dir_namet
   file_namesR   R*   R+   R   R   R   (   R   R9   R:   R   R,   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR   T   s    					c         C   sÔ   |  j  } g  } g  } x¸ |  j sÏ t j |  j ƒ } x‰ | D]� } | | k rR q: q: | | k rœ t j t j j |  j | ƒ ƒ } | j	 | ƒ |  j
 | ƒ q: | |  j k r: | j	 | ƒ q: q: Wt j | ƒ q Wd  S(   N(   R+   R*   R5   t   listdirR9   R   t   loadR6   t   joint   appendR)   R:   R/   R0   (   R   R1   t   existing_filest   pending_filest   filest	   file_namet   data(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR   ]   s    	!c         C   s   t  |  _ d  S(   N(   R2   R*   (   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR3   o   s    (   R%   R&   R   R   R3   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR4   S   s   		t   simple_task_threadc           B   s8   e  Z d d  „ Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s/   t  j j |  ƒ | |  _ d  |  _ d  |  _ d  S(   N(   R   R   R   t   fR   t   return_valuet
   _exception(   R   t   thread_functiont   parent_window(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR   s   s    		c         C   s   |  j  d  k	 S(   N(   RF   R   (   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyt   is_completey   s    c         C   s   |  j  d  k	 S(   N(   RG   R   (   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyt   exception_raised|   s    c         C   sL   y |  j  ƒ  |  _ Wn2 t k
 rG } t j j t | ƒ ƒ | |  _ n Xd  S(   N(   RE   RF   t	   Exceptiont   syst   stderrt   writet   strRG   (   R   t   e(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR      s
    c         C   s   t  |  j ƒ S(   N(   RP   RG   (   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyt	   get_error†   s    N(   R%   R&   R   R   RJ   RK   R   RR   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyRD   r   s
   			t   child_process_messagec           B   s   e  Z d  „  Z RS(   c         C   s   t  |  t ƒ  ƒ d  S(   N(   R   t   locals(   R   t   message_typeRC   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR   Š   s    (   R%   R&   R   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyRS   ‰   s   t   child_process_pipec           B   s/   e  Z d  „  Z d d „ Z d „  Z d „  Z RS(   c         C   s   t  |  t ƒ  ƒ d  S(   N(   R   RT   (   R   t   connection_object(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR   Ž   s    c         C   s)   t  d d d | ƒ } |  j j | ƒ d  S(   NRU   t   abortedRC   (   RS   RW   t   send(   R   t   infot   message(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyt   send_confirm_abort‘   s    c         O   s   |  j  j | | Ž  S(   N(   RW   RY   (   R   R   R    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyRY   •   s    c         O   s   |  j  j | | Ž  S(   N(   RW   t   recv(   R   R   R    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR]   ˜   s    N(   R%   R&   R   R   R\   RY   R]   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyRV   �   s   		t   stdout_pipec           B   s5   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s   | |  _  d |  _ d  S(   Nt    (   t   _ct   _data(   R   t
   connection(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR   �   s    	c         C   s   |  j  | 7_  |  j ƒ  d  S(   N(   Ra   t   flush(   R   RC   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyRO   ¡   s    c         C   s   |  j  ƒ  d  S(   N(   t   _flush(   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyRc   ¥   s    c         C   s{   yG |  j  d k rF t d d d |  j  ƒ } |  j j | ƒ d |  _  n  Wn- t k
 rv } t j j d t | ƒ ƒ n Xd  S(   NR_   RU   t   stdoutRC   s   Exception in stdout_pipe: %s
(	   Ra   RS   R`   RY   RL   RM   t
   __stderr__RO   RP   (   R   R[   RQ   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyRd   ¨   s    c         C   s   d  S(   N(    (   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyt   close±   s    (   R%   R&   R   RO   Rc   Rd   Rg   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR^   œ   s
   					gš™™™™™É?i   t   stdout_pipe_bufferedc           B   s5   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         O   s&   t  j |  | | Ž t j ƒ  |  _ d  S(   N(   R^   R   R/   t   _last_t(   R   R   R    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR   ¹   s    c         C   s?   |  j  | 7_  t j ƒ  } | |  j t k r; |  j ƒ  n  d  S(   N(   Ra   R/   Ri   t   max_between_flushRc   (   R   RC   R1   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyRO   ½   s    c         C   s9   t  j  ƒ  } | |  j t k r5 |  j ƒ  | |  _ n  d  S(   N(   R/   Ri   t   wait_before_flushRd   (   R   R1   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyRc   Ã   s    
c         C   s   d  S(   N(    (   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyRg   É   s    c         C   s    |  j  d k r |  j ƒ  n  d  S(   NR_   (   Ra   Rd   (   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyt   __del__Ì   s    (   R%   R&   R   RO   Rc   Rg   Rl   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyRh   ¸   s
   				t   process_with_callbacksc           B   s   e  Z d  „  Z RS(   c         O   s   t  d ƒ ‚ d  S(   Ns,   The multiprocessing module is not available.(   t   ImportError(   R   R   R    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR   Ô   s    (   R%   R&   R   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyRm   Ó   s   t   _process_with_stdout_redirectc           B   s/   e  Z d d d d i  d e d  „ Z d „  Z RS(   c         C   sS   t  j j |  | | | | | ƒ | |  _ | r@ t | ƒ |  _ n t | ƒ |  _ d  S(   N(   t   multiprocessingt   ProcessR   R`   Rh   t   _stdoutR^   (   R   t   groupt   targett   nameR   t   kwargsRb   t   buffer_stdout(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR   Ø   s
    	c         C   sª  d d  l  } | j j |  j ƒ t j } |  j t _ d  } t j	 } | j j	 t _	 zyC |  j
 r— |  j
 |  j |  j |  j ƒ } t d d d | ƒ } n  WnÈ t k
 rÀ t d d d d  ƒ } n£ t k
 rb} | j j d k rt d | j j t | ƒ f ƒ } n t | d ƒ r"| j ƒ  n  d	 j t j t j ƒ  d
 ƒ ƒ } t d d d | | f ƒ } n XWd  | d  k	 r“|  j j ƒ  |  j j | ƒ n  | t _	 X| t _ d  S(   NiÿÿÿÿRU   t   returnRC   t   aborts   Boost.Pythons   Boost.Python.%s: %st   reset_modules   
i   t	   exception(   t   libtbx.callbackst	   call_backt   add_piped_callbackR`   RM   Re   Rr   R   t   warningst   showwarningt   _targett   _argst   _kwargsRS   R   RL   t	   __class__R&   t   RuntimeErrorR%   RP   t   hasattrRz   R=   t	   tracebackt	   format_tbt   exc_infoRd   RY   (   R   t   libtbxt
   old_stdoutR[   t   old_showwarningRF   RQ   t   traceback_str(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR   á   s:    			"
N(    (   R%   R&   R   R2   R   R   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyRo   ×   s   c         C   s   | j  t ƒ d  S(   N(   RY   R2   (   R   R    Rb   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyt   _process_target_function  s    c           B   sk   e  Z d i  e e e e e e e e d d  „ Z e d „ Z d „  Z d „  Z	 d „  Z
 d „  Z d „  Z RS(	   c         C   s[  t  j j |  ƒ | |  _ | |  _ t | ƒ |  _ t | d ƒ rš t | d ƒ rš t | d ƒ rš t | d ƒ rš t | d ƒ rš t |	 d ƒ rš t |
 d ƒ s  t ‚ | |  _	 | |  _
 | |  _ | |  _ | |  _ |	 |  _ |
 |  _ | |  _ t |  _ t |  _ t |  _ t |  _ d  |  _ d  |  _ | d  k sNt | t ƒ sNt | t ƒ sNt ‚ | |  _ d  S(   Nt   __call__(   R   R   R   R�   R‚   R	   Rƒ   R†   R8   t
   _cb_stdoutt	   _cb_finalt   _cb_errt	   _cb_abortt	   _cb_othert	   _cb_pauset
   _cb_resumet   _buffer_stdoutR   t   _abortt   _killedt
   _completedt   _errorR   t   _pidt   _child_processt
   isinstancet   intt   floatt   _sleep_after_start(   R   Rt   R   Rv   t   callback_stdoutt   callback_finalt   callback_errt   callback_abortt   callback_othert   callback_pauset   callback_resumeRw   t   sleep_after_start(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR   	  s:    																c         C   s    t  |  _ | r |  j ƒ  n  d  S(   N(   R2   R˜   t   kill(   R   t   force(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyRy   4  s    	c         C   sb   |  j  d  k	 r^ y' |  j  j ƒ  |  j d ƒ t |  _ Wn t k
 rP } | GHq^ X|  j ƒ  n  d  S(   Ngš™™™™™¹?(   R�   R   t	   terminateR=   R2   R™   t   OSErrorR“   (   R   RQ   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyRª   :  s    	c         C   s~   |  j  d k	 r t j d k s$ t ‚ y t j |  j  j | ƒ Wn5 t k
 ru } | GH|  j  j	 ƒ  sq |  j
 ƒ  n  t SXt Sd S(   sz   
      Signals the process using os.kill, which despite the name, can also
      pause or resume processes on Unix.
      t   win32N(   R�   R   RM   t   platformR8   R5   Rª   t   pidR­   t   is_aliveR“   R   R2   (   R   t   signal_numberRQ   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyt   send_signalE  s    $c         C   s#   |  j  t j ƒ r |  j ƒ  n  d  S(   N(   R³   t   signalt   SIGSTOPR•   (   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyt   pauseU  s    c         C   s#   |  j  t j ƒ r |  j ƒ  n  d  S(   N(   R³   R´   t   SIGCONTR–   (   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR$   Y  s    c   	      C   sF  |  j  d  k	 r" t j |  j  ƒ n  d  } t j ƒ  \ } } y` t d |  j d |  j d |  j	 d t
 d | ƒ d |  j ƒ } d t j d <| |  _ | j ƒ  Wn3 t k
 rÏ } t j j d	 t | ƒ ƒ d  } n XxJ| d  k	 r|  j rì Pn  |  j r| j ƒ  |  j ƒ  Pn  | j d
 ƒ s"qÓ n  | j ƒ  } t | t ƒ r| } d \ } } | j d k rv| j ƒ  |  j ƒ  Pq| j d k r˜|  j | j ƒ q| j d k rÄ|  j  | j ƒ t! |  _" Pq| j d k r| j \ } } |  j# | | ƒ t! |  _$ | j ƒ  PqqÓ |  j% | ƒ qÓ W| d  k	 rB| j& ƒ  rB| j' ƒ  n  d  S(   NRt   R   Rv   Rb   RW   Rw   t   1t   OMP_NUM_THREADSs!   Error starting child process: %s
i   RX   Re   Rx   R{   (   NN((   R¡   R   R/   R0   Rp   t   PipeRo   R�   R‚   Rƒ   RV   R—   R5   t   environR�   R   RL   RM   Rf   RO   RP   R™   R˜   R¬   R“   t   pollR]   Rž   RS   RU   R�   RC   R‘   R2   Rš   R’   R›   R”   R±   R=   (	   R   t   child_processt   parent_connt
   child_connRQ   t   pipe_outputR[   t   errort   traceback_info(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyR   ]  sb    				
	 	



		
(    N(   R%   R&   t   null_callbackR2   R   R   R   Ry   Rª   R³   R¶   R$   R   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyRm     s"   				(&   t
   __future__R    RŠ   R   t   libtbx.utilsR   R   t   oopR   R|   R   R   R   R‡   R´   R/   R5   RM   R   R   t   nullRÃ   R'   R4   RD   t   objectRS   RV   R^   Rk   Rj   Rh   Rp   Rn   Rm   Rq   Ro   RŽ   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/thread_utils.pyt   <module>   s>   ,-	