o
    ¡D®f¦$  ã                   @   s  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 g d¢Zej	d  dkZ
ejdkp=eedƒo=eedƒo=eejd	ƒZe
rNd dlZG d
d„ dejƒZn	G dd„ dejƒZejZd6dd„Zejdkr‰eg d¢7 ZddlmZ d7dd„Zdd„ Zdd„ Zdd„ ZG dd„ dƒZn#eg d¢7 Zd dlZejdkZdd„ Zd d!„ Zd"d„ Zd#d„ Zd$d%„ Zd&d'„ ZG d(d)„ d)ƒZ ee!e ƒ j"ƒeƒ d*d+„ Z#ee!e$j%ƒe#ƒ ee!e&j'ƒe#ƒ d,d-„ Z(d.d/„ Z)ee j*e(ƒ ejdkr÷d0d1„ Z+d2d3„ Z,eeje+ƒ dS d4d1„ Z+d5d3„ Z,eeje+ƒ dS )8é    Né   )Úcontext)Úsend_handleÚrecv_handleÚForkingPicklerÚregisterÚdumpé   Úwin32ÚCMSG_LENÚ
SCM_RIGHTSÚsendmsgc                       sX   e Zd ZdZi ZejZ‡ fdd„Ze	dd„ ƒZ
e	ddd„ƒZe	dd	d
„ƒZejZ‡  ZS )r   ú)Pickler subclass used by multiprocessing.c                    s.   t t| ƒj|Ž  | j ¡ | _| j | j¡ d S ©N)Úsuperr   Ú__init__Ú_copyreg_dispatch_tableÚcopyÚdispatch_tableÚupdateÚ_extra_reducers)ÚselfÚargs©Ú	__class__© úK/home/ubuntu/webapp/venv/lib/python3.10/site-packages/billiard/reduction.pyr   *   s   zForkingPickler.__init__c                 C   s   || j |< dS )ú&Register a reduce function for a type.N)r   )ÚclsÚtypeÚreducer   r   r   r   /   s   úForkingPickler.registerNc                 C   ó    t  ¡ }| ||ƒ |¡ | ¡ S r   )ÚioÚBytesIOr   Ú	getbuffer©r   ÚobjÚprotocolÚbufr   r   r   Údumps4   ó   úForkingPickler.dumpsc                 C   ó   |   | ¡ ¡S r   )Úloadsr%   ©r   r)   r(   r   r   r   Úloadbuf:   ó   úForkingPickler.loadbufr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úcopyregr   r   r   Úclassmethodr   r*   r0   Úpickler.   Ú__classcell__r   r   r   r   r   %   s    
r   c                   @   sV   e Zd ZdZejj ¡ Zedd„ ƒZ	eddd„ƒZ
eddd„ƒZeejfd	d
„ƒZdS )r   r   c                    s   ‡ fdd„}|| j |< dS )r   c                    s   ˆ |ƒ}| j |d|iŽ d S )Nr'   )Úsave_reduce)r   r'   Úrv©r    r   r   Ú
dispatcherI   s   z+ForkingPickler.register.<locals>.dispatcherN)Údispatch)r   r   r    r>   r   r=   r   r   F   s   r!   Nc                 C   r"   r   )r#   r$   r   Úgetvaluer&   r   r   r   r*   N   r+   r,   c                 C   r-   r   )r.   r@   r/   r   r   r   r0   T   r1   r2   c                 C   s   t |tjƒr
| ¡ }||ƒS r   )Ú
isinstancer#   r$   r@   )r   r)   r.   r   r   r   r.   X   s   zForkingPickler.loadsr   )r3   r4   r5   r6   r9   ÚPicklerr?   r   r8   r   r*   r0   r.   r   r   r   r   r   B   s    
c                 C   s   t ||ƒ | ¡ dS )z3Replacement for pickle.dump() using ForkingPickler.N)r   r   )r'   Úfiler(   r   r   r   r   `   s   r   )Ú	DupHandleÚ	duplicateÚsteal_handle)Ú_winapiFc                 C   s*   |du rt  ¡ }t  t  ¡ | |d|t j¡S )z<Duplicate a handle.  (target_process is a handle not a pid!)Nr   )rG   ÚGetCurrentProcessÚDuplicateHandleÚDUPLICATE_SAME_ACCESS)ÚhandleÚtarget_processÚinheritabler   r   r   rE   m   s   
þrE   c              	   C   sJ   t  t jd| ¡}zt  ||t  ¡ ddt jt jB ¡W t  |¡ S t  |¡ w )z5Steal a handle from process identified by source_pid.Fr   )rG   ÚOpenProcessÚPROCESS_DUP_HANDLErI   rH   rJ   ÚDUPLICATE_CLOSE_SOURCEÚCloseHandle)Ú
source_pidrK   Úsource_process_handler   r   r   rF   u   s   ÿ

