
    eCi)                        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Zd dlmZ  ej	        d          Z
ddlmZ  e ej        dd                    Z G d d	e          Zedk    rej        Zej        Zej        Zej        Zej        Zdad
 Zd Zd Zd Z G d de          Z ee_        ee_        ee_        ee_        e e_         G d d          Z!e!"                                 dS  G d d          Z!dS )    N)ContextDecoratorprofiler   )response_file	EMPROFILE0c                   4     e Zd ZdZd Z fdZd Zd Z xZS )Loggerr   c                     || _         d S N)name)selfr   s     </b/s/w/ir/x/w/install/emscripten/tools/toolchain_profiler.py__init__zLogger.__init__   s    DIII    c                 l    | j         |j        | _         t                                          |          S r   )r   __name__super__call__)r   func	__class__s     r   r   zLogger.__call__   s,    y-di77D!!!r   c                     t           dk    rEdt          j        z  }t                              d|| j                   t          xj        dz  c_        t          j                    | _        d S )N     z%sstart block "%s"r   )r   r
   depthloggerinfor   timestart)r   indentations     r   	__enter__zLogger.__enter__!   sQ    A~~6<'kkk&TY???llallDJJJr   c                 :   t          j                     }|| j        z
  }|rd}nd}t          dk    rJt          xj        dz  c_        dt          j        z  }t
                              ||z   | j        |           d S t
                              || j        |           d S )Nz1block "%s" raised an exception after %.3f secondszblock "%s" took %.3f secondsr   r   r   )	r   r   r   r
   r   r   r   r   debug)r   exc_typevalue	tracebacknowdurationmsgr    s           r   __exit__zLogger.__exit__(   s    
)++CTZH +?cc*cA~~llall6<'kkk+#TY99999ll3	8,,,,,r   )	r   
__module____qualname__r   r   r   r!   r*   __classcell__r   s   @r   r
   r
      sj        
%  " " " " "
  - - - - - - -r   r
   c                 (    | a t          |            d S r   )process_returncodeoriginal_sys_exit)
returncodes    r   profiled_sys_exitr3   @   s     $j!!!!!r   c                    t                                           }t                               ||            	 t          | g|R i |}n*# t          $ r t                               |d            w xY wt                               ||           |S Nr   )ToolchainProfilerimaginary_pidrecord_subprocess_spawnoriginal_subprocess_call	Exceptionrecord_subprocess_finish)cmdargskwpidr2   s        r   profiled_callr@   F   s    

)
)
+
+C--c3777+C=$==="==jj   00a888 ..sJ???s   A 'A.c                 .   t                                           }t                               ||            	 t          | g|R i |}n3# t          $ r&}t                               ||j                    d }~ww xY wt                               |d           |S Nr   )r6   r7   r8   original_subprocess_check_callr:   r;   r2   r<   r=   r>   r?   retes         r   profiled_check_callrG   Q   s    

)
)
+
+C--c3777*3<<<<<<cc   00alCCC ..sA666J   A 
A7!A22A7c                 .   t                                           }t                               ||            	 t          | g|R i |}n3# t          $ r&}t                               ||j                    d }~ww xY wt                               |d           |S rB   )r6   r7   r8    original_subprocess_check_outputr:   r;   r2   rD   s         r   profiled_check_outputrK   \   s    

)
)
+
+C--c3777,S>4>>>2>>cc   00alCCC ..sA666JrH   c                   (     e Zd Z fdZ fdZ xZS )ProfiledPopenc                      t                      j        |g|R i | t                              | j        |           d S r   )r   r   r6   r8   r?   )r   r=   	otherargskwargsr   s       r   r   zProfiledPopen.__init__h   sH    eggt2i2226222//$?????r   c                     t                               | j                    t                      j        |i |}t                               | j        | j                   |S r   )r6   record_subprocess_waitr?   r   communicater;   r2   )r   r=   rP   outputr   s       r   rS   zProfiledPopen.communicatel   sS    ..tx888"uww"D3F33f004?KKKmr   )r   r+   r,   r   rS   r-   r.   s   @r   rM   rM   g   sV        @ @ @ @ @        r   rM   c                      e Zd ZdZdZg ZdZdZed             Z	ed             Z
ed             Zed             Zedd	            Zed
             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Z G d de          Zed             Zed             Zed             ZdS )r6   r   NFc                  N    d                     t          j                              S )Nz{0:.3f})formatr    r   r   	timestampzToolchainProfiler.timestamp   s    dikk***r   c            
          t          t          j                            t          j        dt          t          j                              z   dz             d          S )Nztoolchain_profiler.pid_z.jsona)openospathjoinr6   profiler_logs_pathstrgetpidrX   r   r   
