
    Rh\(                        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 g dZ e	ed      Z
ej                  ej                  fZdd iZe j                  d	k(  rKd dlZd dlZ e	ed
      rej%                  dej&                  i       ej%                  dej(                  i        G d de      Z G d de      Z e       Zej4                  Zej6                  Zej8                  Zej:                  Zd Zy)    N   )spawn)util)ensure_runningregister
unregisterpthread_sigmasknoopc                       y N r       7/usr/lib/python3.12/multiprocessing/resource_tracker.py<lambda>r   !   s    r   posix
sem_unlink	semaphoreshared_memoryc                       e Zd Zy)ReentrantCallErrorN)__name__
__module____qualname__r   r   r   r   r   6   s    r   r   c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)ResourceTrackerc                 R    t        j                         | _        d | _        d | _        y r   )	threadingRLock_lock_fd_pidselfs    r   __init__zResourceTracker.__init__<   s    __&
	r   c                     t        d      )Nz8Reentrant call into the multiprocessing resource tracker)r   r"   s    r   _reentrant_call_errorz%ResourceTracker._reentrant_call_errorA   s    
 !FH 	Hr   c                 x   | j                   5  | j                   j                         dkD  r| j                         cd d d        S | j                  
	 d d d        y t	        j
                  | j                         d | _        t	        j                  | j                  d       d | _        d d d        y # 1 sw Y   y xY w)Nr   r   )r   _recursion_countr&   r    osclosewaitpidr!   r"   s    r   _stopzResourceTracker._stopI   s    ZZ 	 zz**,q0113		 	
 xx	 	 HHTXXDHJJtyy!$DI	 	 	s   -B0B0AB00B9c                 :    | j                          | j                  S r   )r   r    r"   s    r   getfdzResourceTracker.getfdZ   s    xxr   c                 D   | j                   5  | j                   j                         dkD  r| j                         cddd       S | j                  | j	                         r
	 ddd       yt        j                  | j                         	 | j                   t        j                  | j                  d       d| _        d| _        t        j                  d       g }	 |j                  t        j                  j                                d}t        j"                         \  }}	 |j                  |       t%        j&                         }|gt)        j*                         z   }|d||z  gz  }	 t,        r(t/        j0                  t.        j2                  t4               t)        j6                  |||      }t,        r)t/        j0                  t.        j8                  t4               	 || _        || _        	 t        j                  |       	 ddd       y# t        $ r Y cw xY w# t         $ r Y  w xY w# t,        r)t/        j0                  t.        j8                  t4               w w xY w#  t        j                  |        xY w# t        j                  |       w xY w# 1 sw Y   yxY w)zMake sure that resource tracker process is running.

        This can be run from any process.  Usually a child process will use
        the resource created by its parent.r   Nr   zUresource_tracker: process died unexpectedly, relaunching.  Some resources might leak.z:from multiprocessing.resource_tracker import main;main(%d)z-c)r   r(   r&   r    _check_aliver)   r*   r!   r+   ChildProcessErrorwarningswarnappendsysstderrfileno	Exceptionpiper   get_executabler   _args_from_interpreter_flags_HAVE_SIGMASKsignalr	   	SIG_BLOCK_IGNORED_SIGNALSspawnv_passfdsSIG_UNBLOCK)r#   fds_to_passcmdrwexeargspids           r   r   zResourceTracker.ensure_running^   s)   
 ZZ <	zz**,q0113<	 <	 xx#$$&<	 <	 " yy,

499a0   	 I J K""3::#4#4#67 OC779DAq""1%**,ut@@BBsQw'U$..v/?/?AQR--c4EC$..v/A/ACST
 	y<	 <	$ )   * %..v/A/ACST %
 y<	 <	s   -JJ*J
,H6%J-H	J#AI!+AH-0/I!I<.J	HJHJ	H*&J)H**J-1II!!I99I<<JJJc                 d    	 t        j                  | j                  d       y# t        $ r Y yw xY w)z;Check that the pipe has not been closed by sending a probe.s   PROBE:0:noop
TF)r)   writer    OSErrorr"   s    r   r0   zResourceTracker._check_alive   s5    	 HHTXX01   		s    # 	//c                 *    | j                  d||       y)z0Register name of resource with resource tracker.REGISTERN_sendr#   namertypes      r   r   zResourceTracker.register   s    