ýrF   c                 C   s   t |tj|ƒ}|  |¡ dS ©z&Send a handle over a local connection.N)rD   rG   rJ   Úsend)ÚconnrK   Údestination_pidÚdhr   r   r   r      s   r   c                 C   s   |   ¡  ¡ S )ú)Receive a handle over a local connection.)ÚrecvÚdetach)rV   r   r   r   r   †   s   r   c                   @   s"   e Zd ZdZddd„Zdd„ ZdS )rD   zPicklable wrapper for a handle.Nc              	   C   sf   |d u rt  ¡ }t tjd|¡}zt t ¡ |||dd¡| _W t |¡ nt |¡ w || _	|| _
d S )NFr   )ÚosÚgetpidrG   rN   rO   rI   rH   Ú_handlerQ   Ú_accessÚ_pid)r   rK   ÚaccessÚpidÚprocr   r   r   r   Œ   s   
þ
zDupHandle.__init__c              	   C   s^   | j t ¡ kr
| jS t tjd| j ¡}zt || jt ¡ | j	dtj
¡W t |¡ S t |¡ w )z1Get the handle.  This should only be called once.F)r`   r\   r]   r^   rG   rN   rO   rI   rH   r_   rP   rQ   )r   rc   r   r   r   r[   ›   s   
ÿ
þzDupHandle.detachr   )r3   r4   r5   r6   r   r[   r   r   r   r   rD   Š   s    
rD   )ÚDupFdÚsendfdsÚrecvfdsÚdarwinc                 C   sZ   t   d|¡}tt|ƒd gƒ}|  |gtjtj|fg¡ tr)|  d¡dkr+t	dƒ‚dS dS )z,Send an array of fds over an AF_UNIX socket.Úié   r   ó   Az%did not receive acknowledgement of fdN)
ÚarrayÚbytesÚlenr   ÚsocketÚ
SOL_SOCKETr   ÚACKNOWLEDGErZ   ÚRuntimeError)ÚsockÚfdsÚmsgr   r   r   re   ³   s   ÿre   c              	   C   sú   t   d¡}|j| }|  dt |¡¡\}}}}|s|st‚zQtr%|  d¡ t|ƒdkr3t	dt|ƒ ƒ‚|d \}}	}
|tj
kre|	tjkrjt|
ƒ|j dkrOt‚| |
¡ t|ƒd |d ks`J ‚t|ƒW S W t	dƒ‚W t	dƒ‚ ttfy|   Y t	dƒ‚w )z/Receive an array of fds over an AF_UNIX socket.rh   r   rj   zreceived %d items of ancdatar   ri   zInvalid data received)rk   ÚitemsizeÚrecvmsgrn   r   ÚEOFErrorrp   rU   rm   rq   ro   r   Ú
ValueErrorÚ	frombytesÚlistÚ
IndexError)rr   ÚsizeÚaÚ
bytes_sizert   ÚancdataÚflagsÚaddrÚ
cmsg_levelÚ	cmsg_typeÚ	cmsg_datar   r   r   rf   »   s<   


ÿ

ÿ



ú	øþþrf   c                 C   sL   |   ¡ }t |tjtj¡}t||gƒ W d  ƒ dS 1 sw   Y  dS rT   )Úfilenorn   ÚfromfdÚAF_UNIXÚSOCK_STREAMre   )rV   rK   rW   ÚfdÚsr   r   r   r   ×   s   "ÿc                 C   sL   |   ¡ }t |tjtj¡}t|dƒd W  d  ƒ S 1 sw   Y  dS )rY   r   r   N)r…   rn   r†   r‡   rˆ   rf   )rV   r‰   rŠ   r   r   r   r   Ý   s   $ÿc                 C   sB   t  ¡ }|dur| | | ¡¡S trddlm} | | ¡S tdƒ‚)zReturn a wrapper for an fd.Nr   )Úresource_sharerz&SCM_RIGHTS appears not to be available)r   Úget_spawning_popenrd   Úduplicate_for_childÚHAVE_SEND_HANDLEÚ r‹   rx   )r‰   Ú	popen_objr‹   r   r   r   rd   ã   s   
rd   c                 C   s.   | j d u rt| j| jjffS t| j | jjffS r   )Ú__self__Úgetattrr   Ú__func__r3   ©Úmr   r   r   Ú_reduce_methodó   s   
r–   c                   @   s   e Zd Zdd„ ZdS )Ú_Cc                 C   s   d S r   r   )r   r   r   r   Úfû   s   z_C.fN)r3   r4   r5   r˜   r   r   r   r   r—   ú   s    r—   c                 C   s   t | j| jffS r   )r’   Ú__objclass__r3   r”   r   r   r   Ú_reduce_method_descriptor   s   rš   c                 C   s   t | j| j| jp	i ffS r   )Ú_rebuild_partialÚfuncr   Úkeywords)Úpr   r   r   Ú_reduce_partial  ó   rŸ   c                 C   s   t j| g|¢R i |¤ŽS r   )Ú	functoolsÚpartial)rœ   r   r   r   r   r   r›   
  r    r›   c                 C   s   ddl m} t|| ƒffS )Nr   )Ú	DupSocket)r‹   r£   Ú_rebuild_socket)rŠ   r£   r   r   r   Ú_reduce_socket  s   r¥   c                 C   s   |   ¡ S r   )r[   )Údsr   r   r   r¤     s   r¤   c                 C   s"   t |  ¡ ƒ}t|| j| j| jffS r   )rd   r…   r¤   Úfamilyr   Úproto)rŠ   Údfr   r   r   r¥     s   c                 C   s   |   ¡ }tj||||dS )N)r…   )r[   rn   )r©   r§   r   r¨   r‰   r   r   r   r¤   "  s   r   )NF)-r¡   r#   r\   r9   rn   Úsysr   r   Ú__all__Úversion_infoÚPY3ÚplatformÚhasattrrŽ   r7   rB   r   r   r   ÚcompatrG   rE   rF   r   r   rD   rk   rp   re   rf   rd   r–   r—   r   r˜   rš   rz   ÚappendÚintÚ__add__rŸ   r›   r¢   r¥   r¤   r   r   r   r   Ú<module>   sj   	

ÿ
ý



#

