B
    ç¹`w#  ã               @   sZ  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mZm	Z	 ddl
mZmZ eržd dlZddlmZ G dd„ deƒZdd	„ Zd
d„ Zdd„ Zdd„ Zn@d dlZd dlZG dd„ deƒZdd	„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZdd„ Zd2dd„Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Z d3d)d*„Z!d+d,„ Z"d4d-d.„Z#d5d0d1„Z$dS )6é    Né   )ÚWINÚpickleÚsubprocess_wait_with_timeout)Úis_stream_interactiveÚresolve_spec)Úwinapic               @   s   e Zd Zdd„ Zdd„ ZdS )ÚProcessGroupc             C   sB   t  d d ¡| _t  ¡ }t j|_t  ¡ }||_t  | jt j	|¡ d S )N)
r   ZCreateJobObjectÚh_jobZ!JOBOBJECT_BASIC_LIMIT_INFORMATIONZ"JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSEZ
LimitFlagsZ$JOBOBJECT_EXTENDED_LIMIT_INFORMATIONZBasicLimitInformationZSetInformationJobObjectZ!JobObjectExtendedLimitInformation)ÚselfÚinfoZextended_info© r   úR/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/hupper/ipc.pyÚ__init__   s    zProcessGroup.__init__c          
   C   sX   t  t jd|¡}yt  | j|¡S  tk
rR } zt|dƒdkr@n‚ W d d }~X Y nX d S )NFÚwinerroré   )r   ZOpenProcessZPROCESS_ALL_ACCESSZAssignProcessToJobObjectr
   ÚOSErrorÚgetattr)r   ÚpidÚhpÚexr   r   r   Ú	add_child   s    zProcessGroup.add_childN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r	      s   r	   c             C   s   d S )Nr   )Ústreamr   r   r   Úsnapshot_termios+   s    r   c             C   s   d S )Nr   )r   Ústater   r   r   Úrestore_termios.   s    r   c             C   s
   t  | ¡S )N)ÚmsvcrtZget_osfhandle)Úfdr   r   r   Ú
get_handle1   s    r!   c             C   sN   d}d|krd|kr|t jO }d|kr0|t jO }d|krB|t jO }t | |¡S )Nr   Úwú+ÚbÚa)ÚosÚO_RDONLYZO_TEXTÚO_APPENDr   Úopen_osfhandle)ÚhandleÚmodeÚflagsr   r   r   Úopen_handle4   s    


r-   c               @   s   e Zd Zdd„ ZdS )r	   c             C   s   d S )Nr   )r   r   r   r   r   r   D   s    zProcessGroup.add_childN)r   r   r   r   r   r   r   r   r	   C   s   c             C   s   t | ƒrt |  ¡ ¡}|S d S )N)r   ÚtermiosÚ	tcgetattrÚfileno)r   r   r   r   r   r   H   s    c             C   s6   |r2t | ƒr2|  ¡ }t |tj¡ t |tj|¡ d S )N)r   r0   r.   ÚtcflushÚ	TCIOFLUSHÚ	tcsetattrÚTCSANOW)r   r   r    r   r   r   r   M   s    c             C   s   | S )Nr   )r    r   r   r   r!   S   s    c             C   s   | S )Nr   )r*   r+   r   r   r   r-   V   s    c              C   s(   t  ¡ \} }t| dƒ t|dƒ | |fS )NF)r&   ÚpipeÚset_inheritable)Úrr"   r   r   r   Ú_pipeZ   s    

r8   c              C   s0   t ƒ \} }t ƒ \}}t| |ƒ}t||ƒ}||fS )N)r8   Ú
Connection)Zc2pr_fdZc2pw_fdZp2cr_fdZp2cw_fdZc1Úc2r   r   r   ÚPipea   s
    



r;   c               @   sb   e Zd ZdZe d¡Zdd„ Zdd„ Zdd„ Z	d	d
„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )r9   z1
    A connection to a bi-directional pipe.

    ÚQc             C   s   || _ || _d S )N)Úr_fdÚw_fd)r   r=   r>   r   r   r   r   r   s    zConnection.__init__c             C   s   t | jƒt | jƒdœS )N)Úr_handleÚw_handle)r!   r=   r>   )r   r   r   r   Ú__getstate__v   s    zConnection.__getstate__c             C   s$   t |d dƒ| _t |d dƒ| _d S )Nr?   Úrbr@   Úwb)r-   r=   r>   )r   r   r   r   r   Ú__setstate__|   s    zConnection.__setstate__c             C   s6   || _ t ¡ | _tj| jd| _d| j_| j ¡  d S )N)ÚtargetT)	Úon_recvÚ	threadingÚLockÚ	send_lockÚThreadÚ
_read_loopZreader_threadÚdaemonÚstart)r   rF   r   r   r   Úactivate€   s
    
zConnection.activatec             C   s   t | jƒ t | jƒ d | _d S )N)Úclose_fdr=   r>   rF   )r   r   r   r   Úclose‰   s    

zConnection.closec             C   s˜   t  ¡ }t | j| jj¡}|s"d S | j |¡d  }}xR|dkrˆt | j|¡}t|ƒ}|dkrt||krlt	‚nt
dƒ‚| |¡ ||8 }q8W t | ¡ ¡S )Nr   zgot end of file during message)ÚioÚBytesIOr&   Úreadr=   Ú_packet_lenÚsizeÚunpackÚlenÚEOFErrorÚIOErrorÚwriter   ÚloadsÚgetvalue)r   ÚbufÚchunkrU   Ú	remainingÚnr   r   r   Ú_recv_packetŽ   s    

zConnection._recv_packetc             C   sJ   y&x |   ¡ }|d krP |  |¡ qW W n tk
r:   Y nX |  d ¡ d S )N)ra   rF   rX   )r   Úpacketr   r   r   rK       s    zConnection._read_loopc             C   s(   x"|r"t  | j|¡}||d … }qW d S )N)r&   rZ   r>   )r   Údatar`   r   r   r   Ú_write_packet«   s    zConnection._write_packetc          	   C   sL   t  |¡}| j& |  | j t|ƒ¡¡ |  |¡ W d Q R X t|ƒ| jj S )N)r   ÚdumpsrI   rd   rT   ÚpackrW   rU   )r   Úvaluerc   r   r   r   Úsend°   s
    
