B
    18\*                 @   s  d dl Z d dlZd dlZddlmZ ddlmZ g ZG dd deZG dd deZ	G d	d
 d
eZ
G dd deZG dd deZG dd dejZG dd deZdd eeD e_ejdkrLG dd dejZG dd dejZG dd dejZG dd deZG dd deZG d d! d!eZe e e d"Zeed# Zn8G d$d dejZG d%d deZd&e iZeed& Zd'd( Ze Zd)d* Zd+d, Zd-d. Z dS )/    N   )process)	reductionc               @   s   e Zd ZdS )ProcessErrorN)__name__
__module____qualname__ r	   r	   [/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/multiprocessing/context.pyr      s   r   c               @   s   e Zd ZdS )BufferTooShortN)r   r   r   r	   r	   r	   r
   r      s   r   c               @   s   e Zd ZdS )TimeoutErrorN)r   r   r   r	   r	   r	   r
   r      s   r   c               @   s   e Zd ZdS )AuthenticationErrorN)r   r   r   r	   r	   r	   r
   r      s   r   c               @   sN  e Zd ZeZeZeZeZeej	Z	eej
Z
dd Zdd ZdCddZdd	 Zd
d ZdDddZdEddZdFddZdd ZdGddZdHddZdIddZdd ZdJd d!Zd"d# Zd$d% Zdd&d'd(Zdd&d)d*Zd+d, Zd-d. ZdKd/d0Zd1d2 Z d3d4 Z!d5d6 Z"dLd7d8Z#dMd:d;Z$dNd<d=Z%e&d>d? Z'e'j(d@d? Z'dAdB Z)dS )OBaseContextc             C   s"   t  }|dkrtdn|S dS )z(Returns the number of CPUs in the systemNzcannot determine number of cpus)os	cpu_countNotImplementedError)selfnumr	   r	   r
   r   (   s    
zBaseContext.cpu_countc             C   s&   ddl m} ||  d}|  |S )zReturns a manager associated with a running server process

        The managers methods such as `Lock()`, `Condition()` and `Queue()`
        can be used to create shared objects.
        r   )SyncManager)ctx)managersr   get_contextstart)r   r   mr	   r	   r
   Manager0   s    zBaseContext.ManagerTc             C   s   ddl m} ||S )z1Returns two connection object connected by a piper   )Pipe)
connectionr   )r   duplexr   r	   r	   r
   r   ;   s    zBaseContext.Pipec             C   s   ddl m} ||  dS )z#Returns a non-recursive lock objectr   )Lock)r   )synchronizer   r   )r   r   r	   r	   r
   r   @   s    zBaseContext.Lockc             C   s   ddl m} ||  dS )zReturns a recursive lock objectr   )RLock)r   )r   r    r   )r   r    r	   r	   r
   r    E   s    zBaseContext.RLockNc             C   s   ddl m} |||  dS )zReturns a condition objectr   )	Condition)r   )r   r!   r   )r   lockr!   r	   r	   r
   r!   J   s    zBaseContext.Conditionr   c             C   s   ddl m} |||  dS )zReturns a semaphore objectr   )	Semaphore)r   )r   r#   r   )r   valuer#   r	   r	   r
   r#   O   s    zBaseContext.Semaphorec             C   s   ddl m} |||  dS )z"Returns a bounded semaphore objectr   )BoundedSemaphore)r   )r   r%   r   )r   r$   r%   r	   r	   r
   r%   T   s    zBaseContext.BoundedSemaphorec             C   s   ddl m} ||  dS )zReturns an event objectr   )Event)r   )r   r&   r   )r   r&   r	   r	   r
   r&   Y   s    zBaseContext.Eventc             C   s    ddl m} |||||  dS )zReturns a barrier objectr   )Barrier)r   )r   r'   r   )r   partiesactiontimeoutr'   r	   r	   r
   r'   ^   s    zBaseContext.Barrierr   c             C   s   ddl m} |||  dS )zReturns a queue objectr   )Queue)r   )queuesr+   r   )r   maxsizer+   r	   r	   r
   r+   c   s    zBaseContext.Queuec             C   s   ddl m} |||  dS )zReturns a queue objectr   )JoinableQueue)r   )r,   r.   r   )r   r-   r.   r	   r	   r
   r.   h   s    zBaseContext.JoinableQueuec             C   s   ddl m} ||  dS )zReturns a queue objectr   )SimpleQueue)r   )r,   r/   r   )r   r/   r	   r	   r
   r/   m   s    zBaseContext.SimpleQueuer	   c             C   s"   ddl m} ||||||  dS )zReturns a process pool objectr   )Pool)context)poolr0   r   )r   	processesinitializerZinitargsmaxtasksperchildr0   r	   r	   r
   r0   r   s    
