o
    
i*                     @   s:  d dl Z d dlZd dlmZ d dlZd dlmZmZm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZ d dlZd dlmZ d dlmZ ejZdZd	Zd
d Zdd ZdedfddZdedfddZd#ddZd$ddZdd ZG dd dZ ed%ddZ!efddZ"e#dkre$e j%e j%&d d!  Z'ee'd" dS dS )&    N)Popencheck_outputPIPESTDOUTCalledProcessError)pickle)contextmanager)ProcessPoolExecutor)dumps)TimeoutExpired<   a test valuec                  C   s   dd } | S )Nc                 S   s   t dksJ ttdS )Nr   
   )TEST_GLOBALSsumrange)x r   U/home/ubuntu/.local/lib/python3.10/site-packages/srsly/tests/cloudpickle/testutils.pyg   s   zmake_local_function.<locals>.gr   )r   r   r   r   make_local_function   s   r   c                  C   sF   t t t td} tj }dj| tj	tj
d}||d< | |fS )z5Helper to prepare environment for the child processesz..z{src}{sep}tests{pathsep}{src})srcseppathsep
PYTHONPATH)opnormpathjoindirname__file__osenvironcopyformatr   r   )cloudpickle_repo_folderenv
pythonpathr   r   r   _make_cwd_env   s   

r'   c              
   C   s   t jdtdt|g}t \}}|r|| t|ttt||dd}t| |d}z-i }	||	d< |j	|fi |	\}
}|j
dksBt|rRd|j
 }||d	7 }t||
W S  ty| } z|  |	 \}
}d
|
d	|d	g}t||d}~ww )u  Retrieve pickle string of an object generated by a child Python process

    Pickle the input data into a buffer, send it to a subprocess via
    stdin, expect the subprocess to unpickle, re-pickle that data back
    and send it back to the parent process via stdout for final unpickling.

    >>> testutils.subprocess_pickle_string([1, 'a', None], protocol=2)
    b']q (KX   aqNe.'

    	-W ignore
--protocol   )stdinstdoutstderrcwdr%   bufsizeprotocoltimeoutr   zSubprocess returned %d: utf-8
N)sys
executabler   strr'   updater   r   r
   communicate
returncodelendecodeRuntimeErrorr   killr   )
input_datar1   r2   add_envcmdr.   r%   procpickle_stringcomm_kwargsouterrmessageer   r   r   subprocess_pickle_string(   s0   



rI   c                 C   s   t | |||d}t|S )aH  Echo function with a child Python process
    Pickle the input data into a buffer, send it to a subprocess via
    stdin, expect the subprocess to unpickle, re-pickle that data back
    and send it back to the parent process via stdout for final unpickling.
    >>> subprocess_pickle_echo([1, 'a', None])
    [1, 'a', None]
    )r1   r2   r@   )rI   loads)r?   r1   r2   r@   rE   r   r   r   subprocess_pickle_echoP   s   	rK   r*   c                 C   s,   d}	 |  |}||7 }t||k r	 |S q)N    )readr;   )	stream_in
chunk_sizeall_datadatar   r   r   _read_all_bytes`   s   
rR   c                 C   sv   | du rt j} |du rt j}t| dr| j} t|dr|j}t| }|   t|}t||d}|	| |  dS )z5Read a pickle from stdin and pickle it back to stdoutNbufferr0   )
r5   r+   r,   hasattrrS   rR   closerJ   r
   write)rN   
stream_outr1   input_bytesobjrepickled_bytesr   r   r   pickle_echoj   s   


r[   c              
   C   sV   t | \}}}z	||i |}W n ty$ } z|}W Y d}~nd}~ww t||dS )zARemote function call that uses cloudpickle to transport everthingNr0   )rJ   BaseExceptionr
   )payloadr1   funcargskwargsresultrH   r   r   r   	call_func   s   rb   c                   @   s.   e Zd Zd
ddZdd Zdd Zdd	 ZdS )_WorkerNc                 C   s(   || _ tdd| _| jtd  d S )N   )max_workers*   )r1   r	   poolsubmitidra   )selfr1   r   r   r   __init__   s   z_Worker.__init__c                 O   sD   t |||f| jd}| jt|| j }t|}t|tr ||S )z Synchronous remote function callr0   )	r
   r1   rg   rh   rb   ra   rJ   
isinstancer\   )rj   r^   r_   r`   input_payloadresult_payloadra   r   r   r   run   s   
z_Worker.runc                 C   sR   dd t | jjD }t|}|dkrdS |dkrtd| t|d  jS )Nc                 S   s    g | ]}t |d r|jn|qS )pid)rT   rp   ).0pr   r   r   
<listcomp>   s    z#_Worker.memsize.<locals>.<listcomp>r   rd   z Unexpected number of workers: %d)	listrg   
_processesr;   r=   psutilProcessmemory_inforss)rj   workers_pidsnum_workersr   r   r   memsize   s   
z_Worker.memsizec                 C   s   | j jdd d S )NT)wait)rg   shutdown)rj   r   r   r   rU      s   z_Worker.closeN)__name__
__module____qualname__rk   ro   r|   rU   r   r   r   r   rc      s
    
rc   c                 c   s    t | d}|V  |  d S )Nr0   )rc   rU   )r1   workerr   r   r   subprocess_worker   s   
r   c              
   C   sF  t jdd\}}t| zt|d}|| d W d   n1 s&w   Y  tjd|g}t	 \}}|t
|d}tjd}	|	rJ|	|d	 d< ||d
< z/z
t|fi |}
W n typ } ztd|jd |d}~ww |
dkr|t|
dW n ty } ztd|jd |d}~ww W t| dS t| w )zUtility to help check pickleability of objects defined in __main__

    The script provided in the source code should return 0 and not print
    anything on stderr or stdout.
    z_src_test_cloudpickle.py)suffixwbr3   Nr(   )r.   r-   r%   COVERAGE_PROCESS_STARTr%   r2   zscript errored with output:
%srL   z!script timeout, output so far:
%s)tempfilemkstempr    rU   openrV   encoder5   r6   r'   r   r!   getr   r   r=   outputr<   AssertionErrorr   unlink)source_coder2   fdsource_filefrA   r.   r%   r`   coverage_rcrE   rH   r   r   r   assert_run_python_script   sP   



r   __main__r)   rd   r0   )r*   )NNNr   )(r5   r    os.pathpathr   r   
subprocessr   r   r   r   r   srsly.cloudpickle.compatr   
contextlibr   concurrent.futuresr	   rv   srsly.cloudpickler
   r   rJ   TIMEOUTr   r   r'   rI   rK   rR   r[   rb   rc   r   r   r   intargvindexr1   r   r   r   r   <module>   sB    

(




!&