B
    `                 @   s   d 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mZ ddl	m
Z
 dZejdkrdejjZnejZejZG dd deZG d	d
 d
eZe
eddd ZdS )z>Monkey-patching to add multiprocessing support for coverage.py    N)env)contractz_coverage$patched)      c               @   s   e Zd ZdZdd ZdS )ProcessWithCoveragez<A replacement for multiprocess.Process that starts coverage.c          	   O   s   yBddl m} |dd}d|_|  |j}|dr@|d W n6 tk
rx   td t	j
tjd	 tj   Y nX zt| f||S |dr|d |  |  |dr|d X d
S )z,Wrapper around _bootstrap to start coverage.r   )CoverageT)Zdata_suffixFZ	multiprocz!Calling multiprocessing bootstrapz0Exception during multiprocessing bootstrap init:)fileNz"Finished multiprocessing bootstrapzSaved multiprocessing data)coverager   Z_warn_preimported_sourcestart_debugZshouldwrite	Exceptionprint	traceback	print_excsysstdoutflushoriginal_bootstrapstopsave)selfargskwargsr   Zcovdebug r   Z/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/coverage/multiproc.py
_bootstrap   s*    





zProcessWithCoverage._bootstrapN)__name__
__module____qualname____doc__r   r   r   r   r   r      s   r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	StowawayzLAn object to pickle, so when it is unpickled, it can apply the monkey-patch.c             C   s
   || _ d S )N)rcfile)r   r#   r   r   r   __init__:   s    zStowaway.__init__c             C   s
   d| j iS )Nr#   )r#   )r   r   r   r   __getstate__=   s    zStowaway.__getstate__c             C   s   t |d  d S )Nr#   )patch_multiprocessing)r   stater   r   r   __setstate__@   s    zStowaway.__setstate__N)r   r   r    r!   r$   r%   r(   r   r   r   r   r"   8   s   r"   )r#   c          	      s   t ttrdS tjdkr"tjt_ntt_t	j
t	jd< yddlm} |j W n ttfk
rh   Y nX  fdd}||_tttd dS )	zMonkey-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.

    N)r   r   ZCOVERAGE_RCFILEr   )spawnc                s    | }t |d< |S )z@Get the original preparation data, and also insert our stowaway.Zstowaway)r"   )named)original_get_preparation_datar#   r   r   "get_preparation_data_with_stowawayg   s    zApatch_multiprocessing.<locals>.get_preparation_data_with_stowawayT)hasattrmultiprocessingPATCHED_MARKERr   	PYVERSIONr   r   OriginalProcessProcessospathabspathenvironr)   Zget_preparation_dataImportErrorAttributeErrorsetattr)r#   r)   r-   r   )r,   r#   r   r&   D   s    



r&   )r!   r/   Zmultiprocessing.processr4   os.pathr   r   r	   r   Zcoverage.miscr   r0   r1   processZBaseProcessr2   r3   r   r   r   objectr"   strr&   r   r   r   r   <module>   s    