zBaseContext.Poolc             G   s   ddl m} ||f| S )zReturns a shared objectr   )RawValue)sharedctypesr6   )r   typecode_or_typeargsr6   r	   r	   r
   r6   y   s    zBaseContext.RawValuec             C   s   ddl m} |||S )zReturns a shared arrayr   )RawArray)r7   r:   )r   r8   size_or_initializerr:   r	   r	   r
   r:   ~   s    zBaseContext.RawArray)r"   c            G   s&   ddl m} ||f|||  dS )z$Returns a synchronized shared objectr   )Value)r"   r   )r7   r<   r   )r   r8   r"   r9   r<   r	   r	   r
   r<      s    zBaseContext.Valuec            C   s    ddl m} |||||  dS )z#Returns a synchronized shared arrayr   )Array)r"   r   )r7   r=   r   )r   r8   r;   r"   r=   r	   r	   r
   r=      s    zBaseContext.Arrayc             C   s,   t jdkr(tt ddr(ddlm} |  dS )zCheck whether this is a fake forked process in a frozen executable.
        If so then run code specified by commandline and exit.
        win32frozenFr   )freeze_supportN)sysplatformgetattrspawnr@   )r   r@   r	   r	   r
   r@      s    zBaseContext.freeze_supportc             C   s   ddl m} | S )zZReturn package logger -- if it does not already exist then
        it is created.
        r   )
get_logger)utilrE   )r   rE   r	   r	   r
   rE      s    zBaseContext.get_loggerc             C   s   ddl m} ||S )z8Turn on logging and add a handler which prints to stderrr   )log_to_stderr)rF   rG   )r   levelrG   r	   r	   r
   rG      s    zBaseContext.log_to_stderrc             C   s   ddl m} dS )zVInstall support for sending connections and sockets
        between processes
        r   )r   N) r   )r   r   r	   r	   r
   allow_connection_pickling   s    z%BaseContext.allow_connection_picklingc             C   s   ddl m} || dS )zSets the path to a python.exe or pythonw.exe binary used to run
        child processes instead of sys.executable when using the 'spawn'
        start method.  Useful for people embedding Python.
        r   )set_executableN)rD   rK   )r   
executablerK   r	   r	   r
   rK      s    zBaseContext.set_executablec             C   s   ddl m} || dS )zkSet list of module names to try to load in forkserver process.
        This is really just a hint.
        r   )set_forkserver_preloadN)
forkserverrM   )r   module_namesrM   r	   r	   r
   rM      s    z"BaseContext.set_forkserver_preloadc             C   sH   |d kr| S yt | }W n" tk
r:   td| d Y nX |  |S )Nzcannot find context for %r)_concrete_contextsKeyError
ValueError_check_available)r   methodr   r	   r	   r
   r      s    zBaseContext.get_contextFc             C   s   | j S )N)_name)r   
allow_noner	   r	   r
   get_start_method   s    zBaseContext.get_start_methodc             C   s   t dd S )Nz+cannot set start method of concrete context)rR   )r   rT   forcer	   r	   r
   set_start_method   s    zBaseContext.set_start_methodc             C   s   t  dS )z_Controls how objects will be reduced to a form that can be
        shared with other processes.r   )globalsget)r   r	   r	   r
   reducer   s    zBaseContext.reducerc             C   s   |t  d< d S )Nr   )rZ   )r   r   r	   r	   r
   r\      s    c             C   s   d S )Nr	   )r   r	   r	   r
   rS      s    zBaseContext._check_available)T)N)r   )r   )NN)r   )r   )NNr	   N)N)N)F)F)*r   r   r   r   r   r   r   staticmethodr   current_processactive_childrenr   r   r   r   r    r!   r#   r%   r&   r'   r+   r.   r/   r0   r6   r:   r<   r=   r@   rE   rG   rJ   rK   rM   r   rW   rY   propertyr\   setterrS   r	   r	   r	   r
   r      sJ   








 





r   c               @   s   e Zd ZdZedd ZdS )ProcessNc             C   s   t  j| S )N)_default_contextr   rb   _Popen)process_objr	   r	   r
   rd      s    zProcess._Popen)r   r   r   _start_methodr]   rd   r	   r	   r	   r
   rb      s   rb   c                   sF   e Zd ZeZdd Zd fdd	ZdddZdd	d
