
O'^c           @@  s#  d  d l  m Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l m Z 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 m Z d
 d d d d g Z y
 e Z Wn' e k
 r d e f d     YZ n Xd Z e j d k a d   Z e j d k ry d  d l Z Wn e k
 rKd  d l Z n Xd  d l Z e Z  e Z! e j" Z# e j$ Z% e j& Z& e
 j' e j  Z( d
 e) f d     YZ* n y d  d l Z Wn e k
 rd  d l Z n Xd  d l+ Z+ y d  d l, Z, Wn e k
 rd  d l Z, n Xd Z- e j d k o:e. e d e  Z  e j/ j0   j1 d  Z! e j2 Z# e j3 Z& d e d  Z% d
 e) f d     YZ* e! re j5 j6 e j7 d  a8 n	 e j/ a8 d   Z9 d   Z: d   Z; d   Z< d   Z= d    Z> d!   Z? d"   Z@ d#   ZA d$   ZB g  ZC d%   ZD d S(&   i    (   t   absolute_importN(   t   loadt   HIGHEST_PROTOCOL(   t   util(   t   process(   t	   int_typesi   (   t   dump(   t   _winapit   Popent   assert_spawningt   exitt	   duplicatet   closet   WindowsErrorc           B@  s   e  Z RS(    (   t   __name__t
   __module__(    (    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyR      s   s   Will add directory %r to path! This is necessary to accommodate pre-Django 1.4 layouts using setup_environ.
You can skip this warning by adding a DJANGO_SETTINGS_MODULE=settings environment variable.
t   win32c         C@  s,   t  j   s( t d t |   j   n  d  S(   NsF   %s objects should only be shared between processes through inheritance(   R   t   thread_is_spawningt   RuntimeErrort   typeR   (   t   self(    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyR	   4   s    c           B@  s_   e  Z e j   Z d    Z e j d  Z d d  Z
 d   Z e d    Z e d    Z RS(   c         C@  s  d d l  m } t   t j j   t j j   d  |  _ t	 j
   \ } } | |  _ t r t	 j   |  _ |  j d k rt	 j |  d t j k r d d  l } | j   n  | j   } t	 j |  qn t	 j
   \ } } t   t |  g }	 t	 j   |  _ |  j d k rCt	 j |  t	 j |  t	 j t j |	  n  t | j  }
 t	 j |  t	 j | d  } |  j t j _ z$ t |
 | t   t | | t   Wd  t j ` | j   Xt	 j |  t! j" |  t	 j |  j f  d  S(   Ni    (   t
   connectiont   randomt   wb(#   t   billiardR   t   _Django_old_layout_hack__savet   syst   stdoutt   flusht   stderrt   Nonet
   returncodet   ost   pipet   sentinelt   _forking_is_enabledt   forkt   pidR   t   modulesR   t   seedt
   _bootstrapt   _exitt   get_command_linet   strt   execvt
   executablet   get_preparation_datat   _namet   fdopenR   t   _tlst   process_handleR   R   R   t   Finalize(   R   t   process_objR   t   rt   wR   t   codet   from_parent_fdt   to_child_fdt   cmdt	   prep_datat   to_child(    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyt   __init__X   sD    			c         C@  s   |  j  d  k r y t j |  j |  \ } } Wn t j k
 rE d  SX| |  j k r t j |  rz t j |  |  _  q t j |  s t	  t j
 |  |  _  q n  |  j  S(   N(   R   R   R    t   waitpidR%   t   errort   WIFSIGNALEDt   WTERMSIGt	   WIFEXITEDt   AssertionErrort   WEXITSTATUS(   R   t   flagR%   t   sts(    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyt   poll   s    c         C@  sp   |  j  d  k ri | d  k	 rG t |  j g g  g  |  d } | sG d  Sn  |  j | d k rb t j n d  S|  j  S(   Ni    g        (   R   R   t   _selectR"   RG   R    t   WNOHANG(   R   t   timeoutR5   (    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyt   wait   s    "c         C@  sb   |  j  d  k r^ y t j |  j t j  Wq^ t k
 rZ |  j d d  d  k r[   q[ q^ Xn  d  S(   NRJ   g?(	   R   R   R    t   killR%   t   signalt   SIGTERMt   OSErrorRK   (   R   (    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyt	   terminate   s    c           C@  s'   t  r
 t St t j d d   d  k	 Sd  S(   NR2   (   R#   t   Falset   getattrR   R1   R   (    (    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyR      s    c         C@  s   |  S(   N(    (   t   handle(    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyt   duplicate_for_child   s    N(   R   R   t   threadt   _localR1   R=   R    RI   RG   R   RK   RP   t   staticmethodR   RT   (    (    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyR   T   s   	.
	i   t   frozens   pythonservice.exec         C@  s   | d  k r t j   } n  t j t j   |  | d | t j  } t j d d k  s{ t j d d k r t j d d k  r | j   } n  | S(   Ni    i   i   (   R   t   _subprocesst   GetCurrentProcesst   DuplicateHandlet   DUPLICATE_SAME_ACCESSR   t   version_infot   Detach(   RS   t   target_processt   inheritablet   h(    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyR      s    &c           B@  s_   e  Z d  Z e j   Z d   Z e d    Z e d    Z	 d d  Z d   Z d   Z RS(   sH   
        Start a subprocess to run the code of a process object
        c      
   C@  s  t    t j   \ } } t t j |  d t } t j |  t   | g } d j	 d   | D  } t
 j t | d  d  d d d  d  d  	 \ } } } }	 t | t  r t |  n	 | j   t | t  r t |  n	 | j   | |  _ d  |  _ | |  _ t |  |  _ t | j  }
 t j | d  } t |  t j _ z$ t |
 | t  t | | t  Wd  t j ` | j   Xd  S(   NR`   t    c         s@  s   |  ] } d  | Vq d S(   s   "%s"N(    (   t   .0t   x(    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pys	   <genexpr>   s    i   i    R   (   R   R    R!   R   t   msvcrtt   get_osfhandlet   TrueR   R*   t   joinRY   t   CreateProcesst   _python_exeR   t
   isinstanceR   t   CloseR%   R   t   _handlet   intR"   R.   R/   R0   R   R1   R2   R   R   (   R   R4   t   rfdt   wfdt   rhandleR:   t   hpt   htR%   t   tidR;   R<   (    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyR=      s.    -%
				c           C@  s   t  t j d d   d  k	 S(   NR2   (   RR   R   R1   R   (    (    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyR     s    c         C@  s   t  |  t j j  S(   N(   R   R   R1   R2   (   RS   (    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyRT     s    c         C@  s   |  j  d  k r | d  k r' t j } n t d t | d d   } t j t |  j  |  } | t j k r t j	 |  j  } | t
 k r t j } n  | |  _  q n  |  j  S(   Ni    i  g      ?(   R   R   RY   t   INFINITEt   maxRn   t   WaitForSingleObjectRm   t   WAIT_OBJECT_0t   GetExitCodeProcesst	   TERMINATERM   RN   (   R   RJ   t   msecst   resR7   (    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyRK     s    c         C@  s   |  j  d d  S(   NRJ   i    (   RK   (   R   (    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyRG   $  s    c         C@  se   |  j  d  k ra y t j t |  j  t  Wqa t k
 r] |  j d d  d  k r^   q^ qa Xn  d  S(   NRJ   g?(	   R   R   RY   t   TerminateProcessRn   Rm   Rz   R   RK   (   R   (    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyRP   '  s    N(   R   R   t   __doc__RU   RV   R1   R=   RW   R   RT   R   RK   RG   RP   (    (    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyR      s   	$	s
   python.exec         C@  s
   |  a  d  S(   N(   Rj   (   t   exe(    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyt   set_executable9  s    c         C@  sS   t  |   d k rK |  d d k rK t  |   d k s: t  d t j d <t St Sd S(   s=   
    Return whether commandline indicates we are forking
    i   i   s   --billiard-forki   t   1t   FORKED_BY_MULTIPROCESSINGN(   t   lenRC   R    t   environRg   RQ   (   t   argv(    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyt
   is_forking>  s
    "c           C@  s'   t  t j  r# t   t j   n  d S(   sE   
    Run code for process object if this in not the main process
    N(   R   R   R   t   mainR
   (    (    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyt   freeze_supportJ  s    c          C@  sl   t  j   j d k r3 t t j  r3 t d   n  t t d t  rR t j	 d g Sd }  t
 d |  d g Sd S(   sJ   
    Returns prefix of command line used for spawning a child process
    s  
        Attempt to start a new process before the current process
        has finished its bootstrapping phase.

        This probably means that have forgotten to use the proper
        idiom in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce a Windows executable.RX   s   --billiard-forks)   from billiard.forking import main; main()s   -cN(    (   R   t   current_processt	   _identityR   R   R   R   RR   RQ   R-   Rj   (   t   prog(    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyR*   S  s    $c          C@  s  d t  j k r y t  j d }  Wn t k
 r4 d  SXt j j d  } | oS | j } y |  j d d  \ } } Wn t k
 r d  SXt	 |  } y t  j
 j t |   } Wn t k
 r d  SX| r t j t t t  j
 j |    n  | t  j d <n  d  S(   Nt   DJANGO_PROJECT_DIRt   DJANGO_SETTINGS_MODULEs   django.conf.settingst   .i   (   R    R   t   KeyErrorR   R&   t   gett
   configuredt   splitt
   ValueErrort
   __import__t   patht   normpatht   _module_parent_dirt   AttributeErrort   warningst   warnt   UserWarningt   W_OLD_DJANGO_LAYOUTt   realpath(   t   settings_namet   conf_settingsR   t   project_namet   _t   projectt   project_dir(    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyR   m  s(    	c           C@  s3   y t  j j t j d  Wn t k
 r. n Xd  S(   NR   (   R   R   t   appendR    R   R   (    (    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyt   _Django_old_layout_hack__load  s    c         C@  sG   t  j j t |    \ } } | t  j k s4 | rC t  j   } n  | S(   N(   R    R   R   t   _module_dirt   curdirt   getcwd(   t   modt   dirt   filename(    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyR     s    c         C@  s)   d |  j  k r" t j j |  j   S|  j  S(   Ns   __init__.py(   t   __file__R    R   t   dirname(   R   (    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyR     s    c          C@  s  t    t t j  s t  t a t t j d  }  t j d k r\ t	 j
 |  t j  } n |  } t j | d  } t t j   _ t |  } t |  y t j d j t j d <Wn! t k
 r n t k
 r n Xt j j d  } t j j d  p d } t j j d  } | rd	 d
 l m } d	 d l } | j   }	 |	 j t |   |	 j  st |	 _! | pst j" } t# | d  r| j$ |  }
 n | j% |  }
 | j& | p| j'  } |
 j( |  |	 j) |
  qn  t |  } t t j   _ | j*   | j+   } t, |  d S(   s6   
    Run code specifed by data received over pipe
    iR   t   rbt   __main__t   MP_MAIN_FILEt   _MP_FORK_LOGLEVEL_t   _MP_FORK_LOGFILE_t   _MP_FORK_LOGFORMAT_i    (   R   Nt   write(-   R   R   R   R   RC   RQ   R#   Rn   t   platformRe   t   open_osfhandleR    t   O_RDONLYR0   Rg   R   R   t   _inheritingR   t   prepareR&   R   R   R   R   R   R   R   R   t   loggingt
   get_loggert   setLevelt   handlerst   _rudimentary_setupt
   __stderr__t   hasattrt   StreamHandlert   FileHandlert	   Formattert   DEFAULT_LOGGING_FORMATt   setFormattert
   addHandlerR   R(   R
   (   RS   t   fdt   from_parentt   preparation_datat   loglevelt   logfilet   formatR   R   t   loggert   handlert	   formatterR   t   exitcode(    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyR     sP    
		
c         C@  s.  d d l  m } m } t d |  d t j d t j d | d t j d t j	   j
  } | d k	 rt | j   | d	 <n  t r*t r*t t j d
 d d  } | r t j d d k r t j d } n  | d k	 r*t j j |  rt j d k	 rt j j t j |  } n  t j j |  | d <q*n  | S(   sM   
    Return info about parent needed by child to unpickle process object
    i    (   t   _loggert   _log_to_stderrt   namet   sys_patht   sys_argvt   log_to_stderrt   orig_dirt   authkeyt	   log_levelR   R   t    s   -ct	   main_pathN(   R   s   -c(   t   billiard.utilR   R   t   dictR   R   R   R   t   ORIGINAL_DIRR   R   R   t   getEffectiveLevelt   WINEXEt
   WINSERVICERR   R&   R    t   isabsRh   R   (   R   R   R   t   dR   (    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyR.     s(    			c   
      C@  s  t  j t j d  d |  k r6 |  d t j   _ n  d |  k rX |  d t j   _ n  d |  k r{ |  d r{ t j	   n  d |  k r t j
   j |  d  n  d |  k r |  d t _ n  d |  k r |  d t _ n  d |  k r t j |  d  n  d	 |  k r|  d	 t _ n  d
 |  k r|  d
 } t j j t j j |   d } | d k rzt j j t j j |   } n  | d k rt j d } | | _ q| d k rd d l } | d k rd } nT t j j |  j d  rt j j t j j |   g } n t j j |  g } | t j k s;t |   | j | |  \ } } } z | j d | | |  } Wd | r| j   n  X| t j d <d | _ xS t | j j    D]9 }	 y |	 j  d k rd |	 _  n  Wqt! k
 rqXqWqn  d S(   sE   
    Try to get current process ready to unpickle process object
    R   R   R   R   R   R   R   R   R   R   i    R=   t   ipythonNs   __init__.pyt   __parents_main__("   t   old_main_modulesR   R   R&   R   R   R   t   _authkeyR   R   R   R   R   R   R    t   chdirR   t   splitextt   basenameR   R   t   impR   t
   startswithRC   t   find_modulet   load_moduleR   R   t   listt   __dict__t   valuesR   t	   Exception(
   t   dataR   t	   main_namet   main_moduleR   t   dirst   filet	   path_namet   etct   obj(    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyR     s^    
"!	$	(E   t
   __future__R    R    R   RM   R   t   pickleR   R   R   R   R   t   billiard.fiveR   t	   reductionR   t   compatR   R   t   __all__R   t	   NameErrorR   R   R   R#   R	   RU   t   ImportErrort   _threadt   selectRQ   R   R   R)   R
   t   dupR   R   t   _eintr_retryRH   t   objectR   Re   RY   Rz   RR   R-   t   lowert   endswitht   ExitProcesst   CloseHandleR   R   Rh   t   exec_prefixRj   R   R   R   R*   R   R   R   R   R   R.   R   R   (    (    (    s2   /tmp/pip-unpacked-wheel-40MfcW/billiard/forking.pyt   <module>
   s~   	
				d!		Q											9	"