B
    çÚ†\¤D  ã               @   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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
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l
mZ ddl
mZ g Ze d¡ZejZeje
jeje
jej e
j!ej"e
j#ej$e
j%ej&e
j'ej(e
j)ej*e
j+ej,e
j-ej.e
j/ej0e
j1ej2e
j3iZ4ej5e
j6ej7e
j8ej9e
j:ej;e
j<ej=e
j>iZ?e@ddddddddddddZAe@dddddddddZBdZCdZDdZEdZFeddd d!d"gƒZGed#d$d%d&d'd(d)d*d+gƒZHed,d-d.d/d0gƒZIed1eIjJd2 ƒZKd3d4„ ZLd5d6„ ZMd7d8„ ZNd9d:„ ZOd;d<„ ZPd=d>„ ZQd?d@„ ZRdAdB„ ZSejTZTejUZUdYdDdE„ZVdFdG„ ZWejXZXejYZYdZdIdJ„ZZdKdL„ Z[dMdN„ Z\dOdP„ Z]dQdR„ Z^ej_Z_dSdT„ Z`ejadUdV„ ƒZbG dWdX„ dXecƒZddS )[zmacOS platform implementation.é    N)ÚAF_INET)Ú
namedtupleé   )Ú_common)Ú_psposix)Ú_psutil_osx)Ú_psutil_posix)ÚAF_INET6)Ú	conn_tmap)Úisfile_strict)Úmemoize_when_activated)Úparse_environ_block)Úsockfam_to_enum)Úsocktype_to_enum)Úusage_percentÚSC_PAGE_SIZEé   é   é   é   é   é   é   é	   é
   )ÚppidÚruidÚeuidÚsuidÚrgidÚegidÚsgidÚttynrÚctimeÚstatusÚname)ÚcpuutimeÚcpustimeÚrssÚvmsÚpfaultsÚpageinsÚ
numthreadsÚvolctxswÚ	scputimesÚuserÚniceÚsystemÚidleÚsvmemÚtotalZ	availableÚpercentÚusedÚfreeÚactiveÚinactiveÚwiredÚpmemr(   r)   r*   r+   Úpfullmem)Úussc        	   	   C   sT   t  ¡ \} }}}}}|| }|| }||8 }t| | | dd}t| |||||||ƒS )z&System virtual memory as a namedtuple.r   )Úround_)ÚcextZvirtual_memr   r3   )	r4   r8   r9   r:   r7   ZspeculativeZavailr6   r5   © r@   ú,lib/python3.7/site-packages/psutil/_psosx.pyÚvirtual_memoryu   s    rB   c              C   s4   t  ¡ \} }}}}t|| dd}t | |||||¡S )z=Swap system memory as a (total, used, free, sin, sout) tuple.r   )r>   )r?   Zswap_memr   r   Zsswap)r4   r6   r7   ZsinZsoutr5   r@   r@   rA   Úswap_memory†   s    rC   c              C   s   t  ¡ \} }}}t| |||ƒS )z(Return system CPU times as a namedtuple.)r?   Ú	cpu_timesr.   )r/   r0   r1   r2   r@   r@   rA   rD   ’   s    rD   c              C   s>   g } x4t  ¡ D ](}|\}}}}t||||ƒ}|  |¡ qW | S )z(Return system CPU times as a named tuple)r?   Úper_cpu_timesr.   Úappend)ÚretZcpu_tr/   r0   r1   r2   Úitemr@   r@   rA   rE   ˜   s    rE   c               C   s   t  ¡ S )z0Return the number of logical CPUs in the system.)r?   Úcpu_count_logicalr@   r@   r@   rA   rI   ¢   s    rI   c               C   s   t  ¡ S )z1Return the number of physical CPUs in the system.)r?   Zcpu_count_physr@   r@   r@   rA   Úcpu_count_physical§   s    rJ   c              C   s"   t  ¡ \} }}}}t | |||¡S )N)r?   Ú	cpu_statsr   Z	scpustats)Zctx_switchesZ
interruptsZsoft_interruptsZsyscallsZtrapsr@   r@   rA   rK   ¬   s    rK   c              C   s   t  ¡ \} }}t | ||¡gS )z¾Return CPU frequency.
    On macOS per-cpu frequency is not supported.
    Also, the returned frequency never changes, see:
    https://arstechnica.com/civis/viewtopic.php?f=19&t=465002
    )r?   Úcpu_freqr   Zscpufreq)ZcurrZmin_Zmax_r@   r@   rA   rL   ³   s    rL   Fc       	      C   sn   g }t  ¡ }x\|D ]T}|\}}}}|dkr.d}| sLtj |¡rtj |¡sLqt ||||¡}| |¡ qW |S )z8Return mounted disk partitions as a list of namedtuples.ZnoneÚ )	r?   Údisk_partitionsÚosÚpathÚisabsÚexistsr   Z	sdiskpartrF   )	ÚallÚretlistZ