:tU+r   c                 *    | j                  d||       y)z2Unregister name of resource with resource tracker.
UNREGISTERNrN   rP   s      r   r   zResourceTracker.unregister   s    

<u-r   c                    	 | j                          dj	                  |||      j                  d      }t        |      dkD  rt        d      t        j                  | j                  |      }|t        |      k(  s J dj	                  |t        |                   y # t        $ r t        j                  d| d|d       Y w xY w)	NzSResourceTracker called reentrantly for resource cleanup, which is unsupported. The z object z might leak.z{0}:{1}:{2}
asciii   zmsg too longznbytes {0:n} but len(msg) {1:n})r   r   r2   r3   formatencodelen
ValueErrorr)   rJ   r    )r#   rC   rQ   rR   msgnbytess         r   rO   zResourceTracker._send   s    
	<! $$S$6==gFs8c> ^,,$((C(S! 	#D#K#KCH$ 	! " 	<
 MMgXdX\;<	<s   B %CCN)r   r   r   r$   r&   r,   r.   r   r0   r   r   rO   r   r   r   r   r   :   s2    
H"AF	,.r   r   c                    t        j                   t         j                  t         j                         t        j                   t         j                  t         j                         t        r(t        j
                  t         j                  t               t        j                  t        j                  fD ]  }	 |j                           t        j                         D ci c]  }|t                }}	 t!        | d      5 }|D ]  }	 |j#                         j%                  d      j'                  d      \  }}}t        j)                  |d      }|t+        d| d|       |dk(  r||   j-                  |       n.|dk(  r||   j/                  |       n|d	k(  rnt1        d
|z         	 ddd       |j7                         D ]B  \  }}|r$	 t9        j:                  dt=        |      |fz         |D ]  }	 	 t        |   |        D y# t        $ r Y dw xY wc c}w # t        $ r1 	 t        j2                  t        j4                           n#  Y nxY wY Vw xY w# 1 sw Y   xY w# t        $ r Y w xY w# t        $ r%}	t9        j:                  d|d|	       Y d}	~	d}	~	ww xY w# w xY w# |j7                         D ]  \  }}|r4	 t9        j:                  dt=        |      |fz         n# t        $ r Y nw xY w|D ]I  }	 	 t        |   |       n1# t        $ r%}	t9        j:                  d|d|	       Y d}	~	nd}	~	ww xY wF# w xY w  w xY w)zRun resource tracker.rbrV   :NzCannot register z. for automatic cleanup: unknown resource type rM   rT   PROBEzunrecognized command %rzQresource_tracker: There appear to be %d leaked %s objects to clean up at shutdownzresource_tracker: z: )r=   SIGINTSIG_IGNSIGTERMr<   r	   rA   r?   r5   stdinstdoutr*   r8   _CLEANUP_FUNCSkeyssetopenstripdecodesplitgetrZ   addremoveRuntimeError
excepthookexc_infoitemsr2   r3   rY   )
fdfrR   cachelinerC   rQ   cleanup_funcrtype_cachees
             r   mainr{      s9    MM&--0
MM&..&..1v113CDii$ 	GGI (6':':'<=eUCE\=E=-"d^ 	q '+zz|':':7'C'I'I#'N$Cu#1#5#5eT#BL#+(.tf 555:G=> > j(e((.,e++D1*+Ds+JKK!	2 #(++- 	E;MM #N#&{#3U";#< =
 $ 
N&u-d3 
	?  		 >* ! 7	%	 	> !  % N D!&LMMN % #(++- 	E;MM #N#&{#3U";#< = ! # 
N&u-d3$ N D!&LMMN D
	s  7HH4J.  IB#H *I-J. #I)8I8	HH 	I*$III	IIIII&"J. )	I54I58	J&J!J)!J&&J))J+.M#K,+M,	K8	5M7K8	8MLM	L?L:5M:L??MMMM)r)   r=   r5   r   r2    r   r   __all__hasattrr<   ra   rc   r?   rf   rQ   _multiprocessing_posixshmemupdater   
shm_unlinkrp   r   objectr   _resource_trackerr   r   r   r.   r{   r   r   r   <module>r      s  $ 
  
    
6 12MM6>>2  L 77g .)44
 	 // 
	 	Mf M` $% "11%%))
<r   