ó
…¾^Yc           @   sÊ   d  Z  d d l Z d d l Z d d l Z d d l Z d d l m Z d Z d Z e j	 d k rp e j
 j Z n	 e j Z e j Z d e f d	 „  ƒ  YZ d
 e f d „  ƒ  YZ e d e ƒ d „  ƒ Z d S(   s>   Monkey-patching to add multiprocessing support for coverage.pyiÿÿÿÿN(   t   contracts   _coverage$patchedt   _COVERAGE_RCFILEi   i   t   ProcessWithCoveragec           B   s   e  Z d  Z d „  Z RS(   s<   A replacement for multiprocess.Process that starts coverage.c         C   sÌ   d d l  m } t j t } | d t d | ƒ } | j ƒ  | j } z- | j d ƒ rg | j	 d ƒ n  t
 |  ƒ SWd | j d ƒ r” | j	 d ƒ n  | j ƒ  | j ƒ  | j d ƒ rÇ | j	 d	 ƒ n  Xd S(
   s,   Wrapper around _bootstrap to start coverage.iÿÿÿÿ(   t   Coveraget   data_suffixt   config_filet	   multiprocs!   Calling multiprocessing bootstrapNs"   Finished multiprocessing bootstraps   Saved multiprocessing data(   t   coverageR   t   ost   environt   COVERAGE_RCFILE_ENVt   Truet   startt   debugt   shouldt   writet   original_bootstrapt   stopt   save(   t   selfR   t   rcfilet   covR   (    (    s4   /tmp/pip-build-hU8Cw8/coverage/coverage/multiproc.pyt
   _bootstrap   s    
	

(   t   __name__t
   __module__t   __doc__R   (    (    (    s4   /tmp/pip-build-hU8Cw8/coverage/coverage/multiproc.pyR      s   t   Stowawayc           B   s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   sL   An object to pickle, so when it is unpickled, it can apply the monkey-patch.c         C   s   | |  _  d  S(   N(   R   (   R   R   (    (    s4   /tmp/pip-build-hU8Cw8/coverage/coverage/multiproc.pyt   __init__4   s    c         C   s   i |  j  d 6S(   NR   (   R   (   R   (    (    s4   /tmp/pip-build-hU8Cw8/coverage/coverage/multiproc.pyt   __getstate__7   s    c         C   s   t  | d ƒ d  S(   NR   (   t   patch_multiprocessing(   R   t   state(    (    s4   /tmp/pip-build-hU8Cw8/coverage/coverage/multiproc.pyt   __setstate__:   s    (   R   R   R   R   R   R   (    (    (    s4   /tmp/pip-build-hU8Cw8/coverage/coverage/multiproc.pyR   2   s   		R   c            s­   t  t t ƒ r d St j d k r1 t j t _ n	 t t _ ˆ t	 j
 t <y d d l m } | j ‰  Wn t t f k
 r} n X‡  ‡ f d †  } | | _ t t t t ƒ d S(   sà   Monkey-patch the multiprocessing module.

    This enables coverage measurement of processes started by multiprocessing.
    This involves aggressive monkey-patching.

    `rcfile` is the path to the rcfile being used.

    Ni   i   iÿÿÿÿ(   t   spawnc            s    ˆ  |  ƒ } t  ˆ ƒ | d <| S(   s@   Get the original preparation data, and also insert our stowaway.t   stowaway(   R   (   t   namet   d(   t   original_get_preparation_dataR   (    s4   /tmp/pip-build-hU8Cw8/coverage/coverage/multiproc.pyt"   get_preparation_data_with_stowawaya   s    (   i   i   (   t   hasattrt   multiprocessingt   PATCHED_MARKERt   syst   version_infoR   R   t   OriginalProcesst   ProcessR   R	   R
   R    t   get_preparation_datat   ImportErrort   AttributeErrort   setattrR   (   R   R    R%   (    (   R$   R   s4   /tmp/pip-build-hU8Cw8/coverage/coverage/multiproc.pyR   >   s    		(   i   i   (   R   R'   t   multiprocessing.processR   R)   t   coverage.miscR    R(   R
   R*   t   processt   BaseProcessR+   R,   R   R   R   t   objectR   t   strR   (    (    (    s4   /tmp/pip-build-hU8Cw8/coverage/coverage/multiproc.pyt   <module>   s   		