log_accesszToolchainProfiler.log_access   sU     "',,0CE^adegenepepaqaqEqt{E{||  B  C  C  Cr   c                 V    |                      dd                               dd          S )N\z\\"z\")replace)args    r   escape_stringzToolchainProfiler.escape_string   s&    [[v&&..sE:::r   c                     d | D             S )Nc                 B    g | ]}t                               |          S rX   )r6   ri   ).0rh   s     r   
<listcomp>z1ToolchainProfiler.escape_args.<locals>.<listcomp>   s'    CCCs--c22CCCr   rX   )r=   s    r   escape_argszToolchainProfiler.escape_args   s    CCdCCCCr   Tc           	      F   t           j        rJ dt           _        t          j        t           j                   t          t          j                              t           _        t          j	        
                    t          j                    d          t           _        t          j        t           j        d           g t           _        | rt                                           5 }|                    dt           j        z   dz   t          t          j                              z   dz   t                                           z   dz   d
                    t                               t(          j                            z   d	z              d d d            d S # 1 swxY w Y   d S d S )
NT"emscripten_toolchain_profiler_logs)exist_okz	[
{"pid":,"subprocessPid":z,"op":"start","time":,"cmdLine":["",""]})r6   process_start_recordedatexitregisterrecord_process_exitra   r]   rb   	mypid_strr^   r_   tempfile
gettempdirr`   makedirsblock_stackrc   writerY   rn   sysargv)write_log_entryfs     r   record_process_startz&ToolchainProfiler.record_process_start   s   "999915.o';<<<
 %(	$4$4!-/W\\(:M:O:OQu-v-v*k#6FFFF&(#	 q))++ 	qq
'',!2!<<?RRUXY[YbYdYdUeUeeh  CT  C^  C^  C`  C`  `  cr  r  uz  u  u  @Q  @]  @]  ^a  ^f  @g  @g  uh  uh  h  kp  p  q  q  q	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	qq qs   %B"FFFc                     t           j        rJ t           j        sJ dt           _        t                                            t                                           5 } t
          }|d}|                     dt           j        z   dz   t          t          j
                              z   dz   t                                           z   dz   t          |          z   dz              d d d            d S # 1 swxY w Y   d S )NTz"MISSING EXIT CODE"	,
{"pid":rr   z,"op":"exit","time":,"returncode":z}
]
)r6   process_exit_recordedrv   exit_all_blocksrc   r0   r   rz   ra   r]   rb   rY   )r   r2   s     r   ry   z%ToolchainProfiler.record_process_exit   s~   "8888555504-'')))'')) NQ'
,*	0::=PPSVWYW`WbWbScSccf||  @Q  @[  @[  @]  @]  ]  `p  p  sv  wA  sB  sB  B  EM  M  	N  	N  	N	N N N N N N N N N N N N N N N N N Ns   BC--C14C1c           	         	 t          j        |          }n# t          $ r |}Y nw xY wt                                          5 }|                    dt          j        z   dz   t          t          j	                              z   dz   t          |           z   dz   t          
                                z   dz   d                    t                              |                    z   dz              d d d            d S # 1 swxY w Y   d S )Nr   rr   z,"op":"spawn","targetPid":,"time":rs   rt   ru   )r   substitute_response_filesOSErrorr6   rc   r   rz   ra   r]   rb   rY   r_   rn   )process_pidprocess_cmdlineexpanded_cmdliner   s       r   r8   z)ToolchainProfiler.record_subprocess_spawn   s   +(B?SS + + + ++
 '')) \Q	0::=PPSVWYW`WbWbScScc  gC  C  FI  JU  FV  FV  V  Yc  c  fw  fA  fA  fC  fC  C  FU  U  X]  Xb  Xb  ct  c@  c@  AQ  cR  cR  XS  XS  S  V[  [  	\  	\  	\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \s    &&B+C::C>C>c                 \   t                                           5 }|                    dt           j        z   dz   t	          t          j                              z   dz   t	          |           z   dz   t                                           z   dz              d d d            d S # 1 swxY w Y   d S )Nr   rr   z,"op":"wait","targetPid":r   }r6   rc   r   rz   ra   r]   rb   rY   )r   r   s     r   rR   z(ToolchainProfiler.record_subprocess_wait   s<   '')) IQ	0::=PPSVWYW`WbWbScScc  gB  B  EH  IT  EU  EU  U  Xb  b  ev  e@  e@  eB  eB  B  EH  H  	I  	I  	II I I I I I I I I I I I I I I I I Is   A:B!!B%(B%c                    t                                           5 }|                    dt           j        z   dz   t	          t          j                              z   dz   t	          |           z   dz   t                                           z   dz   t	          |          z   dz              d d d            d S # 1 swxY w Y   d S )Nr   rr   z,"op":"finish","targetPid":r   r   r   r   )r   r2   r   s      r   r;   z*ToolchainProfiler.record_subprocess_finish   sk   '')) pQ	0::=PPSVWYW`WbWbScScc  gD  D  GJ  KV  GW  GW  W  Zd  d  gx  gB  gB  gD  gD  D  GW  W  Z]  ^h  Zi  Zi  i  lo  o  	p  	p  	pp p p p p p p p p p p p p p p p p ps   BB44B8;B8c                 ~   t                                           5 }|                    dt           j        z   dz   t	          t          j                              z   dz   | z   dz   t                                           z   dz              d d d            n# 1 swxY w Y   t           j        	                    |            d S )Nr   rr   z,"op":"enterBlock","name":"	","time":r   )