partitionsÚ	partitionZdeviceZ
mountpointZfstypeZoptsÚntupler@   r@   rA   rN   Æ   s    
rN   c              C   sb   yt  ¡ \} }}W n tk
r&   dS X |dk}|r<tj}n|dkrLtj}n|d }t | ||¡S )zReturn battery information.Nr   éÿÿÿÿé<   )r?   Úsensors_batteryÚNotImplementedErrorr   ZPOWER_TIME_UNLIMITEDZPOWER_TIME_UNKNOWNZsbattery)r5   ZminsleftZpower_pluggedZsecsleftr@   r@   rA   rY   Û   s    rY   Úinetc          	   C   sr   g }xht ƒ D ]^}yt|ƒ | ¡}W n tk
r8   wY qX |rx*|D ]"}t|ƒ|g }| tj|Ž ¡ qDW qW |S )z System-wide network connections.)ÚpidsÚProcessÚconnectionsÚNoSuchProcessÚlistrF   r   Zsconn)ÚkindrG   ÚpidZconsÚcr@   r@   rA   Únet_connectionsõ   s    
rd   c              C   s    t ƒ  ¡ } i }xŒ| D ]„}y&t |¡}t |¡}t |¡\}}W n0 tk
rn } z|jtjkr^‚ W dd}~X Y qX t	t
dƒr„t
 |¡}t
 ||||¡||< qW |S )z)Get NIC stats (isup, duplex, speed, mtu).NÚ	NicDuplex)Únet_io_countersÚkeysÚ
cext_posixZ
net_if_mtuZnet_if_flagsZnet_if_duplex_speedÚOSErrorÚerrnoZENODEVÚhasattrr   re   Z	snicstats)ÚnamesrG   r%   ZmtuZisupZduplexZspeedÚerrr@   r@   rA   Únet_if_stats  s    





