U :e!@sddlZddlZddlZddlZddlZddlmZddlmZdddgZe edZ ej ej fZ d d d iZejd krddlZddlZeejejd GdddeZeZejZejZejZejZddZdS)N)spawn)utilensure_runningregister unregisterpthread_sigmaskZnoopcCsdSNr r r E/usr/local/python38/lib/python3.8/multiprocessing/resource_tracker.py!r posix) semaphoreZ shared_memoryc@sLeZdZddZddZddZddZd d Zd d Zd dZ ddZ dS)ResourceTrackercCst|_d|_d|_dSr ) threadingLock_lock_fd_pidselfr r r __init__0s zResourceTracker.__init__c CsT|jD|jdkr W5QRdSt|jd|_t|jdd|_W5QRXdS)Nr)rrosclosewaitpidrrr r r _stop5s  zResourceTracker._stopcCs||jSr )rrrr r r getfdBszResourceTracker.getfdc Cst|jb|jdk r~|r*W5QRdSt|jz|jdk rPt|jdWntk rfYnXd|_d|_t dg}z| t j Wntk rYnXd}t\}}zzr| |t}|gt}|d||g7}z&trttjtt|||}W5tr,ttjtXWnt|YnX||_||_W5t|XW5QRXdS)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.NrzUresource_tracker: process died unexpectedly, relaunching. Some resources might leak.z:from multiprocessing.resource_tracker import main;main(%d)z-c)rr _check_aliverrrrChildProcessErrorwarningswarnappendsysstderrfileno ExceptionpiperZget_executabler_args_from_interpreter_flags _HAVE_SIGMASKsignalr SIG_UNBLOCK_IGNORED_SIGNALS SIG_BLOCKspawnv_passfds)rZ fds_to_passcmdrwZexeargspidr r r rFsJ         zResourceTracker.ensure_runningcCs2zt|jdWntk r(YdSXdSdS)z;Check that the pipe has not been closed by sending a probe.s PROBE:0:noop FTN)rwriterOSErrorrr r r rs zResourceTracker._check_alivecCs|d||dS)z0Register name of resource with resource tracker.REGISTERN_sendrnamertyper r r rszResourceTracker.registercCs|d||dS)z2Unregister name of resource with resource tracker. UNREGISTERNr7r9r r r rszResourceTracker.unregistercCsb|d|||d}t|dkr0tdt|j|}|t|ks^td|t|dS)Nz {0}:{1}:{2} asciiiz name too longznbytes {0:n} but len(msg) {1:n}) rformatencodelen ValueErrorrr4rAssertionError)rr/r:r;msgnbytesr r r r8s zResourceTracker._sendN) __name__ __module__ __qualname__rrrrrrrr8r r r r r.s @ rc Csttjtjttjtjtr2ttjttj tj fD]&}z | Wq>t k rbYq>Xq>ddt D}zt|d}|D]}z|dd\}}}t |d} | dkrtd |d ||d kr|||n2|d kr|||n|d krn td|Wqt k rTztjtWn YnXYqXqW5QRXW5|D]\}}|rztdt||fWnt k rYnX|D]V}zLzt ||Wn6t k r}ztd||fW5d}~XYnXW5XqqnXdS)zRun resource tracker.cSsi|] }|tqSr )set).0r;r r r szmain..zQresource_tracker: There appear to be %d leaked %s objects to clean up at shutdownzresource_tracker: %r: %sNrbr=:zCannot register z. for automatic cleanup: unknown resource type r6r<ZPROBEzunrecognized command %r)r*SIGINTSIG_IGNSIGTERMr)rr+r,r#stdinstdoutrr&_CLEANUP_FUNCSkeysitemsr r!r@openstripdecodesplitgetrAaddremove RuntimeError excepthookexc_info) fdfcacher;Z rtype_cacher:eliner/Z cleanup_funcr r r mains^      (rd)rr*r#rr rr__all__hasattrr)rMrOr,rRr:_multiprocessingZ _posixshmemupdate sem_unlinkZ shm_unlinkobjectr_resource_trackerrrrrrdr r r r s4      w