Zdd Z  Z	S )DefaultContextc             C   s   || _ d | _d S )N)rc   _actual_context)r   r1   r	   r	   r
   __init__   s    zDefaultContext.__init__Nc                s0   |d kr | j d kr| j| _ | j S t |S d S )N)rh   rc   superr   )r   rT   )	__class__r	   r
   r      s
    
zDefaultContext.get_contextFc             C   s<   | j d k	r|std|d kr,|r,d | _ d S | || _ d S )Nzcontext has already been set)rh   RuntimeErrorr   )r   rT   rX   r	   r	   r
   rY      s    zDefaultContext.set_start_methodc             C   s"   | j d kr|rd S | j| _ | j jS )N)rh   rc   rU   )r   rV   r	   r	   r
   rW      s
    
zDefaultContext.get_start_methodc             C   s,   t jdkrdgS tjr dddgS ddgS d S )Nr>   rD   forkrN   )rA   rB   r   HAVE_SEND_HANDLE)r   r	   r	   r
   get_all_start_methods   s
    

z$DefaultContext.get_all_start_methods)N)F)F)
r   r   r   rb   ri   r   rY   rW   ro   __classcell__r	   r	   )rk   r
   rg      s   

rg   c             C   s   g | ]}|d  dkr|qS )r   _r	   ).0xr	   r	   r
   
<listcomp>  s    rt   r>   c               @   s   e Zd ZdZedd ZdS )ForkProcessrm   c             C   s   ddl m} || S )Nr   )Popen)Z
popen_forkrv   )re   rv   r	   r	   r
   rd     s    zForkProcess._PopenN)r   r   r   rf   r]   rd   r	   r	   r	   r
   ru     s   ru   c               @   s   e Zd ZdZedd ZdS )SpawnProcessrD   c             C   s   ddl m} || S )Nr   )rv   )Zpopen_spawn_posixrv   )re   rv   r	   r	   r
   rd     s    zSpawnProcess._PopenN)r   r   r   rf   r]   rd   r	   r	   r	   r
   rw     s   rw   c               @   s   e Zd ZdZedd ZdS )ForkServerProcessrN   c             C   s   ddl m} || S )Nr   )rv   )Zpopen_forkserverrv   )re   rv   r	   r	   r
   rd      s    zForkServerProcess._PopenN)r   r   r   rf   r]   rd   r	   r	   r	   r
   rx     s   rx   c               @   s   e Zd ZdZeZdS )ForkContextrm   N)r   r   r   rU   ru   rb   r	   r	   r	   r
   ry   %  s   ry   c               @   s   e Zd ZdZeZdS )SpawnContextrD   N)r   r   r   rU   rw   rb   r	   r	   r	   r
   rz   )  s   rz   c               @   s   e Zd ZdZeZdd ZdS )ForkServerContextrN   c             C   s   t jstdd S )Nz%forkserver start method not available)r   rn   rR   )r   r	   r	   r
   rS   0  s    z"ForkServerContext._check_availableN)r   r   r   rU   rx   rb   rS   r	   r	   r	   r
   r{   -  s   r{   )rm   rD   rN   rm   c               @   s   e Zd ZdZedd ZdS )rw   rD   c             C   s   ddl m} || S )Nr   )rv   )Zpopen_spawn_win32rv   )re   rv   r	   r	   r
   rd   ?  s    zSpawnProcess._PopenN)r   r   r   rf   r]   rd   r	   r	   r	   r
   rw   =  s   c               @   s   e Zd ZdZeZdS )rz   rD   N)r   r   r   rU   rw   rb   r	   r	   r	   r
   rz   D  s   rD   c             C   s   t |  t_d S )N)rP   rc   rh   )rT   r	   r	   r
   _force_start_methodQ  s    r|   c               C   s   t tdd S )Nspawning_popen)rC   _tlsr	   r	   r	   r
   get_spawning_popenZ  s    r   c             C   s
   | t _d S )N)r~   r}   )popenr	   r	   r
   set_spawning_popen]  s    r   c             C   s    t  d krtdt| j d S )NzF%s objects should only be shared between processes through inheritance)r   rl   typer   )objr	   r	   r
   assert_spawning`  s    
r   )!r   rA   	threadingrI   r   r   __all__	Exceptionr   r   r   r   objectr   ZBaseProcessrb   rg   dirrB   ru   rw   rx   ry   rz   r{   rP   rc   r|   localr~   r   r   r   r	   r	   r	   r
   <module>   sD    >'