zConnection.sendN)r   r   r   Ú__doc__ÚstructÚStructrT   r   rA   rD   rN   rP   ra   rK   rd   rh   r   r   r   r   r9   j   s   
	r9   c             C   s˜   t tdƒr&t | ¡|kr”t | |¡ nntrRt| ƒ}|r<tjnd}t |tj|¡ nBt	 	| t	j
¡}|rr|t	j @ }n
|t	jB }||kr”t	 	| t	j|¡ d S )NÚget_inheritabler   )Úhasattrr&   rl   r6   r   r!   r   ZHANDLE_FLAG_INHERITZSetHandleInformationÚfcntlZF_GETFDZ
FD_CLOEXECZF_SETFD)r    ÚinheritableÚhr,   Z	new_flagsr   r   r   r6   ¸   s    

r6   Tc             C   s6   | d k	r2yt  | ¡ W n tk
r0   |r,‚ Y nX d S )N)r&   rP   Ú	Exception)r    Zraisesr   r   r   rO   Î   s    rO   c           
   C   s|   ddddddddd	d
œ	} g }x<|   ¡ D ]0\}}ttj|dƒ}|dkr&| d||  ¡ q&W xtjD ]}| d| ¡ qbW |S )zy
    Return a list of command-line arguments reproducing the current
    settings in sys.flags and sys.warnoptions.

    ÚdÚBÚsÚSÚEÚvr$   ÚqÚO)	ÚdebugÚdont_write_bytecodeÚno_user_siteÚno_siteÚignore_environmentÚverboseÚbytes_warningÚquietÚoptimizer   ú-z-W)Úitemsr   Úsysr,   ÚappendÚwarnoptions)Úflag_opt_mapÚargsÚflagÚoptrw   r   r   r   Úargs_from_interpreter_flags×   s"    rŒ   c           	   K   s˜   d}|d  dd„ |  ¡ D ƒ¡; }tƒ }tjg| d|g }tj tj tj tj  t	¡¡¡¡}|g}tj
 ¡ }tj  |¡tj | dd¡ |d< ||fS )Nz1from hupper.ipc import spawn_main; spawn_main(%s)z, c             s   s   | ]}d | V  qdS )z%s=%rNr   )Ú.0Úitemr   r   r   ú	<genexpr>ô   s    z#get_command_line.<locals>.<genexpr>z-cÚ
PYTHONPATHÚ )Újoinr„   rŒ   r…   Ú
executabler&   ÚpathÚdirnameÚabspathÚ__file__ÚenvironÚcopyÚpathsepÚget)ÚkwdsÚprogÚoptsr‰   Zhupper_rootZextra_py_pathsÚenvr   r   r   Úget_command_lineò   s    
"r    c              C   s    i } t j| d< tt jƒ| d< | S )Nzsys.argvzsys.path)r…   ÚargvÚlistr”   )rc   r   r   r   Úget_preparation_data  s    
r£   c             C   s(   d| kr| d t _d| kr$| d t _d S )Nzsys.argvzsys.path)r…   r¡   r”   )rc   r   r   r   Úprepare  s    
r¤   r   c             C   sˆ   t  ¡ \}}x |gt|ƒ D ]}t|dƒ qW tƒ }t|ƒ}t|d\}}	tj||	dd}
t  	|d¡}| 
t || |g¡¡ | ¡  |
S )z4
    Invoke a python function in a subprocess.

    T)Úpipe_handleF)rŸ   Ú	close_fdsrC   )r&   r5   r¢   r6   r£   r!   r    Ú
subprocessÚPopenÚfdopenrZ   r   re   rP   )ÚspecÚkwargsÚpass_fdsr7   r"   r    Úpreparation_datar?   r‰   rŸ   ÚprocessZto_childr   r   r   Úspawn   s    r¯   c             C   sV   t | dƒ}t |d¡}t |¡\}}}| ¡  t|ƒ t|ƒ}|f |Ž t 	d¡ d S )NrB   r   )
r-   r&   r©   r   ÚloadrP   r¤   r   r…   Úexit)r¥   r    Zfrom_parentr­   rª   r«   Úfuncr   r   r   Ú
spawn_main6  s    

r³   c             C   s*   |d kr|   ¡ S |dkr |  ¡ S t| |ƒS )Nr   )ÚwaitÚpollr   )r®   Útimeoutr   r   r   r´   C  s
    r´   Fc             C   s   |r|   ¡ S |  ¡ S )N)Ú	terminateÚkill)r®   Zsoftr   r   r   r¸   M  s    r¸   )T)r   )N)F)%rQ   r&   rj   r§   r…   rG   Úcompatr   r   r   Úutilsr   r   r   r‘   r   Úobjectr	   r   r   r!   r-   rn   r.   r8   r;   r9   r6   rO   rŒ   r    r£   r¤   r¯   r³   r´   r¸   r   r   r   r   Ú<module>   sF   
	N
	