rn   c               C   s   t  ¡ S )z:The system boot time expressed in seconds since the epoch.)r?   Ú	boot_timer@   r@   r@   rA   ro      s    ro   c        	      C   s`   g } t  ¡ }xN|D ]F}|\}}}}}|dkr.q|s4qt ||p@d|pFd||¡}|  |¡ qW | S )z:Return currently connected users as a list of namedtuples.ú~N)r?   Úusersr   ZsuserrF   )	rT   ÚrawlistrH   r/   ZttyZhostnameZtstamprb   Úntr@   r@   rA   rq   %  s    
rq   c              C   sd   t  ¡ } d| kr`ytdƒ ¡  |  dd¡ W n2 tk
r@   Y n  tk
r^   |  dd¡ Y nX | S )Nr   )r?   r\   r]   Úcreate_timeÚinsertr_   ÚAccessDenied)Zlsr@   r@   rA   r\   9  s    r\   c                s   t  ˆ ¡‡ fdd„ƒ}|S )z`Decorator which translates bare OSError exceptions into
    NoSuchProcess and AccessDenied.
    c          
      sš   yˆ | f|ž|ŽS  t k
rn } z@|jtjkr<t| j| jƒ‚|jtjtjfkr\t| j| jƒ‚‚ W d d }~X Y n( t	j
k
r”   t| j| j| jƒ‚Y nX d S )N)ri   rj   ÚESRCHr_   rb   Ú_nameZEPERMZEACCESrv   r?   ZZombieProcessErrorÚZombieProcessÚ_ppid)ÚselfÚargsÚkwargsrm   )Úfunr@   rA   ÚwrapperP  s    z wrap_exceptions.<locals>.wrapper)Ú	functoolsÚwraps)r~   r   r@   )r~   rA   Úwrap_exceptionsL  s    r‚   c             c   s¢   y
dV  W n’ t tfk
rœ } zpt|tƒs6|jtjkrŠy|  ¡ }W n tk
rZ   |‚Y qŒX |tjkrzt	| j
| j| jƒ‚qŒt| j
| jƒ‚n‚ W dd}~X Y nX dS )zýThere are some poor C APIs which incorrectly raise ESRCH when
    the process is still alive or it's a zombie, or even RuntimeError
    (those who don't set errno). This is here in order to solve:
    https://github.com/giampaolo/psutil/issues/1044
    N)ri   ÚRuntimeErrorÚ
isinstancerj   rw   r$   r_   r   ÚSTATUS_ZOMBIEry   rb   rx   rz   rv   )Úprocrm   r$   r@   r@   rA   Úcatch_zombie_  s    


r‡   c               @   sl  e Zd ZdZddddgZdd„ Zeedd	„ ƒƒZeed
d„ ƒƒZ	dd„ Z
dd„ Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZed d!„ ƒZed"d#„ ƒZed$d%„ ƒZed&d'„ ƒZed(d)„ ƒZed*d+„ ƒZed,d-„ ƒZed.d/„ ƒZed@d1d2„ƒZed3d4„ ƒZedAd6d7„ƒZed8d9„ ƒZed:d;„ ƒZ ed<d=„ ƒZ!ed>d?„ ƒZ"d5S )Br]   z1Wrapper class around underlying C implementation.rb   rx   rz   Ú_cachec             C   s   || _ d | _d | _d S )N)rb   rx   rz   )r{   rb   r@   r@   rA   Ú__init__~  s    zProcess.__init__c             C   s$   t  | j¡}t|ƒttƒks t‚|S )N)r?   Zproc_kinfo_oneshotrb   ÚlenÚkinfo_proc_mapÚAssertionError)r{   rG   r@   r@   rA   Ú_get_kinfo_procƒ  s    zProcess._get_kinfo_procc          	   C   s8   t | ƒ t | j¡}W d Q R X t|ƒttƒks4t‚|S )N)r‡   r?   Zproc_pidtaskinfo_oneshotrb   rŠ   Úpidtaskinfo_maprŒ   )r{   rG   r@   r@   rA   Ú_get_pidtaskinfo‹  s    
zProcess._get_pidtaskinfoc             C   s   | j  | ¡ | j | ¡ d S )N)r   Zcache_activater   )r{   r@   r@   rA   Úoneshot_enter”  s    zProcess.oneshot_enterc             C   s   | j  | ¡ | j | ¡ d S )N)r   Zcache_deactivater   )r{   r@   r@   rA   Úoneshot_exit˜  s    zProcess.oneshot_exitc             C   s(   |   ¡ td  }|d k	r|S t | j¡S )Nr%   )r   r‹   r?   Z	proc_namerb   )r{   r%   r@   r@   rA   r%   œ  s    zProcess.namec          	   C   s    t | ƒ t | j¡S Q R X d S )N)r‡   r?   Zproc_exerb   )r{   r@   r@   rA   Úexe¡  s    
zProcess.exec          	   C   s    t | ƒ t | j¡S Q R X d S )N)r‡   r?   Zproc_cmdlinerb   )r{   r@   r@   rA   Úcmdline¦  s    
zProcess.cmdlinec          	   C   s$   t | ƒ tt | j¡ƒS Q R X d S )N)r‡   r   r?   Zproc_environrb   )r{   r@   r@   rA   Úenviron«  s    
zProcess.environc             C   s   |   ¡ td  | _| jS )Nr   )r   r‹   rz   )r{   r@   r@   rA   r   °  s    zProcess.ppidc          	   C   s    t | ƒ t | j¡S Q R X d S )N)r‡   r?   Zproc_cwdrb   )r{   r@   r@   rA   Úcwdµ  s    
zProcess.cwdc             C   s.   |   ¡ }t |td  |td  |td  ¡S )Nr   r   r   )r   r   Úpuidsr‹   )r{   Úrawtupler@   r@   rA   Úuidsº  s
    

zProcess.uidsc             C   s.   |   ¡ }t |td  |td  |td  ¡S )Nr   r    r!   )r   r   r–   r‹   )r{   r—   r@   r@   rA   ÚgidsÂ  s
    

zProcess.gidsc             C   s:   |   ¡ td  }t ¡ }y|| S  tk
r4   d S X d S )Nr"   )r   r‹   r   Zget_terminal_mapÚKeyError)r{   Ztty_nrZtmapr@   r@   rA   ÚterminalÊ  s    zProcess.terminalc             C   s6   |   ¡ }t|td  |td  |td  |td  ƒS )Nr(   r)   r*   r+   )r   r;   rŽ   )r{   r—   r@   r@   rA   Úmemory_infoÓ  s    


zProcess.memory_infoc             C   s"   |   ¡ }t | j¡}t||f Ž S )N)rœ   r?   Zproc_memory_ussrb   r<   )r{   Z	basic_memr=   r@   r@   rA   Úmemory_full_infoÝ  s    zProcess.memory_full_infoc             C   s(   |   ¡ }t |td  |td  dd¡S )Nr&   r'   g        )r   r   Z	pcputimesrŽ   )r{   r—   r@   r@   rA   rD   ã  s
    

zProcess.cpu_timesc             C   s   |   ¡ td  S )Nr#   )r   r‹   )r{   r@   r@   rA   rt   ì  s    zProcess.create_timec             C   s   |   ¡ td  }t |d¡S )Nr-   r   )r   rŽ   r   Zpctxsw)r{   Zvolr@   r@   rA   Únum_ctx_switchesð  s    zProcess.num_ctx_switchesc             C   s   |   ¡ td  S )Nr,   )r   rŽ   )r{   r@   r@   rA   Únum_threadsø  s    zProcess.num_threadsc          	   C   sf   | j dkrg S g }t| ƒ t | j ¡}W d Q R X x.|D ]&\}}t|ƒr8t ||¡}| |¡ q8W |S )Nr   )rb   r‡   r?   Zproc_open_filesr   r   Z	popenfilerF   )r{   Úfilesrr   rP   ÚfdrV   r@   r@   rA   Ú
open_filesü  s    

zProcess.open_filesr[   c          	   C   sÜ   |t kr(td|d dd„ t D ƒ¡f ƒ‚t | \}}t| ƒ t | j||¡}W d Q R X g }xz|D ]r}|\}}}	}
}}t| }t|ƒ}t	|	ƒ}	|t
tfkr¶|
r¨tj|
Ž }
|r¶tj|Ž }t |||	|
||¡}| |¡ qbW |S )Nz+invalid %r kind argument; choose between %sz, c             S   s   g | ]}t |ƒ‘qS r@   )Úrepr)Ú.0Úxr@   r@   rA   ú
<listcomp>  s    z'Process.connections.<locals>.<listcomp>)r
   Ú
ValueErrorÚjoinr‡   r?   Zproc_connectionsrb   ÚTCP_STATUSESr   r   r   r	   r   ZaddrZpconnrF   )r{   ra   ZfamiliesÚtypesrr   rG   rH   r¡   ZfamÚtypeZladdrZraddrr$   rs   r@   r@   rA   r^   	  s(    



zProcess.connectionsc          	   C   s.   | j dkrdS t| ƒ t | j ¡S Q R X d S )Nr   )rb   r‡   r?   Zproc_num_fds)r{   r@   r@   rA   Únum_fds   s    

zProcess.num_fdsNc             C   s   t  | j|| j¡S )N)r   Zwait_pidrb   rx   )r{   Ztimeoutr@   r@   rA   Úwait'  s    zProcess.waitc          	   C   s    t | ƒ t | j¡S Q R X d S )N)r‡   rh   Úgetpriorityrb   )r{   r@   r@   rA   Únice_get+  s    
zProcess.nice_getc          	   C   s"   t | ƒ t | j|¡S Q R X d S )N)r‡   rh   Úsetpriorityrb   )r{   Úvaluer@   r@   rA   Únice_set0  s    
zProcess.nice_setc             C   s   |   ¡ td  }t |d¡S )Nr$   ú?)r   r‹   ÚPROC_STATUSESÚget)r{   Úcoder@   r@   rA   r$   5  s    zProcess.statusc             C   s@   t  | j¡}g }x*|D ]"\}}}t |||¡}| |¡ qW |S )N)r?   Zproc_threadsrb   r   ZpthreadrF   )r{   rr   rT   Z	thread_idÚutimeZstimerV   r@   r@   rA   Úthreads;  s    zProcess.threads)r[   )N)#Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r‰   r‚   r   r   r   r   r‘   r%   r’   r“   r”   r   r•   r˜   r™   r›   rœ   r   rD   rt   rž   rŸ   r¢   r^   r¬   r­   r¯   r²   r$   r¸   r@   r@   r@   rA   r]   y  sD   	
	r]   )F)r[   )er¼   Ú
contextlibrj   r€   rO   Zsocketr   Úcollectionsr   rM   r   r   r   r?   r   rh   r	   r
   r   r   r   r   r   r   Z__extra__all__ÚsysconfZPAGESIZEZAF_LINKZTCPS_ESTABLISHEDZCONN_ESTABLISHEDZTCPS_SYN_SENTZCONN_SYN_SENTZTCPS_SYN_RECEIVEDZCONN_SYN_RECVZTCPS_FIN_WAIT_1ZCONN_FIN_WAIT1ZTCPS_FIN_WAIT_2ZCONN_FIN_WAIT2ZTCPS_TIME_WAITZCONN_TIME_WAITZTCPS_CLOSEDZ
CONN_CLOSEZTCPS_CLOSE_WAITZCONN_CLOSE_WAITZTCPS_LAST_ACKZCONN_LAST_ACKZTCPS_LISTENZCONN_LISTENZTCPS_CLOSINGZCONN_CLOSINGZPSUTIL_CONN_NONEZ	CONN_NONEr©   ZSIDLZSTATUS_IDLEZSRUNZSTATUS_RUNNINGZSSLEEPZSTATUS_SLEEPINGZSSTOPZSTATUS_STOPPEDZSZOMBr…   r´   Údictr‹   rŽ   r_   ry   rv   ZTimeoutExpiredr.   r3   r;   Ú_fieldsr<   rB   rC   rD   rE   rI   rJ   rK   rL   Z
disk_usageZdisk_io_countersrN   rY   rf   Znet_if_addrsrd   rn   ro   rq   r\   Z
pid_existsr‚   Úcontextmanagerr‡   Úobjectr]   r@   r@   r@   rA   Ú<module>   s¸   
	