r6   rc   r   rz   ra   r]   rb   rY   r~   append
block_namer   s     r   enter_blockzToolchainProfiler.enter_block   s4   '')) FQ	0::=PPSVWYW`WbWbScScc  gD  D  GQ  Q  T_  _  bs  b}  b}  b  b    BE  E  	F  	F  	FF F F F F F F F F F F F F F F #**:66666s   A-BBBc                     t          t          |                     D ]&}| |         |k    r|                     |            dS 'dS )NTF)rangelenpop)lstitemis      r    remove_last_occurrence_if_existsz2ToolchainProfiler.remove_last_occurrence_if_exists   sL    SXX  !q6T>>
''!***  Ur   c                    t                               t           j        |           rt                                           5 }|                    dt           j        z   dz   t          t          j                              z   dz   | z   dz   t           	                                z   dz              d d d            d S # 1 swxY w Y   d S d S )Nr   rr   z,"op":"exitBlock","name":"r   r   )
r6   r   r~   rc   r   rz   ra   r]   rb   rY   r   s     r   
exit_blockzToolchainProfiler.exit_block   sQ   		;	;<M<Y[e	f	f G))++ 	Gq
'',!2!<<?RRUXY[YbYdYdUeUee  iE  E  HR  R  U`  `  ct  c~  c~  c@  c@  @  CF  F  G  G  G	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	GG Gs   A-B99B= B=c                  j    t           j        d d d         D ]} t                               |            d S )N)r6   r~   r   )bs    r   r   z!ToolchainProfiler.exit_all_blocks   s@     ,TTrT2 ( (!$$Q''''( (r   c                   *     e Zd Z fdZd Zd Z xZS )ToolchainProfiler.ProfileBlockc                 X    t                                          |           || _        d S r   )r   r   r   )r   r   r   s     r   r   z'ToolchainProfiler.ProfileBlock.__init__   s&    $$$			r   c                 D    t                               | j                   d S r   )r6   r   r   )r   s    r   r!   z(ToolchainProfiler.ProfileBlock.__enter__   s    %%di00000r   c                 D    t                               | j                   d S r   )r6   r   r   )r   typer%   r&   s       r   r*   z'ToolchainProfiler.ProfileBlock.__exit__   s    $$TY/////r   )r   r+   r,   r   r!   r*   r-   r.   s   @r   ProfileBlockr      sV            1 1 10 0 0 0 0 0 0r   r   c                 f    t                               t                               |                     S r   )r6   r   ri   r   s    r   profile_blockzToolchainProfiler.profile_block   s%    ++,=,K,KJ,W,WXXXr   c                  6    t                               d           S r   )r6   r   rX   r   r   profilezToolchainProfiler.profile   s    ++D111r   c                  D    t           xj        dz  c_        t           j        S r5   )r6   imaginary_pid_rX   r   r   r7   zToolchainProfiler.imaginary_pid   s    &&!+&&--r   )T)r   r+   r,   r   r`   r~   rv   r   staticmethodrY   rc   ri   rn   r   ry   r8   rR   r;   r   r   r   r   r
   r   r   r   r7   rX   r   r   r6   r6   x   s-        NK #!+ + \+ 	C 	C \	C ; ; \; D D \D q q q \q$ 
N 
N \
N 	\ 	\ \	\ I I \I p p \p 7 7 \7   \ G G \G
 ( ( \(	0 	0 	0 	0 	0v 	0 	0 	0 Y Y \Y 2 2 \2 . . \. . .r   r6   c                   f    e Zd Zed             Zed             Zed             Zed             ZdS )r6   c                     d S r   rX   r   s    r   r   zToolchainProfiler.enter_block      
dr   c                     d S r   rX   r   s    r   r   zToolchainProfiler.exit_block  r   r   c                      t          |           S r   r
   r   s    r   r   zToolchainProfiler.profile_block  s    Jr   c                       t          d           S r   r   rX   r   r   r   zToolchainProfiler.profile  s    D\\r   N)r   r+   r,   r   r   r   r   r   rX   r   r   r6   r6     s~          \   \     \    \  r   )#rw   loggingr]   
subprocessr   r{   r   
contextlibr   	getLoggerr    r   intgetenvr   r
   exitr1   callr9   
check_callrC   check_outputrJ   Popenoriginal_Popenr0   r3   r@   rG   rK   rM   r6   r   rX   r   r   <module>r      s     				     



   ' ' ' ' ' '		:	&	&      C		+s++,,	- - - - - - - -D >>h'_#-#8 %/%<"#." " "	 	 		 	 		 	 		 	 	 	 	n 	 	 	 #(!*/-*1*"*K. K. K. K. K. K. K. K.Z ((*****         r   