uawdijnntqw1x1x1
IP : 216.73.216.110
Hostname : 6.87.74.97.host.secureserver.net
Kernel : Linux 6.87.74.97.host.secureserver.net 4.18.0-553.83.1.el8_10.x86_64 #1 SMP Mon Nov 10 04:22:44 EST 2025 x86_64
Disable Function : None :)
OS : Linux
PATH:
/
home
/
emeraadmin
/
www
/
node_modules
/
lodash.isstring
/
..
/
d3-array
/
..
/
..
/
4d695
/
multiprocessing.zip
/
/
PK:W�\Y�,��7�7,__pycache__/forkserver.cpython-312.opt-2.pycnu�[���� T��h�/��b�ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl mZddlm Z ddl mZddl mZddl mZgd �Zd Zej&d�ZGd�d e�Zdd�Zd�Zd�Zd�Ze�Zej8Zej:Zej<Zej>Zy)�N�)� connection)�process)� reduction)�resource_tracker)�spawn)�util)�ensure_running�get_inherited_fds�connect_to_new_process�set_forkserver_preload��qc�6�eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z y) � ForkServerc�~�d|_d|_d|_d|_t j �|_dg|_y)N�__main__)�_forkserver_address�_forkserver_alive_fd�_forkserver_pid�_inherited_fds� threading�Lock�_lock�_preload_modules��selfs �3/usr/lib64/python3.12/multiprocessing/forkserver.py�__init__zForkServer.__init__"s:��#'�� �$(��!�#���"����^�^�%�� �!+����c�f�|j5|j�ddd�y#1swYyxYw�N)r�_stop_unlockedrs r�_stopzForkServer._stop*s�� �Z�Z����!��Z�Z�s�'�0c�B�|j�ytj|j�d|_tj|jd�d|_tj|j�stj|j�d|_y)Nr) r�os�closer�waitpidr �is_abstract_socket_namespacer�unlinkrs rr#zForkServer._stop_unlocked/sw�����'�� ����*�*�+�$(��!� � � �4�'�'��+�#����0�0��1I�1I�J��I�I�d�.�.�/�#'�� r c�N� td�|D��std��||_y)Nc3�>K�|]}t|�tu���y�wr")�type�str)�.0�mods r� <genexpr>z4ForkServer.set_forkserver_preload.<locals>.<genexpr>@s����=�}��4��9��#�}�s�z&module_names must be a list of strings)�all� TypeErrorr)r� modules_namess rr z!ForkServer.set_forkserver_preload>s'��L��=�}�=�=��D�E�E� -��r c�� |jSr")rrs rrzForkServer.get_inherited_fdsDs�� � �"�"�"r c�� |j�t|�dztk\rtd��t jtj �5}|j |j�tj�\}}tj�\}}|||jtj�g}||z } tj||�||ftj|�tj|�cddd�S#tj|�tj|��xYw#tj|�tj|�wxYw#1swYyxYw)N�ztoo many fds)r �len�MAXFDS_TO_SEND� ValueError�socket�AF_UNIX�connectrr&�piperr�getfdr�sendfdsr')r�fds�client�parent_r�child_w�child_r�parent_w�allfdss rrz!ForkServer.connect_to_new_processLs �� � �����s�8�a�<�>�)��^�,�,� �]�]�6�>�>� *�f��N�N�4�3�3�4� "��� ��H�g� "��� ��G�X��w��(A�(A�&�,�,�.�0�F��c�M�F� "��!�!�&�&�1���)�����!�����!�!+� *�� �����"�����"�������!�����!��!+� *�s1�A1E3�D� *E3�-E�E�,E0�0E3�3E<c�6� |j5tj�|j�qt j |jtj�\}}|s ddd�yt j|j�d|_ d|_d|_d}|jrBddh}tjd�}|j�D��cic] \}}||vs�||��}}}ni}tjtj�5}t!j"d�} |j%| �t'j(| �st j*| d�|j-�t j.�\} } |j1�| g}||j1�| |j|fz}tj2�} | gt'j4�z}|d|gz }t'j6| ||�} t j| �| |_ ||_||_ddd�ddd�ycc}}w#t j|��xYw#t j| �wxYw#1swY�MxYw#1swYyxYw)NzCfrom multiprocessing.forkserver import main; main(%d, %d, %r, **%r)� main_path�sys_path�ignorer<i�z-c)rrr rr&r(�WNOHANGr'rrrr�get_preparation_data�itemsr;r<r�arbitrary_address�bindr r)�chmod�listenr>�fileno�get_executable�_args_from_interpreter_flags�spawnv_passfds)r�pid�status�cmd�desired_keys�data�x�y�listener�address�alive_r�alive_w�fds_to_pass�exe�argss rr zForkServer.ensure_runningis+�� ��Z�Z��+�+�-��#�#�/� �j�j��)=�)=�r�z�z�J���V����Z�����2�2�3�+/��(�,0��)�'+��$�,�C��$�$� +�Z�8���1�1�(�;��)-����K����A��l�9J��1����K������v�~�~�.�(�$�6�6�y�A��� � �g�&��8�8��A��H�H�W�e�,����!�$&�7�7�9� ���&�#+�?�?�#4�g�">�K��H�O�O�-�w��8M�8M� �"�"�C��.�.�0�C��5�4�#D�#D�#F�F�D��T�3�K�'�D��-�-�c�4��E�C� �H�H�W�%�+2��(�,3��)�'*��$�3/�1�Z��(L��,��H�H�W�%����H�H�W�%��-/�.��1�Z�si�AJ�,A.J�I�'I�,)J�A9J�A=I� *J�7J�J�I&�&I)�)J�J�J �J�JN) �__name__� __module__�__qualname__rr$r#r rrr �r rrr s%��-�"� (�.�#�"�:8+r rc �� � |rq|�|tjddd|vrE|�Cdtj�_ tj|�tj�`|D]} t|��tj�tj�\}}tj|d�tj|d�d�}tj|tj tj"i} | j%�D� �cic]\} }| tj| |���}} }tj&|�i} t)j(t(j*|��5}t-j.�5}|j1�t2_|j7|t,j8�|j7|t,j8�|j7|t,j8� |j;�D��cgc]\}}|j<��}}}|rn�0||vrt>�||vr�tj@|d� tjBdtjD�\}}|dk(rne| jI|d�}|�8tjJ|�} tM||�tjP|�ntSjTd |z���||v�rK|jW�d5}tYjZ|t\d z�}t_|�t\kDr#tadjct_|����|^}}}|jQ�tjd�}|dk(rld } |jQ�|jQ�||||g}|jg| ji��tk||||�}tjv|�nC tM||�|| |<tjP|�|D]}tjP|��ddd���<#tj�`wxYw#t$rY���wxYwcc}} wcc}}w#tF$rY���wxYw#tN$rY���wxYw#tl$rFtjntjp��tjrju�Y��wxYw#tjv|�wxYw#tN$rY�� wxYw#1swY��xYw#tx$r)}|jztzj|k7r�Yd}~��d}~wwxYw#1swYnxYw ddd�y#1swYyxYw)NrTFc��yr"rh)�_unuseds r�sigchld_handlerzmain.<locals>.sigchld_handler�s��r )rSi���rz.forkserver: waitpid returned unexpected pid %drzToo many ({0:n}) fds to send)?�sys�pathr�current_process�_inheritingr�import_main_path� __import__�ImportErrorr �_close_stdinr&r>�set_blocking�signal�SIGCHLD�SIGINT�SIG_IGNrN� set_wakeup_fdr;r<� selectors�DefaultSelector�getsockname�_forkserverr�register� EVENT_READ�select�fileobj� SystemExit�readr(rL�ChildProcessError�pop�waitstatus_to_exitcode�write_signed�BrokenPipeErrorr'�warnings�warn�acceptr�recvfdsr9r8�RuntimeError�format�fork�extend�values� _serve_one� Exception� excepthook�exc_info�stderr�flush�_exit�OSError�errno�ECONNABORTED)�listener_fdr`�preloadrIrJ�modname�sig_r�sig_wrl�handlers�sig�val�old_handlers� pid_to_fdr^�selector�key�events�rfdsrW�stsrD� returncode�srArE�code� unused_fds�fd�es r�mainr��s�������"�C�H�H�Q�K��� �Y�%:�48�G�#�#�%�1� :��&�&�y�1��+�+�-�9��G� ��7�#�� �����7�7�9�L�E�5��O�O�E�5�!��O�O�E�5�!� � ����� � �v�~�~� �H�'/�n�n�&6�8�&6� ��c�����s�C�0�0�&6��8�������I� ���v�~�~�k� :�h� � "� "� $��*2�*>�*>�*@��'����(�I�$8�$8�9����'�9�#7�#7�8����%��!5�!5�6��P ��=E�_�_�=N�O�=N�M�S�&�C�K�K�=N�D�O���� �d�?�%�$��D�=��G�G�E�5�)��"�')�z�z�"�b�j�j�'A�H�C���!�8�!�"+�-�-��T�":��"�.�)+�)B�)B�3�)G�J�%� ,�W�j� A��H�H�W�-�%�M�M�+>�@C�+D�E�+�0�t�#�!���*�1�-��'�/�/��>�A�3E�F���s�8�n�4�".� >� E� E�$'��H�!.�#/�/�25�.���3���� � �g�g�i���!�8�#$�D�/� (��� 0� (��� 0�.5�w��u�-M� � *� 1� 1�)�2B�2B�2D� E�'1�'�3�2<�2>�(@��!#�����%� ,�W�c� :�.5�I�c�N��H�H�W�-�&)�� "�����'*�G.�S��Q�+�+�-�9��� �� ��&8��(P�� 1�"�!�"��$3�%� $�%��@$-�3� #������� ?� #� � � 0� 0� 2�3��!#������ $3�%� $�%��=.�-��L� ��7�7�e�0�0�0��1�� ��m %� $�� $� ;� :� :�s6�P>�(Q�!Q'�2U&�A;U�T�Q- �-,T�'Q3�/T�1R�=AT�BT�AR�T�2S?�>6T�4T�<U�>Q� Q$�#Q$�-T�3 R�<T�?R�T� R�T�R�T�AS" �S%�!S" �"S%�%S< �<T�? T �T�T �T�T�T� U �$U�U�U � U�U �U&�&U/c�n�tjd�|j�D]\}}tj||��|D]}tj|��|^t _tj_ t _ tj|�}tj||�}|S)Nrm)rwr{rNr&r'rrr�_resource_tracker�_fdr�dupr�_main) rErAr�r�r�r�r��parent_sentinelr�s rr�r�-s��� ������N�N�$���S�� � �c�3��%��� ������ %(�"�[�%��'�'�+�� ��f�f�W�o�O��;�;�w��0�D��Kr c��d}tj}t|�|krCtj||t|�z �}|std��||z }t|�|kr�Ctj |�dS)Nr zunexpected EOFr)� SIGNED_STRUCT�sizer8r&r��EOFError�unpack)r�r[�lengthr�s r�read_signedr�Dsu���D� � � �F� �d�)�f� ��G�G�B���T��*�+����+�,�,��� �� �d�)�f� � ����%�a�(�(r c��tj|�}|r/tj||�}|dk(rt d��||d}|r�.yy)Nrzshould not get here)r��packr&�writer�)r��n�msg�nbytess rr�r�NsH�� � � �Q� �C� ����"�c�"���Q�;��4�5�5��&�'�l�� r )NN) r�r&r|rwr;�structrnrr��rr�contextrrrr �__all__r9�Structr��objectrr�r�r�r�rr rrr rhr r�<module>r�s���� �� � � � ���������%������ � �c�"� �A+��A+�NC�L�.)���l���+�+���1�1��$�;�;��$�;�;�r PK:W�\1���.;.;&__pycache__/forkserver.cpython-312.pycnu�[���� T��h�/��b�ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl mZddlm Z ddl mZddl mZddl mZgd �Zd Zej&d�ZGd�d e�Zdd�Zd�Zd�Zd�Ze�Zej8Zej:Zej<Zej>Zy)�N�)� connection)�process)� reduction)�resource_tracker)�spawn)�util)�ensure_running�get_inherited_fds�connect_to_new_process�set_forkserver_preload��qc�6�eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z y) � ForkServerc�~�d|_d|_d|_d|_t j �|_dg|_y)N�__main__)�_forkserver_address�_forkserver_alive_fd�_forkserver_pid�_inherited_fds� threading�Lock�_lock�_preload_modules��selfs �3/usr/lib64/python3.12/multiprocessing/forkserver.py�__init__zForkServer.__init__"s:��#'�� �$(��!�#���"����^�^�%�� �!+����c�f�|j5|j�ddd�y#1swYyxYw�N)r�_stop_unlockedrs r�_stopzForkServer._stop*s�� �Z�Z����!��Z�Z�s�'�0c�B�|j�ytj|j�d|_tj|jd�d|_tj|j�stj|j�d|_y)Nr) r�os�closer�waitpidr �is_abstract_socket_namespacer�unlinkrs rr#zForkServer._stop_unlocked/sw�����'�� ����*�*�+�$(��!� � � �4�'�'��+�#����0�0��1I�1I�J��I�I�d�.�.�/�#'�� r c�L�td�|D��std��||_y)z>Set list of module names to try to load in forkserver process.c3�>K�|]}t|�tu���y�wr")�type�str)�.0�mods r� <genexpr>z4ForkServer.set_forkserver_preload.<locals>.<genexpr>@s����=�}��4��9��#�}�s�z&module_names must be a list of stringsN)�all� TypeErrorr)r� modules_namess rr z!ForkServer.set_forkserver_preload>s$���=�}�=�=��D�E�E� -��r c��|jS)z�Return list of fds inherited from parent process. This returns None if the current process was not started by fork server. )rrs rrzForkServer.get_inherited_fdsDs���"�"�"r c��|j�t|�dztk\rtd��t jtj �5}|j |j�tj�\}}tj�\}}|||jtj�g}||z } tj||�||ftj|�tj|�cddd�S#tj|�tj|��xYw#tj|�tj|�wxYw#1swYyxYw)a;Request forkserver to create a child process. Returns a pair of fds (status_r, data_w). The calling process can read the child process's pid and (eventually) its returncode from status_r. The calling process should write to data_w the pickled preparation and process data. �ztoo many fdsN)r �len�MAXFDS_TO_SEND� ValueError�socket�AF_UNIX�connectrr&�piperr�getfdr�sendfdsr')r�fds�client�parent_r�child_w�child_r�parent_w�allfdss rrz!ForkServer.connect_to_new_processLs�� �����s�8�a�<�>�)��^�,�,� �]�]�6�>�>� *�f��N�N�4�3�3�4� "��� ��H�g� "��� ��G�X��w��(A�(A�&�,�,�.�0�F��c�M�F� "��!�!�&�&�1���)�����!�����!�!+� *�� �����"�����"�������!�����!��!+� *�s1�A1E2�D�*E2�-E�E�,E/�/E2�2E;c�4�|j5tj�|j�qt j |jtj�\}}|s ddd�yt j|j�d|_ d|_d|_d}|jrBddh}tjd�}|j�D��cic] \}}||vs�||��}}}ni}tjtj�5}t!j"d�} |j%| �t'j(| �st j*| d�|j-�t j.�\} } |j1�| g}||j1�| |j|fz}tj2�} | gt'j4�z}|d|gz }t'j6| ||�} t j| �| |_ ||_||_ddd�ddd�ycc}}w#t j|��xYw#t j| �wxYw#1swY�MxYw#1swYyxYw) z�Make sure that a fork server is running. This can be called from any process. Note that usually a child process will just reuse the forkserver started by its parent, so ensure_running() will do nothing. NzCfrom multiprocessing.forkserver import main; main(%d, %d, %r, **%r)� main_path�sys_path�ignorer<i�z-c)rrr rr&r(�WNOHANGr'rrrr�get_preparation_data�itemsr;r<r�arbitrary_address�bindr r)�chmod�listenr>�fileno�get_executable�_args_from_interpreter_flags�spawnv_passfds)r�pid�status�cmd�desired_keys�data�x�y�listener�address�alive_r�alive_w�fds_to_pass�exe�argss rr zForkServer.ensure_runningis&���Z�Z��+�+�-��#�#�/� �j�j��)=�)=�r�z�z�J���V����Z�����2�2�3�+/��(�,0��)�'+��$�,�C��$�$� +�Z�8���1�1�(�;��)-����K����A��l�9J��1����K������v�~�~�.�(�$�6�6�y�A��� � �g�&��8�8��A��H�H�W�e�,����!�$&�7�7�9� ���&�#+�?�?�#4�g�">�K��H�O�O�-�w��8M�8M� �"�"�C��.�.�0�C��5�4�#D�#D�#F�F�D��T�3�K�'�D��-�-�c�4��E�C� �H�H�W�%�+2��(�,3��)�'*��$�3/�1�Z��(L��,��H�H�W�%����H�H�W�%��-/�.��1�Z�si�AJ�+A.J�I�&I�+)J�A9J�A=I �*J�6J�J� I%�%I(�(I?�?J�J �J�JN) �__name__� __module__�__qualname__rr$r#r rrr �r rrr s%��-�"� (�.�#�"�:8+r rc �"�|rq|�|tjddd|vrE|�Cdtj�_ tj|�tj�`|D]} t|��tj�tj�\}}tj|d�tj|d�d�}tj|tj tj"i} | j%�D� �cic]\} }| tj| |���}} }tj&|�i} t)j(t(j*|��5}t-j.�5}|j1�t2_|j7|t,j8�|j7|t,j8�|j7|t,j8� |j;�D��cgc]\}}|j<��}}}|rn�0||vr&tj>|d�dk(sJd ��t@�||vr�tj>|d � tjBdtjD�\}}|dk(rne| jI|d�}|�8tjJ|�} tM||�tjP|�ntSjTd |z���||v�rK|jW�d5}tYjZ|t\dz�}t_|�t\kDr#tadjct_|����|^}}}|jQ�tjd�}|dk(rld} |jQ�|jQ�||||g}|jg| ji��tk||||�}tjv|�nC tM||�|| |<tjP|�|D]}tjP|��ddd���\#tj�`wxYw#t$rY��wxYwcc}} wcc}}w#tF$rY���wxYw#tN$rY���wxYw#tl$rFtjntjp��tjrju�Y��wxYw#tjv|�wxYw#tN$rY�� wxYw#1swY��xYw#tx$r)}|jztzj|k7r�Yd}~��d}~wwxYw#1swYnxYw ddd�y#1swYyxYw)zRun forkserver.NrTFc��yr"rh)�_unuseds r�sigchld_handlerzmain.<locals>.sigchld_handler�s��r )rSrr zNot at EOF?i���rz.forkserver: waitpid returned unexpected pid %dzToo many ({0:n}) fds to send)?�sys�pathr�current_process�_inheritingr�import_main_path� __import__�ImportErrorr �_close_stdinr&r>�set_blocking�signal�SIGCHLD�SIGINT�SIG_IGNrN� set_wakeup_fdr;r<� selectors�DefaultSelector�getsockname�_forkserverr�register� EVENT_READ�select�fileobj�read� SystemExitr(rL�ChildProcessError�pop�waitstatus_to_exitcode�write_signed�BrokenPipeErrorr'�warnings�warn�acceptr�recvfdsr9r8�RuntimeError�format�fork�extend�values� _serve_one� Exception� excepthook�exc_info�stderr�flush�_exit�OSError�errno�ECONNABORTED)�listener_fdr`�preloadrIrJ�modname�sig_r�sig_wrl�handlers�sig�val�old_handlers� pid_to_fdr^�selector�key�events�rfdsrW�stsrD� returncode�srArE�code� unused_fds�fd�es r�mainr��s������"�C�H�H�Q�K��� �Y�%:�48�G�#�#�%�1� :��&�&�y�1��+�+�-�9��G� ��7�#�� �����7�7�9�L�E�5��O�O�E�5�!��O�O�E�5�!� � ����� � �v�~�~� �H�'/�n�n�&6�8�&6� ��c�����s�C�0�0�&6��8�������I� ���v�~�~�k� :�h� � "� "� $��*2�*>�*>�*@��'����(�I�$8�$8�9����'�9�#7�#7�8����%��!5�!5�6��P ��=E�_�_�=N�O�=N�M�S�&�C�K�K�=N�D�O���� �d�?��7�7�7�A�.�#�5�D�}�D�5�$�$��D�=��G�G�E�5�)��"�')�z�z�"�b�j�j�'A�H�C���!�8�!�"+�-�-��T�":��"�.�)+�)B�)B�3�)G�J�%� ,�W�j� A��H�H�W�-�%�M�M�+>�@C�+D�E�+�0�t�#�!���*�1�-��'�/�/��>�A�3E�F���s�8�n�4�".� >� E� E�$'��H�!.�#/�/�25�.���3���� � �g�g�i���!�8�#$�D�/� (��� 0� (��� 0�.5�w��u�-M� � *� 1� 1�)�2B�2B�2D� E�'1�'�3�2<�2>�(@��!#�����%� ,�W�c� :�.5�I�c�N��H�H�W�-�&)�� "�����'*�G.�S��Q�+�+�-�9��� �� ��&8��(P�� 1�"�!�"��$3�%� $�%��@$-�3� #������� ?� #� � � 0� 0� 2�3��!#������ $3�%� $�%��=.�-��L� ��7�7�e�0�0�0��1�� ��m %� $�� $� ;� :� :�s7�Q�'Q6�!R�1V�A;U/�T:�R �,AT:�9'R� /T:�R"�AT:�#BT.�'AR2�:T.�T�6T.�T:�U/�Q3�6 R�R�T:� R�T:�R�T:�" R/�+T:�.R/�/T:�2AT �=T�T �T�T �T.� T+ �'T.�*T+ �+T.�.T7�3T:�: U,�U'�!U/�'U,�,U/�/U8 �4V�Vc�n�tjd�|j�D]\}}tj||��|D]}tj|��|^t _tj_ t _ tj|�}tj||�}|S)Nrm)rwr{rNr&r'rrr�_resource_tracker�_fdr�dupr�_main) rErAr�r�r�r�r��parent_sentinelr�s rr�r�-s��� ������N�N�$���S�� � �c�3��%��� ������ %(�"�[�%��'�'�+�� ��f�f�W�o�O��;�;�w��0�D��Kr c��d}tj}t|�|krCtj||t|�z �}|std��||z }t|�|kr�Ctj |�dS)Nr zunexpected EOFr)� SIGNED_STRUCT�sizer8r&r��EOFError�unpack)r�r[�lengthr�s r�read_signedr�Dsu���D� � � �F� �d�)�f� ��G�G�B���T��*�+����+�,�,��� �� �d�)�f� � ����%�a�(�(r c��tj|�}|r/tj||�}|dk(rt d��||d}|r�.yy)Nrzshould not get here)r��packr&�writer�)r��n�msg�nbytess rr�r�NsH�� � � �Q� �C� ����"�c�"���Q�;��4�5�5��&�'�l�� r )NN) r�r&r|rwr;�structrnrr��rr�contextrrrr �__all__r9�Structr��objectrr�r�r�r�rr rrr rhr r�<module>r�s���� �� � � � ���������%������ � �c�"� �A+��A+�NC�L�.)���l���+�+���1�1��$�;�;��$�;�;�r PK:W�\)�d�66&__pycache__/heap.cpython-312.opt-1.pycnu�[���� T��hj-���ddlZddlmZddlZddlZddlZddlZddlZddlm Z m Z ddlmZdgZ ejdk(rddlZGd�d e�Zn$Gd �d e�Zd�Zd�Ze j(ee�Gd �de�ZGd�de�Zy)�N)�defaultdict�)� reduction�assert_spawning)�util� BufferWrapper�win32c�D�eZdZdZej �Zd�Zd�Zd�Z y)�ArenazL A shared memory area backed by anonymous memory (Windows). c�x�||_td�D]o}dtj�t |j �fz}t jd||��}tj�dk(rn|j��qtd��||_||_|j|jf|_ y)N�dz pym-%d-%s�����tagnamerzCannot find name for new mmap)�size�range�os�getpid�next�_rand�mmap�_winapi�GetLastError�close�FileExistsError�name�buffer�_state)�selfr�ir�bufs �-/usr/lib64/python3.12/multiprocessing/heap.py�__init__zArena.__init__&s����D�I��3�Z��"�b�i�i�k�4�� � �3C�%D�D���i�i��D�$�7���'�'�)�Q�.��� � �� �&�&E�F�F��D�I��D�K��9�9�d�i�i�0�D�K�c�0�t|�|jS�N)rr)rs r"�__getstate__zArena.__getstate__5s���D�!��;�;�r$c��|x\|_|_|_tjd|j|j��|_y)Nrr)rrrrr)r�states r"�__setstate__zArena.__setstate__9s3��16�6� �D�I�t�y�4�;��)�)�B�� � �4�9�9�E�D�Kr$N) �__name__� __module__�__qualname__�__doc__�tempfile�_RandomNameSequencerr#r'r*�r$r"rrs)�� �-��,�,�.�� 1� � Fr$rc�H�eZdZdZej dk(rdgZngZdd�Zd�Zy)rzJ A shared memory area backed by a temporary file (POSIX). �linuxz/dev/shmc���||_||_|dk(r�tjdt j �z|j |���\|_}t j|�tj|tj|jf�t j|j|�tj|j|j�|_ y)Nrzpym-%d-)�prefix�dir)r�fdr/�mkstemprr�_choose_dir�unlinkr�Finalizer� ftruncaterr)rrr7rs r"r#zArena.__init__Ms����D�I��D�G��R�x�!)� 0� 0�%�b�i�i�k�1��)�)�$�/�!1� ����� � �$��� � �d�B�H�H�t�w�w�j�9����T�W�W�d�+��)�)�D�G�G�T�Y�Y�7�D�Kr$c��|jD]7}tj|�}|j|jz|k\s�5|cStj�Sr&)�_dir_candidatesr�statvfs�f_bavail�f_frsizer�get_temp_dir)rr�d�sts r"r9zArena._choose_dir[sL���)�)���Z�Z��]���;�;����,��4��H�*��$�$�&�&r$N)r) r+r,r-r.�sys�platformr>r#r9r1r$r"rrCs+�� ��<�<�7�"�)�l�O� �O� 8� 'r$c��|jdk(rtd��t|jt j |j�ffS)NrzDArena is unpicklable because forking was enabled when it was created)r7� ValueError� rebuild_arenarr�DupFd)�as r"�reduce_arenarLdsC���4�4�2�:��G�H� H��q�v�v�y���q�t�t�'<�=�=�=r$c�6�t||j��Sr&)r�detach)r�dupfds r"rIrIjs���T�5�<�<�>�*�*r$c�|�eZdZdZdZdZejfd�Ze d��Z d�Zd�Zd�Z d�Zd �Zd �Zd�Zd�Zd �Zy)�Heap�i@c��tj�|_tj�|_||_g|_i|_i|_ i|_ tt�|_ g|_g|_d|_d|_y�Nr)rr�_lastpid� threading�Lock�_lock�_size�_lengths�_len_to_seq�_start_to_block�_stop_to_blockr�set�_allocated_blocks�_arenas�_pending_free_blocks� _n_mallocs�_n_frees)rrs r"r#z Heap.__init__{sy��� � ��� ��^�^�%�� ��� ��� ���� "���!���"-�S�!1������%'��!������ r$c��|dz }||z|zS)Nrr1)�n� alignment�masks r"�_roundupz Heap._roundup�s���1�}���D��T�E�!�!r$c�H�|jt|j|�tj�}|j|j kr|xjdzc_t jd|�t|�}|jj|�|d|fS)N�z"allocating a new mmap of length %dr)rh�maxrYr�PAGESIZE�_DOUBLE_ARENA_SIZE_UNTILr�inforr`�append)rr�length�arenas r"� _new_arenazHeap._new_arena�sy�����s�4�:�:�t�4�d�m�m�D���:�:��5�5�5��J�J�!�O�J�� � �6��?��f� �������E�"��q�&�!�!r$c��|j}||jkry|jj|�}|j|df=|j ||f=|jj|�|j|}|j|d|f�|s)|j|=|jj|�yyrT) r�_DISCARD_FREE_SPACE_LARGER_THANr_�popr\r]r`�remover[rZ)rrqrp�blocks�seqs r"�_discard_arenazHeap._discard_arena�s��������D�8�8�8���'�'�+�+�E�2��� � �%���,�������0������E�"����v�&��� � �E�1�f�%�&��� � ��(��M�M� � ��(�r$c�t�tj|j|�}|t|j�k(r|j |�S|j|}|j |}|j �}|s|j |=|j|=|\}}}|j||f=|j||f=|Sr&) �bisect�bisect_leftrZ�lenrrr[rur\r]) rrr rprx�blockrq�start�stops r"�_malloczHeap._malloc�s������t�}�}�d�3����D�M�M�"�"��?�?�4�(�(��]�]�1�%�F��"�"�6�*�C��G�G�I�E���$�$�V�,�d�m�m�A�.>�$����t�� � �%���0������ �.��r$c��|\}}} |j||f}|j|�\}} |j||f}|j|�\}}|||f}||z } |j|j|�||j||f<||j||f<y#t$rY�}wxYw#t$rY�fwxYw#t$r3|g|j|<t j|j|�Y�|wxYwr&) r]�_absorb�KeyErrorr\r[ror{�insortrZ) rr~rqrr�� prev_block�_� next_blockrps r"�_add_free_blockzHeap._add_free_block�s ��$����t� 0��,�,�e�U�^�<�J��|�|�J�/�H�E�1� /��-�-�u�d�m�<�J��l�l�:�.�G�A�t���t�$������ 1����V�$�+�+�E�2� 05����e�U�^�,�-2����U�D�M�*��-� �� ��� �� ��� 1�(-�w�D���V�$��M�M�$�-�-��0� 1�s4�B�B.�B=� B+�*B+�. B:�9B:�=9C9�8C9c���|\}}}|j||f=|j||f=||z }|j|}|j|�|s(|j|=|jj|�||fSr&)r\r]r[rvrZ)rr~rqrr�rprxs r"r�zHeap._absorb�s���$����t�� � �%���0������ �.��������v�&��� � �5���� � ��(��M�M� � ��(��d�{�r$c�|�|\}}}|j|}|j||f�|s|j|�yyr&)r_rvry)rr~rqrr�rws r"�_remove_allocated_blockzHeap._remove_allocated_block�sD��"���u�d��'�'��.��� � �u�d�m�$������&�r$c�� |jj�}|j|�|j |��>#t$rYywxYwr&)raru� IndexErrorr�r��rr~s r"�_free_pending_blockszHeap._free_pending_blockssU��� ��1�1�5�5�7�� � � ��'��(�(��/� ��� �� �s�A� A�Ac�$�tj�|jk7r7tdj tj�|j���|j j d�s|jj|�y |xjdz c_ |j�|j|�|j|�|j j�y#|j j�wxYw)Nz$My pid ({0:n}) is not last pid {1:n}Fr)rrrUrH�formatrX�acquirerarorcr�r�r��releaser�s r"�freez Heap.frees����9�9�;�$�-�-�'��6�=�=��I�I�K�� � �/�0� 0��z�z�!�!�%�(� �%�%�,�,�U�3� %�� � ��"� ��)�)�+��$�$�U�+��,�,�U�3�� � �"�"�$��� � �"�"�$�s �AC3�3Dc��|dkrtdj|���tj|krt dj|���tj�|jk7r|j�|j5|xjdz c_ |j�|jt|d�|j�}|j|�\}}}||z}||kr|j!|||f�|j"|j%||f�|||fcddd�S#1swYyxYw)Nr�Size {0:n} out of range�Size {0:n} too larger)rHr�rE�maxsize� OverflowErrorrrrUr#rXrbr�rhrk� _alignmentr�r�r_�add)rrrqrr�� real_stops r"�malloczHeap.malloc(s���!�8��6�=�=�d�C�D�D��;�;�$��� 6� =� =�d� C�D�D� �9�9�;�$�-�-�'��M�M�O� �Z�Z��O�O�q� �O��%�%�'��=�=��T�1��t���?�D�#'�<�<��#5� �U�E�4����I��4���$�$�e�Y��%=�>��"�"�5�)�-�-�u�i�.@�A��5�)�,��Z�Z�s � B#D7�7EN)r+r,r-r�rtrmrrlr#�staticmethodrhrrryr�r�r�r�r�r�r�r1r$r"rQrQssb���J�&3�#�,�� �M�M��:�"��"� "�)�$�"3�< �'�0�%�8-r$rQc�&�eZdZe�Zd�Zd�Zy)rc�N�|dkrtdj|���tj|krt dj|���t jj|�}||f|_tj|t jj|f��y)Nrr�r�)�args)rHr�rEr�r�r�_heapr�rrr;r�)rrr~s r"r#zBufferWrapper.__init__Fs����!�8��6�=�=�d�C�D�D��;�;�$��� 6� =� =�d� C�D�D��#�#�*�*�4�0���d�m���� � �d�M�/�/�4�4�E�8�Dr$c�^�|j\\}}}}t|j�|||zSr&)r� memoryviewr)rrqrr�rs r"�create_memoryviewzBufferWrapper.create_memoryviewOs1��%)�[�[�"����t�d��%�,�,�'��e�D�j�9�9r$N)r+r,r-rQr�r#r�r1r$r"rrBs���F�E�E�:r$)r{�collectionsrrrrEr/rV�contextrr�r�__all__rFr�objectrrLrI�registerrQrr1r$r"�<module>r�s����#�� � ���/��� ���<�<�7���F��F�H'��'�B>�+��I���u�l�+�I-�6�I-�^:�F�:r$PK:W�\[��Z5Z5&__pycache__/heap.cpython-312.opt-2.pycnu�[���� T��hj-���ddlZddlmZddlZddlZddlZddlZddlZddlm Z m Z ddlmZdgZ ejdk(rddlZGd�d e�Zn$Gd �d e�Zd�Zd�Ze j(ee�Gd �de�ZGd�de�Zy)�N)�defaultdict�)� reduction�assert_spawning)�util� BufferWrapper�win32c�B�eZdZ ej�Zd�Zd�Zd�Zy)�Arenac�x�||_td�D]o}dtj�t |j �fz}t jd||��}tj�dk(rn|j��qtd��||_||_|j|jf|_ y)N�dz pym-%d-%s�����tagnamerzCannot find name for new mmap)�size�range�os�getpid�next�_rand�mmap�_winapi�GetLastError�close�FileExistsError�name�buffer�_state)�selfr�ir�bufs �-/usr/lib64/python3.12/multiprocessing/heap.py�__init__zArena.__init__&s����D�I��3�Z��"�b�i�i�k�4�� � �3C�%D�D���i�i��D�$�7���'�'�)�Q�.��� � �� �&�&E�F�F��D�I��D�K��9�9�d�i�i�0�D�K�c�0�t|�|jS�N)rr)rs r"�__getstate__zArena.__getstate__5s���D�!��;�;�r$c��|x\|_|_|_tjd|j|j��|_y)Nrr)rrrrr)r�states r"�__setstate__zArena.__setstate__9s3��16�6� �D�I�t�y�4�;��)�)�B�� � �4�9�9�E�D�Kr$N) �__name__� __module__�__qualname__�tempfile�_RandomNameSequencerr#r'r*�r$r"rrs)�� �-��,�,�.�� 1� � Fr$rc�F�eZdZ ejdk(rdgZngZdd�Zd�Zy)r�linuxz/dev/shmc���||_||_|dk(r�tjdt j �z|j |���\|_}t j|�tj|tj|jf�t j|j|�tj|j|j�|_ y)Nrzpym-%d-)�prefix�dir)r�fdr.�mkstemprr�_choose_dir�unlinkr�Finalizer� ftruncaterr)rrr6rs r"r#zArena.__init__Ms����D�I��D�G��R�x�!)� 0� 0�%�b�i�i�k�1��)�)�$�/�!1� ����� � �$��� � �d�B�H�H�t�w�w�j�9����T�W�W�d�+��)�)�D�G�G�T�Y�Y�7�D�Kr$c��|jD]7}tj|�}|j|jz|k\s�5|cStj�Sr&)�_dir_candidatesr�statvfs�f_bavail�f_frsizer�get_temp_dir)rr�d�sts r"r8zArena._choose_dir[sL���)�)���Z�Z��]���;�;����,��4��H�*��$�$�&�&r$N)r)r+r,r-�sys�platformr=r#r8r0r$r"rrCs+�� ��<�<�7�"�)�l�O� �O� 8� 'r$c��|jdk(rtd��t|jt j |j�ffS)NrzDArena is unpicklable because forking was enabled when it was created)r6� ValueError� rebuild_arenarr�DupFd)�as r"�reduce_arenarKdsC���4�4�2�:��G�H� H��q�v�v�y���q�t�t�'<�=�=�=r$c�6�t||j��Sr&)r�detach)r�dupfds r"rHrHjs���T�5�<�<�>�*�*r$c�|�eZdZdZdZdZejfd�Ze d��Z d�Zd�Zd�Z d�Zd �Zd �Zd�Zd�Zd �Zy)�Heap�i@c��tj�|_tj�|_||_g|_i|_i|_ i|_ tt�|_ g|_g|_d|_d|_y�Nr)rr�_lastpid� threading�Lock�_lock�_size�_lengths�_len_to_seq�_start_to_block�_stop_to_blockr�set�_allocated_blocks�_arenas�_pending_free_blocks� _n_mallocs�_n_frees)rrs r"r#z Heap.__init__{sy��� � ��� ��^�^�%�� ��� ��� ���� "���!���"-�S�!1������%'��!������ r$c��|dz }||z|zS)Nrr0)�n� alignment�masks r"�_roundupz Heap._roundup�s���1�}���D��T�E�!�!r$c�H�|jt|j|�tj�}|j|j kr|xjdzc_t jd|�t|�}|jj|�|d|fS)N�z"allocating a new mmap of length %dr)rg�maxrXr�PAGESIZE�_DOUBLE_ARENA_SIZE_UNTILr�inforr_�append)rr�length�arenas r"� _new_arenazHeap._new_arena�sy�����s�4�:�:�t�4�d�m�m�D���:�:��5�5�5��J�J�!�O�J�� � �6��?��f� �������E�"��q�&�!�!r$c��|j}||jkry|jj|�}|j|df=|j ||f=|jj|�|j|}|j|d|f�|s)|j|=|jj|�yyrS) r�_DISCARD_FREE_SPACE_LARGER_THANr^�popr[r\r_�removerZrY)rrpro�blocks�seqs r"�_discard_arenazHeap._discard_arena�s��������D�8�8�8���'�'�+�+�E�2��� � �%���,�������0������E�"����v�&��� � �E�1�f�%�&��� � ��(��M�M� � ��(�r$c�t�tj|j|�}|t|j�k(r|j |�S|j|}|j |}|j �}|s|j |=|j|=|\}}}|j||f=|j||f=|Sr&) �bisect�bisect_leftrY�lenrqrZrtr[r\) rrr rorw�blockrp�start�stops r"�_malloczHeap._malloc�s������t�}�}�d�3����D�M�M�"�"��?�?�4�(�(��]�]�1�%�F��"�"�6�*�C��G�G�I�E���$�$�V�,�d�m�m�A�.>�$����t�� � �%���0������ �.��r$c��|\}}} |j||f}|j|�\}} |j||f}|j|�\}}|||f}||z } |j|j|�||j||f<||j||f<y#t$rY�}wxYw#t$rY�fwxYw#t$r3|g|j|<t j|j|�Y�|wxYwr&) r\�_absorb�KeyErrorr[rZrnrz�insortrY) rr}rpr~r� prev_block�_� next_blockros r"�_add_free_blockzHeap._add_free_block�s ��$����t� 0��,�,�e�U�^�<�J��|�|�J�/�H�E�1� /��-�-�u�d�m�<�J��l�l�:�.�G�A�t���t�$������ 1����V�$�+�+�E�2� 05����e�U�^�,�-2����U�D�M�*��-� �� ��� �� ��� 1�(-�w�D���V�$��M�M�$�-�-��0� 1�s4�B�B.�B=� B+�*B+�. B:�9B:�=9C9�8C9c���|\}}}|j||f=|j||f=||z }|j|}|j|�|s(|j|=|jj|�||fSr&)r[r\rZrurY)rr}rpr~rrorws r"r�zHeap._absorb�s���$����t�� � �%���0������ �.��������v�&��� � �5���� � ��(��M�M� � ��(��d�{�r$c�|�|\}}}|j|}|j||f�|s|j|�yyr&)r^rurx)rr}rpr~rrvs r"�_remove_allocated_blockzHeap._remove_allocated_block�sD��"���u�d��'�'��.��� � �u�d�m�$������&�r$c�� |jj�}|j|�|j |��>#t$rYywxYwr&)r`rt� IndexErrorr�r��rr}s r"�_free_pending_blockszHeap._free_pending_blockssU��� ��1�1�5�5�7�� � � ��'��(�(��/� ��� �� �s�A� A�Ac�$�tj�|jk7r7tdj tj�|j���|j j d�s|jj|�y |xjdz c_ |j�|j|�|j|�|j j�y#|j j�wxYw)Nz$My pid ({0:n}) is not last pid {1:n}Fr)rrrTrG�formatrW�acquirer`rnrbr�r�r��releaser�s r"�freez Heap.frees����9�9�;�$�-�-�'��6�=�=��I�I�K�� � �/�0� 0��z�z�!�!�%�(� �%�%�,�,�U�3� %�� � ��"� ��)�)�+��$�$�U�+��,�,�U�3�� � �"�"�$��� � �"�"�$�s �AC3�3Dc��|dkrtdj|���tj|krt dj|���tj�|jk7r|j�|j5|xjdz c_ |j�|jt|d�|j�}|j|�\}}}||z}||kr|j!|||f�|j"|j%||f�|||fcddd�S#1swYyxYw)Nr�Size {0:n} out of range�Size {0:n} too larger)rGr�rD�maxsize� OverflowErrorrrrTr#rWrar�rgrj� _alignmentr�r�r^�add)rrrpr~r� real_stops r"�malloczHeap.malloc(s���!�8��6�=�=�d�C�D�D��;�;�$��� 6� =� =�d� C�D�D� �9�9�;�$�-�-�'��M�M�O� �Z�Z��O�O�q� �O��%�%�'��=�=��T�1��t���?�D�#'�<�<��#5� �U�E�4����I��4���$�$�e�Y��%=�>��"�"�5�)�-�-�u�i�.@�A��5�)�,��Z�Z�s � B#D7�7EN)r+r,r-r�rsrlrrkr#�staticmethodrgrqrxr�r�r�r�r�r�r�r0r$r"rPrPssb���J�&3�#�,�� �M�M��:�"��"� "�)�$�"3�< �'�0�%�8-r$rPc�&�eZdZe�Zd�Zd�Zy)rc�N�|dkrtdj|���tj|krt dj|���t jj|�}||f|_tj|t jj|f��y)Nrr�r�)�args)rGr�rDr�r�r�_heapr�rrr:r�)rrr}s r"r#zBufferWrapper.__init__Fs����!�8��6�=�=�d�C�D�D��;�;�$��� 6� =� =�d� C�D�D��#�#�*�*�4�0���d�m���� � �d�M�/�/�4�4�E�8�Dr$c�^�|j\\}}}}t|j�|||zSr&)r� memoryviewr)rrpr~rrs r"�create_memoryviewzBufferWrapper.create_memoryviewOs1��%)�[�[�"����t�d��%�,�,�'��e�D�j�9�9r$N)r+r,r-rPr�r#r�r0r$r"rrBs���F�E�E�:r$)rz�collectionsrrrrDr.rU�contextrr�r�__all__rEr�objectrrKrH�registerrPrr0r$r"�<module>r�s����#�� � ���/��� ���<�<�7���F��F�H'��'�B>�+��I���u�l�+�I-�6�I-�^:�F�:r$PK:W�\�66 __pycache__/heap.cpython-312.pycnu�[���� T��hj-���ddlZddlmZddlZddlZddlZddlZddlZddlm Z m Z ddlmZdgZ ejdk(rddlZGd�d e�Zn$Gd �d e�Zd�Zd�Ze j(ee�Gd �de�ZGd�de�Zy)�N)�defaultdict�)� reduction�assert_spawning)�util� BufferWrapper�win32c�D�eZdZdZej �Zd�Zd�Zd�Z y)�ArenazL A shared memory area backed by anonymous memory (Windows). c�x�||_td�D]o}dtj�t |j �fz}t jd||��}tj�dk(rn|j��qtd��||_||_|j|jf|_ y)N�dz pym-%d-%s�����tagnamerzCannot find name for new mmap)�size�range�os�getpid�next�_rand�mmap�_winapi�GetLastError�close�FileExistsError�name�buffer�_state)�selfr�ir�bufs �-/usr/lib64/python3.12/multiprocessing/heap.py�__init__zArena.__init__&s����D�I��3�Z��"�b�i�i�k�4�� � �3C�%D�D���i�i��D�$�7���'�'�)�Q�.��� � �� �&�&E�F�F��D�I��D�K��9�9�d�i�i�0�D�K�c�0�t|�|jS�N)rr)rs r"�__getstate__zArena.__getstate__5s���D�!��;�;�r$c��|x\|_|_|_tjd|j|j��|_y)Nrr)rrrrr)r�states r"�__setstate__zArena.__setstate__9s3��16�6� �D�I�t�y�4�;��)�)�B�� � �4�9�9�E�D�Kr$N) �__name__� __module__�__qualname__�__doc__�tempfile�_RandomNameSequencerr#r'r*�r$r"rrs)�� �-��,�,�.�� 1� � Fr$rc�H�eZdZdZej dk(rdgZngZdd�Zd�Zy)rzJ A shared memory area backed by a temporary file (POSIX). �linuxz/dev/shmc���||_||_|dk(r�tjdt j �z|j |���\|_}t j|�tj|tj|jf�t j|j|�tj|j|j�|_ y)Nrzpym-%d-)�prefix�dir)r�fdr/�mkstemprr�_choose_dir�unlinkr�Finalizer� ftruncaterr)rrr7rs r"r#zArena.__init__Ms����D�I��D�G��R�x�!)� 0� 0�%�b�i�i�k�1��)�)�$�/�!1� ����� � �$��� � �d�B�H�H�t�w�w�j�9����T�W�W�d�+��)�)�D�G�G�T�Y�Y�7�D�Kr$c��|jD]7}tj|�}|j|jz|k\s�5|cStj�Sr&)�_dir_candidatesr�statvfs�f_bavail�f_frsizer�get_temp_dir)rr�d�sts r"r9zArena._choose_dir[sL���)�)���Z�Z��]���;�;����,��4��H�*��$�$�&�&r$N)r) r+r,r-r.�sys�platformr>r#r9r1r$r"rrCs+�� ��<�<�7�"�)�l�O� �O� 8� 'r$c��|jdk(rtd��t|jt j |j�ffS)NrzDArena is unpicklable because forking was enabled when it was created)r7� ValueError� rebuild_arenarr�DupFd)�as r"�reduce_arenarLdsC���4�4�2�:��G�H� H��q�v�v�y���q�t�t�'<�=�=�=r$c�6�t||j��Sr&)r�detach)r�dupfds r"rIrIjs���T�5�<�<�>�*�*r$c�|�eZdZdZdZdZejfd�Ze d��Z d�Zd�Zd�Z d�Zd �Zd �Zd�Zd�Zd �Zy)�Heap�i@c��tj�|_tj�|_||_g|_i|_i|_ i|_ tt�|_ g|_g|_d|_d|_y�Nr)rr�_lastpid� threading�Lock�_lock�_size�_lengths�_len_to_seq�_start_to_block�_stop_to_blockr�set�_allocated_blocks�_arenas�_pending_free_blocks� _n_mallocs�_n_frees)rrs r"r#z Heap.__init__{sy��� � ��� ��^�^�%�� ��� ��� ���� "���!���"-�S�!1������%'��!������ r$c��|dz }||z|zS)Nrr1)�n� alignment�masks r"�_roundupz Heap._roundup�s���1�}���D��T�E�!�!r$c�H�|jt|j|�tj�}|j|j kr|xjdzc_t jd|�t|�}|jj|�|d|fS)N�z"allocating a new mmap of length %dr)rh�maxrYr�PAGESIZE�_DOUBLE_ARENA_SIZE_UNTILr�inforr`�append)rr�length�arenas r"� _new_arenazHeap._new_arena�sy�����s�4�:�:�t�4�d�m�m�D���:�:��5�5�5��J�J�!�O�J�� � �6��?��f� �������E�"��q�&�!�!r$c��|j}||jkry|jj|�}|rJ�|j|df=|j ||f=|jj|�|j|}|j|d|f�|s)|j|=|jj|�yyrT) r�_DISCARD_FREE_SPACE_LARGER_THANr_�popr\r]r`�remover[rZ)rrqrp�blocks�seqs r"�_discard_arenazHeap._discard_arena�s��������D�8�8�8���'�'�+�+�E�2����z�� � �%���,�������0������E�"����v�&��� � �E�1�f�%�&��� � ��(��M�M� � ��(�r$c�t�tj|j|�}|t|j�k(r|j |�S|j|}|j |}|j �}|s|j |=|j|=|\}}}|j||f=|j||f=|Sr&) �bisect�bisect_leftrZ�lenrrr[rur\r]) rrr rprx�blockrq�start�stops r"�_malloczHeap._malloc�s������t�}�}�d�3����D�M�M�"�"��?�?�4�(�(��]�]�1�%�F��"�"�6�*�C��G�G�I�E���$�$�V�,�d�m�m�A�.>�$����t�� � �%���0������ �.��r$c��|\}}} |j||f}|j|�\}} |j||f}|j|�\}}|||f}||z } |j|j|�||j||f<||j||f<y#t$rY�}wxYw#t$rY�fwxYw#t$r3|g|j|<t j|j|�Y�|wxYwr&) r]�_absorb�KeyErrorr\r[ror{�insortrZ) rr~rqrr�� prev_block�_� next_blockrps r"�_add_free_blockzHeap._add_free_block�s ��$����t� 0��,�,�e�U�^�<�J��|�|�J�/�H�E�1� /��-�-�u�d�m�<�J��l�l�:�.�G�A�t���t�$������ 1����V�$�+�+�E�2� 05����e�U�^�,�-2����U�D�M�*��-� �� ��� �� ��� 1�(-�w�D���V�$��M�M�$�-�-��0� 1�s4�B�B.�B=� B+�*B+�. B:�9B:�=9C9�8C9c���|\}}}|j||f=|j||f=||z }|j|}|j|�|s(|j|=|jj|�||fSr&)r\r]r[rvrZ)rr~rqrr�rprxs r"r�zHeap._absorb�s���$����t�� � �%���0������ �.��������v�&��� � �5���� � ��(��M�M� � ��(��d�{�r$c�|�|\}}}|j|}|j||f�|s|j|�yyr&)r_rvry)rr~rqrr�rws r"�_remove_allocated_blockzHeap._remove_allocated_block�sD��"���u�d��'�'��.��� � �u�d�m�$������&�r$c�� |jj�}|j|�|j |��>#t$rYywxYwr&)raru� IndexErrorr�r��rr~s r"�_free_pending_blockszHeap._free_pending_blockssU��� ��1�1�5�5�7�� � � ��'��(�(��/� ��� �� �s�A� A�Ac�$�tj�|jk7r7tdj tj�|j���|j j d�s|jj|�y |xjdz c_ |j�|j|�|j|�|j j�y#|j j�wxYw)Nz$My pid ({0:n}) is not last pid {1:n}Fr)rrrUrH�formatrX�acquirerarorcr�r�r��releaser�s r"�freez Heap.frees����9�9�;�$�-�-�'��6�=�=��I�I�K�� � �/�0� 0��z�z�!�!�%�(� �%�%�,�,�U�3� %�� � ��"� ��)�)�+��$�$�U�+��,�,�U�3�� � �"�"�$��� � �"�"�$�s �AC3�3Dc��|dkrtdj|���tj|krt dj|���tj�|jk7r|j�|j5|xjdz c_ |j�|jt|d�|j�}|j|�\}}}||z}||kr|j!|||f�|j"|j%||f�|||fcddd�S#1swYyxYw)Nr�Size {0:n} out of range�Size {0:n} too larger)rHr�rE�maxsize� OverflowErrorrrrUr#rXrbr�rhrk� _alignmentr�r�r_�add)rrrqrr�� real_stops r"�malloczHeap.malloc(s���!�8��6�=�=�d�C�D�D��;�;�$��� 6� =� =�d� C�D�D� �9�9�;�$�-�-�'��M�M�O� �Z�Z��O�O�q� �O��%�%�'��=�=��T�1��t���?�D�#'�<�<��#5� �U�E�4����I��4���$�$�e�Y��%=�>��"�"�5�)�-�-�u�i�.@�A��5�)�,��Z�Z�s � B#D7�7EN)r+r,r-r�rtrmrrlr#�staticmethodrhrrryr�r�r�r�r�r�r�r1r$r"rQrQssb���J�&3�#�,�� �M�M��:�"��"� "�)�$�"3�< �'�0�%�8-r$rQc�&�eZdZe�Zd�Zd�Zy)rc�N�|dkrtdj|���tj|krt dj|���t jj|�}||f|_tj|t jj|f��y)Nrr�r�)�args)rHr�rEr�r�r�_heapr�rrr;r�)rrr~s r"r#zBufferWrapper.__init__Fs����!�8��6�=�=�d�C�D�D��;�;�$��� 6� =� =�d� C�D�D��#�#�*�*�4�0���d�m���� � �d�M�/�/�4�4�E�8�Dr$c�^�|j\\}}}}t|j�|||zSr&)r� memoryviewr)rrqrr�rs r"�create_memoryviewzBufferWrapper.create_memoryviewOs1��%)�[�[�"����t�d��%�,�,�'��e�D�j�9�9r$N)r+r,r-rQr�r#r�r1r$r"rrBs���F�E�E�:r$)r{�collectionsrrrrEr/rV�contextrr�r�__all__rFr�objectrrLrI�registerrQrr1r$r"�<module>r�s����#�� � ���/��� ���<�<�7���F��F�H'��'�B>�+��I���u�l�+�I-�6�I-�^:�F�:r$PK:W�\��q�RR*__pycache__/managers.cpython-312.opt-1.pycnu�[���� T��h�� ��gd�ZddlZddlZddlZddlZddlZddlZddlZddlZddlm Z ddl mZddlm Z ddlmZmZmZddlmZdd lmZdd lmZddlmZ ddlmZd Zej1d�d�Zej6eje�dD�cgc]}eei|�����c}Zd�ZeD]Z ej6e e��[ [Gd�de!�Z"difd�Z#d�Z$Gd�de%�Z&d�Z'd�Z(Gd�de!�Z)Gd�de!�Z*e jVe jXfe jZe j\fd �Z/Gd!�d"e!�Z0Gd#�d$e1�Z2Gd%�d&e!�Z3d'�Z4ifd(�Z5 dbd)�Z6Gd*�d+e!�Z7Gd,�d-e!�Z8dcd.�Z9Gd/�d0e3�Z:Gd1�d2e3�Z;Gd3�d4e;�Z<Gd5�d6e3�Z=Gd7�d8e3�Z>Gd9�d:e3�Z?Gd;�d<e3�Z@e5d=d>�ZAGd?�d@eA�ZBe5dAdB�ZCdCdDieC_De5dEdF�ZEe5dGdH�ZFdIdIdIdDdDdJ�eF_DGdK�dGeF�ZGGdL�dMe0�ZHeHj7dNej��eHj7dOej��eHj7dPej�e=�eHj7dQej�e;�eHj7dRej�e;�eHj7dSej�e;�eHj7dTej�e;�eHj7dUej�e<�eHj7dVej�e>�eHj7dWej�eG�eHj7dXeReB�eHj7dYeSeC�eHj7d-e8e@�eHj7dZe9eE�eHj7d+e7e?�eHj7dDe:d�[�eHj7dId�\�er!Gd]�d^�ZTGd_�d`e)�ZUGda�de0�ZVyy#e$rdZY���wxYwcc}w)d)�BaseManager�SyncManager� BaseProxy�Token�N)�getpid)� format_exc�)� connection)� reduction�get_spawning_popen�ProcessError)�pool)�process)�util)�get_context)� shared_memoryT�SharedMemoryManagerFc�Z�tj|j|j�ffS�N)�array�typecode�tobytes)�as �1/usr/lib64/python3.12/multiprocessing/managers.py�reduce_arrayr/s ���;�;����Q�Y�Y�[�1�1�1�)�items�keys�valuesc�&�tt|�ffSr)�list��objs r�rebuild_as_listr$4s���$�s�)���rc�,�eZdZdZdZd�Zd�Zd�Zd�Zy)rz3 Type to uniquely identify a shared object ��typeid�address�idc�0�|||c|_|_|_yrr&)�selfr'r(r)s r�__init__zToken.__init__Ds��06���,���d�l�D�Grc�H�|j|j|jfSrr&�r+s r�__getstate__zToken.__getstate__Gs�����T�\�\�4�7�7�3�3rc�.�|\|_|_|_yrr&�r+�states r�__setstate__zToken.__setstate__Js��/4�,���d�l�D�Grc��|jj�d|j�d|j�d|j�d�S)Nz(typeid=z , address=z, id=�))� __class__�__name__r'r(r)r.s r�__repr__zToken.__repr__Ms-�����'�'����d�l�l�D�G�G�M� MrN) r7� __module__�__qualname__�__doc__� __slots__r,r/r3r8�rrrr>s$���,�I�E�4�5�Mrrr=c�x�|j||||f�|j�\}}|dk(r|St||��)zL Send a message to manager using connection `c` and return response �#RETURN)�send�recv�convert_to_error)�cr)� methodname�args�kwds�kind�results r�dispatchrIUsB���F�F�B� �D�$�'�(��6�6�8�L�D�&��y��� � �4�� (�(rc ���|dk(r|S|dvrSt|t�s%tdj||t |����|dk(rtd|z�St|�St dj|��S)N�#ERROR)� #TRACEBACK�#UNSERIALIZABLEz.Result {0!r} (kind '{1}') type is {2}, not strrMzUnserializable message: %s zUnrecognized message type {!r})� isinstance�str� TypeError�format�type�RemoteError� ValueError)rGrHs rrBrB_s����x��� � �2� 2��&�#�&��@�G�G��D�$�v�,�0�1� 1��$�$��=��F�G�G��v�&�&��:�A�A�$�G�H�Hrc��eZdZd�Zy)rSc�>�dt|jd�zdzS)NzM --------------------------------------------------------------------------- rzK---------------------------------------------------------------------------)rOrEr.s r�__str__zRemoteError.__str__os��$�s�4�9�9�Q�<�'8�8�6�A�BrN)r7r9r:rWr=rrrSrSns��CrrSc�|�g}t|�D]+}t||�}t|�s�|j|��-|S)z4 Return a list of names of methods of `obj` )�dir�getattr�callable�append)r#�temp�name�funcs r�all_methodsr`vs=���D��C����s�D�!���D�>��K�K�����Krc�P�t|�D�cgc] }|ddk7s�|��c}Scc}w)zP Return a list of names of methods of `obj` which do not start with '_' r�_)r`)r#r^s r�public_methodsrc�s-��)��-�@�-�T��a��C��D�-�@�@��@s� #�#c��eZdZdZgd�Zd�Zd�Zd�Zd�Zd�Z d�Z d �Zd �Zd�Z ee ed�Zd �Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zy)�ServerzM Server class which runs in a process controlled by a manager object ) �shutdown�create�accept_connection�get_methods� debug_info�number_of_objects�dummy�incref�decrefc�z�t|t�s$tdj|t |����||_t j|�|_t|\}}||d��|_ |jj|_ddi|_i|_ i|_tj �|_y)Nz&Authkey {0!r} is type {1!s}, not bytes�)r(�backlog�0�Nr=)rN�bytesrPrQrR�registryr�AuthenticationString�authkey�listener_client�listenerr(� id_to_obj�id_to_refcount�id_to_local_proxy_obj� threading�Lock�mutex)r+rur(rw� serializer�Listener�Clients rr,zServer.__init__�s����'�5�)��8�?�?��T�'�]�,�-� -�!�� ��3�3�G�<���*�:�6���&�!��#�>�� ��}�}�,�,����z�*��� ���%'��"��^�^�%�� rc��tj�|_|tj�_ tj|j��}d|_|j� |jj�s6|jjd�|jj�s�6tjtj k7rGt#j$d�tj t_tj&t_tj*d�y#ttf$rY��wxYw#tjtj k7rGt#j$d�tj t_tj&t_tj*d�wxYw)z( Run the server forever )�targetTr zresetting stdout, stderrrN)r}�Event� stop_eventr�current_process�_manager_server�Thread�accepter�daemon�start�is_set�wait�KeyboardInterrupt� SystemExit�sys�stdout� __stdout__r�debug� __stderr__�stderr�exit)r+r�s r� serve_foreverzServer.serve_forever�s ��$�/�/�+���48����!�1� � �'�'�t�}�}�=�H�"�H�O��N�N�� ��/�/�0�0�2��O�O�(�(��+��/�/�0�0�2� �z�z�S�^�^�+�� � �5�6� �^�^�� � �^�^�� ��H�H�Q�K��&�z�2� �� ���z�z�S�^�^�+�� � �5�6� �^�^�� � �^�^�� ��H�H�Q�K�s+�7E�,AD:�:E� E�E�E�A?Gc��� |jj�}tj|j |f��}d|_|j��U#t$rY�awxYw)NT�r�rE)ry�accept�OSErrorr}r��handle_requestr�r�)r+rC�ts rr�zServer.accepter�sa��� ��M�M�(�(�*��� � ��(;�(;�1�$�G�A��A�H� �G�G�I���� �� �s�A� A#�"A#c��d} tj||j�tj||j�|j �}|\}}}}t||�} ||g|��i|��}d|f} |j| �y#t$rdt�f} Y�*wxYw#t$rdt�f} Y�EwxYw#t$rx} |jdt�f�n#t$rYnwxYwtjd| �tjd|�tjd| �Yd} ~ yd} ~ wwxYw)Nr?rLzFailure to send message: %rz ... request was %r� ... exception was %r)r �deliver_challengerw�answer_challengerArZ� Exceptionrr@r�info)r+rC�request�ignore�funcnamerErFr_rH�msg�es r�_handle_requestzServer._handle_request�s2���� *��(�(��D�L�L�9��'�'��4�<�<�8��f�f�h�G�+2�(�F�H�d�D��4��*�D� *��a�/�$�/�$�/��!�&�)�� 2� �F�F�3�K�� � 3�#�Z�\�2�� 3��� /����.�C� /��� 2� �����j�l�3�4��� �� ���I�I�3�S�9��I�I�+�W�5��I�I�-�q�1�1�� 2�s[�A#B&�(B�9C�B#�"B#�&B>�=B>� E�C'�&D=�' C3�0D=�2C3�3AD=�=Ec�� |j|�|j�y#t$rY�wxYw#|j�wxYw)z) Handle a new connection N)r�r��close�r+�conns rr�zServer.handle_request�s@�� �� � ��&� �J�J�L�� � �� �� �J�J�L�s�$� 0�3�0�3�Ac�$�tjdtj�j�|j }|j}|j}|jj�s� dx}}|�}|\}}} } ||\}}}||vrtd|�dt|��d|����t||�} || i| ��}|xr|j|d�}|r4|j!|||�\}}t#||j$|�}d||ff}nd|f} |�|jj�s��yy#t$r.} |j|\}}}n#t$r| �wxYwYd} ~ ��d} ~ wwxYw#t&$r}d|f}Yd}~�sd}~wwxYw#t$rQ� d t)�f}n? |j*|}|||g ��i ��}d|f}n#t&$rd t)�f}YnwxYwY��t,$rKtjd tj�j�t/j0d�Y��&t&$rd t)�f}Y��=wxYw#t&$r|dt)�f�Y��UwxYw#t&$r�}tj2d tj�j�tj2d�tj2d|�|j5�t/j0d�Yd}~���d}~wwxYw)zQ Handle requests from the proxies in a particular process/thread z$starting server thread to service %rNzmethod z of z object is not in exposed=�#PROXYr?rKrLz$got EOF -- exiting thread serving %rrrMzexception in thread serving %rz ... message was %rr�r )rr�r}�current_threadr^rAr@rzr�r��KeyErrorr|�AttributeErrorrRrZ�getrgrr(r�r�fallback_mapping�EOFErrorr�r�r�r�)r+r�rAr@rzrDr#r��identrErF�exposed� gettypeid�ke�function�resr'�rident�rexposed�tokenr�r�� fallback_funcrHs r�serve_clientzServer.serve_client�s�� � � �9��+�+�-�2�2� 4��y�y���y�y���N�N� ��/�/�(�(�*�5 3�#'�'� �S��&��07�-��z�4��!�.7��.>�+�C��)��W�,�(�#�T�#�Y��9��� #�3� �3��/�"�D�1�D�1�C�'�J�9�=�=��T�+J�F��+/�;�;�t�V�S�+I�(��� %�f�d�l�l�F� C��'�(�E�):�;��(�#�.��. �<���I�w�/�/�(�(�*�� �!�!� �6�6�u�=�0��W�i��#�!� ��!��'0��!��"!�(�#�Q�-�C��(��"� ;��%�'���6�C�;�(,�(=�(=�j�(I� �!.� �$��s�"�59�"�=A�"�� )�&�1���$�;�+�Z�\�:��;��� �� � �A�$�3�3�5�:�:�<������� 3�#�Z�\�2�� 3��!�<��+�Z�\�:�;�<��� �� � �:�!�0�0�2�7�7�9�� � �/��5�� � �1�1�5�� � ��������� �s��2F� D<�-F�<E6�AF�I�< E3�E�E.�E&�&E.�)F�.E3�3F�6 F �?F�F�F � F�I�)"G�I�G$�!I�#G$�$I�)AI�;I�I�I5�1I8�4I5�5I8�8 L�BL � Lc��|Srr=�r+r�r�r#s r�fallback_getvaluezServer.fallback_getvalue?s��� rc��t|�Sr�rOr�s r�fallback_strzServer.fallback_strBs���3�x�rc��t|�Sr)�reprr�s r� fallback_reprzServer.fallback_reprEs���C�y�r)rWr8� #GETVALUEc��yrr=�r+rCs rrlzServer.dummyNs��rc �r�|j5g}t|jj��}|j �|D]K}|dk7s� |jd|�d|j|�dt |j|d�dd����Mdj|�cddd�S#1swYyxYw) zO Return some info --- useful to spot problems with refcounting rrz z: refcount=z rN�K� ) rr!r{r�sortr\rOrz�join)r+rCrHrr�s rrjzServer.debug_infoQs��� �Z�Z��F���+�+�0�0�2�3�D��I�I�K����C�<��M�M�#(�$�*=�*=�e�*D�#&�t�~�~�e�'<�Q�'?�#@��"�#E�#G�H�� �9�9�V�$��Z�Z�s�AB-�AB-�-B6c�,�t|j�S)z* Number of shared objects )�lenr{r�s rrkzServer.number_of_objectsas�� �4�&�&�'�'rc�� tjd�|jd�|j j �y#ddl}|j �Y�3xYw#|j j �wxYw)z' Shutdown this process z!manager received shutdown message�r?NrN)rr�r@� traceback� print_excr��set)r+rCr�s rrfzServer.shutdownhsZ�� "��J�J�:�;� �F�F�$�%� �O�O���!�� "�����!���O�O���!�s�&A�A�A�A:c �n�|j5|j|\}}}}|�!|st|�dk7rtd��|d} n||i|��} |�t | �}|�Kt|t�s$tdj|t|����t|�t|�z}dt| �z} tjd|| �| t|�|f|j| <| |j vrd|j | <ddd�|j#| �| t%�fS#1swY�(xYw)z> Create a new shared object and return its id Nr z4Without callable, must have one non-keyword argumentrz,Method_to_typeid {0!r}: type {1!s}, not dictz%xz&%r callable returned object with id %r)rrur�rTrcrN�dictrPrQrRr!r)rr�r�rzr{rm�tuple)r+rCr'rErFr[r��method_to_typeid� proxytyper#r�s rrgz Server.createusE���Z�Z��m�m�F�+� ;�H�g�/�����C��I��N�$�N�P�P��1�g����-��-����(��-���+�!�"2�D�9�#�F�M�M�,�d�3C�.D�F�G�G��w�-�$�/?�*@�@���2�c�7�N�E��J�J�?���O�%(�#�g�,�8H�$I�D�N�N�5�!��D�/�/�/�-.��#�#�E�*�7�: ���A�u���e�G�n�$�$�=�Z�s�C7D+�+D4c�L�t|j|jd�S)zL Return the methods of the shared object indicated by token r )r�rzr))r+rCr�s rrizServer.get_methods�s!���T�^�^�E�H�H�-�a�0�1�1rc�z�|tj�_|jd�|j |�y)z= Spawn a new thread to serve this connection r�N)r}r�r^r@r�)r+rCr^s rrhzServer.accept_connection�s0��+/� � � �"�'� ��� �!����!�rc�F�|j5 |j|xxdz cc<ddd�y#t$r\}||jvrBd|j|<|j||j|<tjd|�n|�Yd}~�id}~wwxYw#1swYyxYw)Nr z&Server re-enabled tracking & INCREF %r)rr{r�r|rzrr�)r+rCr�r�s rrmz Server.incref�s��� �Z�Z� ��#�#�E�*�a�/�*��Z��� � �D�6�6�6�12�D�'�'��.��2�2�5�9��N�N�5�)��J�J�G��O��H�P�� ���Z�s,�B�/� B�AB� B�B�B�B c �l�||jvr%||jvrtjd|�y|j5|j|dkr6tdj ||j||j|���|j|xxdzcc<|j|dk(r |j|=ddd�||jvrHd|j|<tjd|�|j5|j|=ddd�yy#1swY�`xYw#1swYyxYw)NzServer DECREF skipping %rrz+Id {0!s} ({1!r}) has refcount {2:n}, not 1+r )Nr=Nzdisposing of obj with id %r)r{r|rr�r�AssertionErrorrQrz)r+rCr�s rrnz Server.decref�s����+�+�+��T�/�/�/��J�J�2�E�:�� �Z�Z��"�"�5�)�Q�.�$�A�H�H��t�~�~�e�4��+�+�E�2�4�5�5� ����&�!�+�&��"�"�5�)�Q�.��'�'��.����+�+�+�%5�D�N�N�5�!��J�J�4�e�<�����N�N�5�)���,��Z��$��s�A?D�D*�D'�*D3N)r7r9r:r;�publicr,r�r�r�r�r�r�r�r�r�rlrjrkrfrgrirhrmrnr=rrrere�s���N�F�&�$�,�2�< �O�b���� �%� �� �%� (�"�"%�H2���"*rrec��eZdZdgZdZdZdZy)�State�valuerr �N)r7r9r:r<�INITIAL�STARTED�SHUTDOWNr=rrr�r��s��� �I��G��G��Hrr�)�pickle� xmlrpclibc��eZdZdZiZeZ ddd�d�Zd�Zd�Z dd�Z e dd ��Zd �Z dd�Zd�Zd �Zd�Zd�Zed��Zed��Ze dd��Zy)rz! Base class for managers Ng�?)�shutdown_timeoutc�P�|�tj�j}||_tj|�|_t �|_tj|j_ ||_ t|\|_|_ |xs t�|_||_yr)rr�rw�_addressrv�_authkeyr��_stater�r��_serializerrx� _Listener�_Clientr�_ctx�_shutdown_timeout)r+r(rwr��ctxr�s rr,zBaseManager.__init__�s~���?��-�-�/�7�7�G��� ��4�4�W�=�� ��g���!�M�M�����%���'6�z�'B�$������(�;�=�� �!1��rc���|jjtjk7r�|jjtjk(rtd��|jjtjk(rtd��tdj|jj���t|j|j|j|j�S)zX Return server object with serve_forever() method and address attribute �Already started server�Manager has shut down�Unknown state {!r}) r�r�r�r�r�r r�rQre� _registryr�r�r�r.s r� get_serverzBaseManager.get_server�s����;�;���� � �-��{�{� � �E�M�M�1�"�#;�<�<����"�"�e�n�n�4�"�#:�;�;�"�(�/�/����0A�0A�B�D�D��d�n�n�d�m�m��m�m�T�%5�%5�7� 7rc���t|j\}}||j|j��}t |dd�t j|j_y)z> Connect manager object to the server process �rwNrl) rxr�r�r�rIr�r�r�r�)r+r�r�r�s r�connectzBaseManager.connectsI��+�4�+;�+;�<���&��d�m�m�T�]�]�;����t�W�%�!�M�M����rc ��|jjtjk7r�|jjtjk(rtd��|jjtjk(rtd��tdj|jj���|�t|�std��tjd��\}}|jjt|�j|j |j"|j$|j&|||f��|_d j+d �|j(j,D��}t|�j.dz|z|j(_|j(j3�|j5�|j7�|_|j5�tj|j_t9j:|t|�j<|j(|j"|j$|j|j>|j@fd� �|_!y)z@ Spawn a server process for this manager object r�r�r�Nzinitializer must be a callableF)�duplexr��:c3�2K�|]}t|����y�wrr�)�.0�is r� <genexpr>z$BaseManager.start.<locals>.<genexpr>0s����A�)@�A��Q��)@�s��-r�rE�exitpriority)"r�r�r�r�r�r r�rQr[rPr �Piper��ProcessrR�_run_serverr�r�r�r��_processr�� _identityr7r^r�r�rAr�Finalize�_finalize_managerr�r�rf)r+�initializer�initargs�reader�writerr�s rr�zBaseManager.starts����;�;���� � �-��{�{� � �E�M�M�1�"�#;�<�<����"�"�e�n�n�4�"�#:�;�;�"�(�/�/����0A�0A�B�D�D��"�8�K�+@��<�=�=�$����6����� � �)�)���:�)�)��.�.�$�-�-�����"�"�F�K��C�*��� � ���A����)@�)@�A�A��!�$�Z�0�0�C�7�%�?�� � ��� � ���� ������� �� �����"�M�M������ � ��$�t�*�.�.��-�-����� � �t�{�{��,�,�� 6� 6�8�� �� rc�T�tjtjtj�|�||�|j||||�}|j |j �|j �tjd|j �|j�y)z@ Create a server, report its address and run it Nzmanager serving at %r) �signal�SIGINT�SIG_IGN�_Serverr@r(r�rr�r�) �clsrur(rwr�rrr�servers rrzBaseManager._run_serverBsz�� � � �f�m�m�V�^�^�4��"���"����X�w���D�� ���F�N�N�#����� � � �)�6�>�>�:����rc��|j|j|j��} t|dd|f|z|�\}}|j �t||j|�|fS#|j �wxYw)zP Create a new shared object; return the token and exposed tuple rNrg)r�r�r�rIr�r)r+r'rErFr�r)r�s r�_createzBaseManager._createYsm�� �|�|�D�M�M�4�=�=�|�A�� �"�4��x�&��4���N�K�B���J�J�L��V�T�]�]�B�/��8�8�� �J�J�L�s�A(�(A:c��|j�>|jj|�|jj�sd|_yyy)zC Join the manager process (if it has been spawned) N)rr��is_alive�r+�timeouts rr�zBaseManager.joinesA���=�=�$��M�M���w�'��=�=�)�)�+� $�� �,�%rc��|j|j|j��} t|dd�|j �S#|j �wxYw)zS Return some info about the servers shared objects and connections rNrj�r�r�r�rIr�r�s r�_debug_infozBaseManager._debug_infonsB���|�|�D�M�M�4�=�=�|�A�� ��D�$��5��J�J�L��D�J�J�L���A�Ac��|j|j|j��} t|dd�|j �S#|j �wxYw)z5 Return the number of shared objects rNrkr&r�s r�_number_of_objectszBaseManager._number_of_objectsxsC���|�|�D�M�M�4�=�=�|�A�� ��D�$�(;�<��J�J�L��D�J�J�L�r(c���|jjtjk(r|j �|jjtj k7r�|jjtjk(rt d��|jjtjk(rt d��t dj|jj���|S)NzUnable to start serverr�r�) r�r�r�r�r�r�r r�rQr.s r� __enter__zBaseManager.__enter__�s����;�;���� � �-��J�J�L��;�;���� � �-��{�{� � �E�M�M�1�"�#;�<�<����"�"�e�n�n�4�"�#:�;�;�"�(�/�/����0A�0A�B�D�D��rc�$�|j�yr)rf�r+�exc_type�exc_val�exc_tbs r�__exit__zBaseManager.__exit__�s��� � �rc���|j��rtjd� |||��} t|dd�|j � |j|��|j�r�tjd�t|d�r�tjd�|j�|j|��|j�r7tjd �|j�|j�tj|_ tj|=y#|j �wxYw#t $rY��wxYw#t$rYywxYw) zQ Shutdown the manager process; will be registered as a finalizer z#sending shutdown message to managerrNrf)r$zmanager still alive� terminatez'trying to `terminate()` manager processz#manager still alive after terminate)r"rr�rIr�r�r��hasattrr4�killr�r�r�r�_address_to_localr�)rr(rwr2r�r�r�s rrzBaseManager._finalize_manager�s*���7�����I�I�;�<� ��w��8��!��T�4��4��J�J�L� �G�L�L�!1�2��w���!�� � �/�0��7�K�0��I�I�G�H�%�G�%�%�'� �G�L�L�)9�:�'�w�'�'�)�� � �"G�H�$�����$������n�n��� ��+�+�G�4��%�J�J�L��� �� ��$� �� �s:� E� E�E�.E%�E�E� E"�!E"�% E1�0E1c��|jSr)r�r.s rr(zBaseManager.address�s���}�}�rc�\���d|jvr|jj�|_��t�|xs t �dd�}|xs t �dd�}|r!t|j ��D]\}}�|||�f|j�<|r��fd�} �| _t|�| �yy)z9 Register a typeid with the manager type r�N� _exposed_�_method_to_typeid_c�(��tjd��|j�g|��i|��\}}�||j||j|��}|j|j|j��}t|dd|jf�|S)Nz)requesting creation of a shared %r object��managerrwr�rrn) rr�r r�r�r�r(rIr)) r+rErFr��exp�proxyr�r�r's ��rr]z"BaseManager.register.<locals>.temp�s����� � �F��O�)�T�\�\�&�@�4�@�4�@� ��s�!��4�+�+�T� �M�M�3����|�|�E�M�M�4�=�=�|�I����t�X����{�;��r) �__dict__r��copy� AutoProxyrZr!rr7�setattr) rr'r[r�r�r�� create_method�keyr�r]s ` ` r�registerzBaseManager.register�s�����c�l�l�*��M�M�.�.�0�C�M���!�I��B�W�Y��T�B��+�J�"�9�.B�D�I� ��"�#3�#9�#9�#;�<� ��U�<� �g�/��!�� � �f��� �#�D�M��C���&�r)NNr�Nrsr)NNNNT)r7r9r:r;r�rerr,r�rr��classmethodrr r�r'r*r,r2�staticmethodr�propertyr(rGr=rrrr�s�����I��G�>F��2�/2�2� 7�*�)�V�/1����, 9�%������ �� �D�����EI�6:�%'��%'rrc��eZdZd�Zd�Zy)�ProcessLocalSetc�2�tj|d��y)Nc�"�|j�Sr)�clearr"s r�<lambda>z*ProcessLocalSet.__init__.<locals>.<lambda>�s ��3�9�9�;r)r�register_after_forkr.s rr,zProcessLocalSet.__init__�s��� � ��'>�?rc��t|�dfSrs)rRr.s r� __reduce__zProcessLocalSet.__reduce__�s���D�z�2�~�rN)r7r9r:r,rSr=rrrLrL�s ��@�rrLc��eZdZdZiZej�ZdZ dd�Z d�Z difd�Zd�Zd �Z ed ��Zd�Zd�Zd �Zd�Zd�Zy)rz. A base for proxies of shared objects r Nc�n�tj5tjj|jd�}|�;tj�t�f}|tj|j<tj|_ txjdz c_ddd�d|_ |d|_||_|jj|_||_||_t"|d|_||_|�t)j*|�|_nK|j�|jj,|_n#t)j.�j0|_|r|j3�tj4|tj6�y#1swY��xYw)Nr r)r�_mutexr7r�r(r�ForkAwareLocalrL�_next_serial�_serial�_tls�_all_serials�_tokenr)�_id�_managerr�rxr��_owned_by_managerrrvr�r�rw�_increfrQ�_after_fork) r+r�r�r>rwr�rm� manager_owned�tls_serialss rr,zBaseProxy.__init__�sJ�� � � �#�5�5�9�9�%�-�-��N�K��"�"�1�1�3�_�5F�F��=H� �+�+�E�M�M�:�$�1�1�D�L��"�"�a�'�"�� ��N�� � (��N�������;�;�>�>����� �%���&�z�2�1�5���"/�����#�8�8��A�D�M� �]�]� &� �M�M�2�2�D�M�#�3�3�5�=�=�D�M���L�L�N�� � ��y�'<�'<�=�Q� �s�BF*�*F4c��tjd�tj�j}tj�jdk7r$|dtj�jzz }|j|jj|j��}t|dd|f�||j_ y)Nzmaking connection to manager� MainThread�|rrh)rr�rr�r^r}r�r�r\r(r�rIrZr )r+r^r�s r�_connectzBaseProxy._connect&s���� � �1�2��&�&�(�-�-���#�#�%�*�*�l�:��C�)�2�2�4�9�9�9�9�D��|�|�D�K�K�/�/����|�G����t�0�4�'�:�#�� � �rr=c�� |jj}|j|j|||f�|j�\}}|dk(r|S|dk(r�|\}}|jj|jd} |jj |_| ||j"|j|j$|��} |j'|j |j$��}t)|dd|j*f�| St-||��#t$r\tjdtj�j�|j�|jj}Y��awxYw) zV Try to call a method of the referent and return a copy of the result z#thread %r does not own a connectionr?r����r=rNrn)rZr r�rr�r}r�r^rgr@r]rAr^r�r'r\r(r�r�r�rIr)rB)r+rDrErFr�rGrHr�r�r�r@s r�_callmethodzBaseProxy._callmethod/s<�� (��9�9�'�'�D� � � �4�8�8�Z��t�4�5��y�y�{���f��9���M� �X� �#�N�G�U�� � �/�/����=�b�A�I� �K�K�/�/�E�M���t�'�'����� � �w��E��<�<�� � �t�}�}�<�E�D��T�4��E�H�H�;�7��L��t�V�,�,��-� (��J�J�<� �/�/�1�6�6� 8��M�M�O��9�9�'�'�D� (�s�D�A!E:�9E:c�$�|jd�S)z9 Get a copy of the value of the referent r��rjr.s r� _getvaluezBaseProxy._getvalueMs������,�,rc���|jr+tjd|jj�y|j|jj|j��}t|dd|jf�tjd|jj�|jj|j�|jxr|jj}tj|t j"|j|j|j||j$|j|j fd��|_y)Nz%owned_by_manager skipped INCREF of %rrrmz INCREF %r� r)r_rr�r\r)r�r(r�rIr]r[�addrYr^r�rr�_decrefrZ�_close)r+r�r2s rr`zBaseProxy._increfSs����!�!��J�J�>������O���|�|�D�K�K�/�/����|�G����t�X����{�3�� � �;������/������d�l�l�+�� � �6�$�-�-�"6�"6���m�m��)�#�#��+�+�t�|�|�T�]�]�E��)�)�T�.�.����>�� ��rc�V�|j|�|�|jtjk(rO t j d|j�||j|��}t|dd|jf�n t j d|j�|s\t|d�rOt j dtj�j�|jj�|`yyy#t$r }t j d|�Yd}~��d}~wwxYw)Nz DECREF %rrrnz... decref failed %sz%DECREF %r -- manager already shutdownr z-thread %r has no more proxies so closing conn)�discardr�r�r�rr�r)r(rIr�r5r}r�r^r r�) r��serialrwr2�tls�idsetr�r�r�s rrqzBaseProxy._decrefgs��� � � �f���=�E�K�K�5�=�=�8� 6�� � �;����1��u�}�}�g�>����t�X����{�;� �J�J�>����I����l�3��J�J�F� �/�/�1�6�6� 8��N�N� � �"��� 4�u��� 6�� � �1�1�5�5�� 6�s�A C?�? D(�D#�#D(c��d|_ |j�y#t$r"}tjd|z�Yd}~yd}~wwxYw)Nzincref failed: %s)r^r`r�rr�)r+r�s rrazBaseProxy._after_fork�s<���� � /��L�L�N��� /��I�I�)�A�-�.�.�� /�s�� A�A�Ac� �i}t��|j|d<t|dd�r3|j|d<tt |j|j|ffStt|�|j|j|ffS)Nrw�_isautoFr�) rr�rZr:�RebuildProxyrCr\r�rR�r+rFs rrSzBaseProxy.__reduce__�s�������+�"�m�m�D��O��4��E�*�"�n�n�D��O� �����T�-=�-=�t�D�F� F�!��$�Z����d�.>�.>��E�G� Grc�"�|j�Sr)rm)r+�memos r�__deepcopy__zBaseProxy.__deepcopy__�s���~�~��rc�r�dt|�j|jjt |�fzS)Nz<%s object, typeid %r at %#x>)rRr7r\r'r)r.s rr8zBaseProxy.__repr__�s3��.��T� �#�#�T�[�[�%7�%7��D��B�C� Crc�f� |jd�S#t$rt|�dddzcYSwxYw)zV Return representation of the referent (or a fall-back if that fails) r8Nriz; '__str__()' failed>)rjr�r�r.s rrWzBaseProxy.__str__�s=�� =��#�#�J�/�/��� =���:�c�r�?�%<�<�<� =�s��0�0�NNNTF)r7r9r:r;r7r�ForkAwareThreadLockrVrXr,rgrjrmr`rIrqrarSrr8rWr=rrrr�s|����� %�T� %� %� '�F��L�26�HM�*>�X$�,.�B�-�<-��(����0/�G� �C�=rrc��ttj�dd�}|r||j|jk(rct j d|�d|d<|j|jvr0|j|j|j|j<|jdd�xr ttj�dd�}|||fd|i|��S) z5 Function used for unpickling proxy objects. r�Nz*Rebuild a proxy owned by manager, token=%rTrbrm�_inheritingF) rZrr�r(rr�r)r|rz�pop)r_r�r�rFrrms rr{r{�s����W�,�,�.�0A�4� H�F� �&�.�.�E�M�M�1�� � �?��G� $��_���8�8�6�7�7�7�� � ����*� �(�(����2� ����4� � E��G�+�+�-�}�e�D�D����z�9�&�9�D�9�9rc���t|�} |||fS#t$rYnwxYwi}|D]}td|�d|�d�|��t|tf|�}||_||||f<|S)zB Return a proxy type whose methods are given by `exposed` zdef z:(self, /, *args, **kwds): return self._callmethod(z , args, kwds))r�r��execrRrr:)r^r��_cache�dic�meth� ProxyTypes r� MakeProxyTyper��s����G�n�G� ��t�W�o�&�&��� �� �� �C����6:�D�B�CF� H���T�I�<��-�I�!�I��'�F�D�'�?���s�� � c�p�t|d}|�4||j|��} t|dd|f�}|j�|�|�|j}|�tj�j}td|jz|�} | ||||||��} d| _ | S#|j�wxYw)z* Return an auto-proxy for `token` r Nrriz AutoProxy[%s])r>rwrmrbT)rxr(rIr�r�rr�rwr�r'rz)r�r�r>rwr�rmrbr�r�r�r@s rrCrC�s��� �j�)�!�,�G����u�}�}�g�6�� ��t�T�=�5�(�C�G��J�J�L���7�.��"�"�����)�)�+�3�3���o����<�g�F�I��e�Z��'�#�=� B�E��E�M��L�� �J�J�L�s�B#�#B5c��eZdZd�Zd�Zy)� Namespacec�:�|jj|�yr)rA�updater|s rr,zNamespace.__init__�s��� � ���T�"rc�&�t|jj��}g}|D]-\}}|jd�r�|j |�d|����/|j�|jj�ddj|��d�S)Nrb�=�(�, r5) r!rAr� startswithr\r�r6r7r�)r+rr]r^r�s rr8zNamespace.__repr__�sq���T�]�]�(�(�*�+���� �K�D�%��?�?�3�'����t�U�3�4�!� � � ���>�>�2�2�D�I�I�d�O�D�DrN)r7r9r:r,r8r=rrr�r��s ��#�Err�c�8�eZdZdd�Zd�Zd�Zd�Zeee�Zy)�Valuec� �||_||_yr)� _typecode�_value)r+rr��locks rr,zValue.__init__�s��!�����rc��|jSr�r�r.s rr�z Value.gets���{�{�rc��||_yrr��r+r�s rr�z Value.sets ����rc�f�t|�j�d|j�d|j�d�S)Nr�r�r5)rRr7r�r�r.s rr8zValue.__repr__s!��!�$�Z�0�0�$�.�.�$�+�+�N�NrN�T) r7r9r:r,r�r�r8rJr�r=rrr�r��s#�����O��S�#��Err�c�.�tj||�Sr)r)r�sequencer�s r�Arrayr� s���;�;�x��*�*rc�.�eZdZdZd�Zd�Zd�Zd�Zd�Zy)� IteratorProxy)�__next__r@�throwr�c��|Srr=r.s r�__iter__zIteratorProxy.__iter__����rc�&�|jd|�S)Nr�rl�r+rEs rr�zIteratorProxy.__next__s����� �D�1�1rc�&�|jd|�S)Nr@rlr�s rr@zIteratorProxy.sends�������-�-rc�&�|jd|�S)Nr�rlr�s rr�zIteratorProxy.throw��������.�.rc�&�|jd|�S)Nr�rlr�s rr�zIteratorProxy.closer�rN) r7r9r:r:r�r�r@r�r�r=rrr�r�s ��6�I��2�.�/�/rr�c�*�eZdZdZdd�Zd�Zd�Zd�Zy)� AcquirerProxy)�acquire�releaseNc�8�|�|fn||f}|jd|�S�Nr�rl)r+�blockingr$rEs rr�zAcquirerProxy.acquire s'��%�o��{�H�g�3F����� �4�0�0rc�$�|jd�S�Nr�rlr.s rr�zAcquirerProxy.release#������ �*�*rc�$�|jd�Sr�rlr.s rr,zAcquirerProxy.__enter__%r�rc�$�|jd�Sr�rlr.s rr2zAcquirerProxy.__exit__'r�r)TN)r7r9r:r:r�r�r,r2r=rrr�r�s��&�I�1�+�+�+rr�c�.�eZdZdZdd�Zdd�Zd�Zdd�Zy) �ConditionProxy)r�r�r��notify� notify_allNc�(�|jd|f�S�Nr�rlr#s rr�zConditionProxy.wait-�������� �3�3rc�(�|jd|f�S)Nr�rl)r+�ns rr�zConditionProxy.notify/s������1�$�/�/rc�$�|jd�S)Nr�rlr.s rr�zConditionProxy.notify_all1s������-�-rc���|�}|r|S|�tj�|z}nd}d}|s<|�|tj�z }|dkr |S|j�|�}|s�<|S)Nr)�time� monotonicr�)r+� predicater$rH�endtime�waittimes r�wait_forzConditionProxy.wait_for3s~�������M����n�n�&��0�G��G��H���"�"�T�^�^�%5�5���q�=��� � �I�I�h���[�F� �� rr)r )r7r9r:r:r�r�r�r�r=rrr�r�+s��F�I�4�0�.�rr�c�*�eZdZdZd�Zd�Zd�Zdd�Zy)� EventProxy)r�r�rOr�c�$�|jd�S)Nr�rlr.s rr�zEventProxy.is_setHs������)�)rc�$�|jd�S�Nr�rlr.s rr�zEventProxy.setJ�������&�&rc�$�|jd�S)NrOrlr.s rrOzEventProxy.clearL�������(�(rNc�(�|jd|f�Sr�rlr#s rr�zEventProxy.waitNr�rr)r7r9r:r:r�r�rOr�r=rrr�r�Fs��2�I�*�'�)�4rr�c�T�eZdZdZd d�Zd�Zd�Zed��Zed��Z ed��Z y) �BarrierProxy)�__getattribute__r��abort�resetNc�(�|jd|f�Sr�rlr#s rr�zBarrierProxy.waitTr�rc�$�|jd�S)Nr�rlr.s rr�zBarrierProxy.abortVr�rc�$�|jd�S)Nr�rlr.s rr�zBarrierProxy.resetXr�rc�&�|jdd�S)Nr�)�partiesrlr.s rr�zBarrierProxy.partiesZs����� 2�L�A�Arc�&�|jdd�S)Nr�)� n_waitingrlr.s rr�zBarrierProxy.n_waiting]s����� 2�N�C�Crc�&�|jdd�S)Nr�)�brokenrlr.s rr�zBarrierProxy.broken`s����� 2�K�@�@rr)r7r9r:r:r�r�r�rJr�r�r�r=rrr�r�RsR��>�I�4�)�)� �B��B� �D��D� �A��Arr�c�"�eZdZdZd�Zd�Zd�Zy)�NamespaceProxy)r��__setattr__�__delattr__c�~�|ddk(rtj||�Stj|d�}|d|f�S)Nrrbrjr�)�objectr��r+rF� callmethods r�__getattr__zNamespaceProxy.__getattr__gsB���q�6�S�=��*�*�4��5�5��,�,�T�=�A� ��,�s�f�5�5rc��|ddk(rtj|||�Stj|d�}|d||f�S)Nrrbrjr�)r�r�r�)r+rFr�r�s rr�zNamespaceProxy.__setattr__lsE���q�6�S�=��%�%�d�C��7�7��,�,�T�=�A� ��-�#�u��6�6rc�~�|ddk(rtj||�Stj|d�}|d|f�S)Nrrbrjr�)r�r�r�r�s rr�zNamespaceProxy.__delattr__qsA���q�6�S�=��%�%�d�C�0�0��,�,�T�=�A� ��-�#��0�0rN)r7r9r:r:r�r�r�r=rrr�r�es��B�I�6� 7� 1rr�c�R�eZdZdZd�Zd�Zeee�Zee j�Zy)� ValueProxy)r�r�c�$�|jd�S)Nr�rlr.s rr�zValueProxy.getzr�rc�(�|jd|f�Sr�rlr�s rr�zValueProxy.set|s�������x�0�0rN)r7r9r:r:r�r�rJr�rH�types�GenericAlias�__class_getitem__r=rrr�r�xs.���I�'�1��S�#��E�#�E�$6�$6�7�rr�� BaseListProxy)�__add__�__contains__�__delitem__�__getitem__�__len__�__mul__�__reversed__�__rmul__�__setitem__r\�count�extend�index�insertr��remove�reverser��__imul__c��eZdZd�Zd�Zy)� ListProxyc�,�|jd|f�|S)Nrrlr�s r�__iadd__zListProxy.__iadd__�s������E�8�,��rc�,�|jd|f�|S)Nr rlr�s rr zListProxy.__imul__�s������e�X�.��rN)r7r9r:rr r=rrrr�s���rr� DictProxy)r�r�r�r�r�rrOrBr�rrr��popitem� setdefaultr�rr��Iterator� ArrayProxy)r�r�r� PoolProxy)�apply�apply_asyncr��imap�imap_unorderedr��map� map_async�starmap� starmap_asyncr4�AsyncResult)rrrrrc��eZdZd�Zd�Zy)rc��|Srr=r.s rr,zPoolProxy.__enter__�r�rc�$�|j�yr)r4r.s rr2zPoolProxy.__exit__�s�����rN)r7r9r:r,r2r=rrrr�s���rc��eZdZdZy)ra( Subclass of `BaseManager` which supports a number of shared object types. The types registered are those intended for the synchronization of threads, plus `dict`, `list` and `Namespace`. The `multiprocessing.Manager()` function creates started instances of this class. N)r7r9r:r;r=rrrr�s��rr�Queue� JoinableQueuer�r~�RLock� Semaphore�BoundedSemaphore� Condition�Barrier�Poolr!r�r�)r�rE)rEc�>�eZdZdZgfd�Zd�Zd�Zd�Zd�Zd�Z d�Z y ) �_SharedMemoryTrackerz+Manages one or more shared memory segments.c� �||_||_yr��shared_memory_context_name� segment_names)r+r^r0s rr,z_SharedMemoryTracker.__init__�s��.2�D�+�!.�D�rc��tjd|�dt����|jj |�y)z6Adds the supplied shared memory block name to tracker.zRegister segment � in pid N)rr�rr0r\�r+�segment_names r�register_segmentz%_SharedMemoryTracker.register_segment�s3���J�J�*�<�*:�(�6�8�*�M�N����%�%�l�3rc���tjd|�dt����|jj |�tj|�}|j�|j�y)z�Calls unlink() on the shared memory block with the supplied name and removes it from the list of blocks being tracked.zDestroy segment r2N) rr�rr0rr�SharedMemoryr��unlink)r+r4�segments r�destroy_segmentz$_SharedMemoryTracker.destroy_segment�sX�� �J�J�)�,�)9��&�(��L�M����%�%�l�3�#�0�0��>�G��M�M�O��N�N�rc�N�|jddD]}|j|��y)z<Calls destroy_segment() on all tracked shared memory blocks.N)r0r:r3s rr8z_SharedMemoryTracker.unlink�s%�� $� 2� 2�1� 5���$�$�\�2�!6rc��tjd|jj�dt ����|j�y)NzCall z.__del__ in )rr�r6r7rr8r.s r�__del__z_SharedMemoryTracker.__del__�s1���J�J��t�~�~�6�6�7�|�F�H�:�N�O��K�K�Mrc�2�|j|jfSrr.r.s rr/z!_SharedMemoryTracker.__getstate__�s���3�3�T�5G�5G�H�Hrc�"�|j|�yr)r,r1s rr3z!_SharedMemoryTracker.__setstate__�s���D�M�M�5�!rN)r7r9r:r;r,r5r:r8r=r/r3r=rrr,r,�s,��5�/1� /� 4� � 3� � I� "rr,c�R�eZdZejgd�zZd�Zd�Zd�Zd�Zd�Z d�Z y) �SharedMemoryServer)� track_segment�release_segment� list_segmentsc��tj|g|��i|��|j}t|t�rtj|�}td|�dt����|_ tjdt����y)N�shm_rbz"SharedMemoryServer started by pid )rer,r(rNrt�os�fsdecoder,r�shared_memory_contextrr�)r+rE�kwargsr(s rr,zSharedMemoryServer.__init__sn���O�O�D�2�4�2�6�2��l�l�G��'�5�)��+�+�g�.��$�t�G�9�A�f�h�Z�%@�A� �&��J�J�;�F�H�:�F�Grc��t|j|dd�r|j|d<tj|||g|��i|��S)z�Create a new distributed-shared object (not backed by a shared memory block) and return its id to be used in a Proxy Object.ri�_shared_memory_proxyrI)r5rurIrerg)r+rCr'rErJs rrgzSharedMemoryServer.createsK���t�}�}�V�,�R�0�2H�I�26�2L�2L��.�/��=�=��q�&�B�4�B�6�B�Brc�b�|jj�tj||�S)zACall unlink() on all tracked shared memory, terminate the Server.)rIr8rerfr�s rrfzSharedMemoryServer.shutdowns%���&�&�-�-�/��?�?�4��+�+rc�:�|jj|�y)z?Adds the supplied shared memory block name to Server's tracker.N)rIr5�r+rCr4s rrBz SharedMemoryServer.track_segments���&�&�7�7��Erc�:�|jj|�y)z�Calls unlink() on the shared memory block with the supplied name and removes it from the tracker instance inside the Server.N)rIr:rOs rrCz"SharedMemoryServer.release_segment"s�� �&�&�6�6�|�Drc�.�|jjS)zbReturns a list of names of shared memory blocks that the Server is currently tracking.)rIr0r�s rrDz SharedMemoryServer.list_segments's���-�-�;�;�;rN)r7r9r:rer�r,rgrfrBrCrDr=rrrArAs6�����F�G�� H� C� ,� F� E� <rrAc�2�eZdZdZeZd�Zd�Zd�Zd�Z d�Z y)ra�Like SyncManager but uses SharedMemoryServer instead of Server. It provides methods for creating and returning SharedMemory instances and for creating a list-like object (ShareableList) backed by shared memory. It also provides methods that create and return Proxy Objects that support synchronization across processes (i.e. multi-process-safe locks and semaphores). c���tjdk(rddlm}|j �tj|g|��i|��tj|jj�dt����y)N�posixr )�resource_trackerz created by pid )rGr^�rU�ensure_runningrr,rr�r6r7r)r+rErJrUs rr,zSharedMemoryManager.__init__9s\���w�w�'�!�/� �/�/�1�� � ��7��7��7��J�J�$�.�.�1�1�2�2B�6�8�*�M�Nrc�p�tj|jj�dt ����y)Nz.__del__ by pid )rr�r6r7rr.s rr=zSharedMemoryManager.__del__Es'���J�J�$�.�.�1�1�2�2B�6�8�*�M�Nrc���|jjtjk7r�|jjtjk(rtd��|jjtjk(rtd��tdj|jj���|j|j|j|j|j�S)z@Better than monkeypatching for now; merge into Server ultimatelyz"Already started SharedMemoryServerz!SharedMemoryManager has shut downr�) r�r�r�r�r�r r�rQrr�r�r�r�r.s rr�zSharedMemoryManager.get_serverHs����{�{� � �E�M�M�1��;�;�$�$�� � �5�&�'K�L�L��[�[�&�&�%�.�.�8�&�'J�K�K�&�,�3�3�D�K�K�4E�4E�F�H�H��<�<����� � � $� � �t�/?�/?�A� Arc�,�|j|j|j��5}tjdd|��} t|dd|jf� ddd�|S#t$r}|j�|�d}~wwxYw#1swYSxYw)zoReturns a new SharedMemory instance with the specified size in bytes, to be tracked by the manager.rNT)rg�sizerB) r�r�r�rr7rIr^� BaseExceptionr8)r+r[r��smsr�s rr7z SharedMemoryManager.SharedMemoryUs������d�m�m�T�]�]��C�t�#�0�0��d��N����T�4��3�8�8�+�F�D��J��%���J�J�L��G���� D��J�s)�B �A&�& B�/B�B�B � Bc�N�|j|j|j��5}tj|�} t|dd|jjf� ddd�|S#t$r!}|jj�|�d}~wwxYw#1swYSxYw)z�Returns a new ShareableList instance populated with the values from the input sequence, to be tracked by the manager.rNrB) r�r�r�r� ShareableListrI�shmr^r\r8)r+r�r��slr�s rr_z!SharedMemoryManager.ShareableListas������d�m�m�T�]�]��C�t�"�0�0��:����T�4��2�6�6�;�;�.�I�D��I��%���F�F�M�M�O��G���� D��I�s(�B�#A-�- B�6B�B�B�B$N)r7r9r:r;rArr,r=r�r7r_r=rrrr-s*�� �%�� O� O� A� � rr�r�)W�__all__r�r}rr�queuer�r�rGrr�rrVr �contextrrr rrrrr� HAS_SHMEMr\�ImportErrorrrGrRrZ� view_typesr$� view_typer�rrIrBr�rSr`rcrer�r�r��XmlListener� XmlClientrxrr�rLrr{r�rCr�r�r�r�r�r�r�r�r�r�r�rrr;r� BasePoolProxyrrr#r�r~r%r&r'r(r)r*r!r�r,rAr)r^s0r�<module>rlsX��A���� ����� �� ��@�@�����*���I��N�N�(�)�2�� ���5�;�;��-�4M� N�4M�D�d�$�7�2�t�$�&�'�4M� N� ���I��I���y�/�2�� �z�M�F�M�.&(�b�)� I�C�)�C� �A�F*�V�F*�Z �F���#�#�Z�%6�%6�7��)�)�:�+?�+?�@���t'�&�t'�t�c��t=��t=�t:�*)+��,8<�7<��: E�� E� �F� �+�/�I�/� +�I� +��]��6 4�� 4�A�9�A�&1�Y�1�&8��8��o�0�� �� �� �+�(� � �� � � �� �<�*�� � �k�,�� � !��"�� �$� � �� �� �+� ����W�e�k�k�*����_�e�k�k�2����W�i�o�o�z�:����V�Y�^�^�]�;����W�i�o�o�}�=����[�)�"5�"5�}�E����'��)C�)C�"�$����[�)�"5�"5�~�F����Y� � 1� 1�<�@����V�T�Y�Y� �2����V�T�9�-����V�T�9�-����W�e�Z�0����W�e�Z�0����[�)�^�<����Z�=���N����]�%��8� �""�""�J*<�V�*<�Z>�k�>�g ��k%���I���Os�O;�P �;P�PPK:W�\��=��*__pycache__/managers.cpython-312.opt-2.pycnu�[���� T��h�� ��gd�ZddlZddlZddlZddlZddlZddlZddlZddlZddlm Z ddl mZddlm Z ddlmZmZmZddlmZdd lmZdd lmZddlmZ ddlmZd Zej1d�d�Zej6eje�dD�cgc]}eei|�����c}Zd�ZeD]Z ej6e e��[ [Gd�de!�Z"difd�Z#d�Z$Gd�de%�Z&d�Z'd�Z(Gd�de!�Z)Gd�de!�Z*e jVe jXfe jZe j\fd �Z/Gd!�d"e!�Z0Gd#�d$e1�Z2Gd%�d&e!�Z3d'�Z4ifd(�Z5 dbd)�Z6Gd*�d+e!�Z7Gd,�d-e!�Z8dcd.�Z9Gd/�d0e3�Z:Gd1�d2e3�Z;Gd3�d4e;�Z<Gd5�d6e3�Z=Gd7�d8e3�Z>Gd9�d:e3�Z?Gd;�d<e3�Z@e5d=d>�ZAGd?�d@eA�ZBe5dAdB�ZCdCdDieC_De5dEdF�ZEe5dGdH�ZFdIdIdIdDdDdJ�eF_DGdK�dGeF�ZGGdL�dMe0�ZHeHj7dNej��eHj7dOej��eHj7dPej�e=�eHj7dQej�e;�eHj7dRej�e;�eHj7dSej�e;�eHj7dTej�e;�eHj7dUej�e<�eHj7dVej�e>�eHj7dWej�eG�eHj7dXeReB�eHj7dYeSeC�eHj7d-e8e@�eHj7dZe9eE�eHj7d+e7e?�eHj7dDe:d�[�eHj7dId�\�er!Gd]�d^�ZTGd_�d`e)�ZUGda�de0�ZVyy#e$rdZY���wxYwcc}w)d)�BaseManager�SyncManager� BaseProxy�Token�N)�getpid)� format_exc�)� connection)� reduction�get_spawning_popen�ProcessError)�pool)�process)�util)�get_context)� shared_memoryT�SharedMemoryManagerFc�Z�tj|j|j�ffS�N)�array�typecode�tobytes)�as �1/usr/lib64/python3.12/multiprocessing/managers.py�reduce_arrayr/s ���;�;����Q�Y�Y�[�1�1�1�)�items�keys�valuesc�&�tt|�ffSr)�list��objs r�rebuild_as_listr$4s���$�s�)���rc�*�eZdZ dZd�Zd�Zd�Zd�Zy)r��typeid�address�idc�0�|||c|_|_|_yrr&)�selfr'r(r)s r�__init__zToken.__init__Ds��06���,���d�l�D�Grc�H�|j|j|jfSrr&�r+s r�__getstate__zToken.__getstate__Gs�����T�\�\�4�7�7�3�3rc�.�|\|_|_|_yrr&�r+�states r�__setstate__zToken.__setstate__Js��/4�,���d�l�D�Grc��|jj�d|j�d|j�d|j�d�S)Nz(typeid=z , address=z, id=�))� __class__�__name__r'r(r)r.s r�__repr__zToken.__repr__Ms-�����'�'����d�l�l�D�G�G�M� MrN)r7� __module__�__qualname__� __slots__r,r/r3r8�rrrr>s$���,�I�E�4�5�Mrrr<c�z� |j||||f�|j�\}}|dk(r|St||��)N�#RETURN)�send�recv�convert_to_error)�cr)� methodname�args�kwds�kind�results r�dispatchrHUsG����F�F�B� �D�$�'�(��6�6�8�L�D�&��y��� � �4�� (�(rc ���|dk(r|S|dvrSt|t�s%tdj||t |����|dk(rtd|z�St|�St dj|��S)N�#ERROR)� #TRACEBACK�#UNSERIALIZABLEz.Result {0!r} (kind '{1}') type is {2}, not strrLzUnserializable message: %s zUnrecognized message type {!r})� isinstance�str� TypeError�format�type�RemoteError� ValueError)rFrGs rrArA_s����x��� � �2� 2��&�#�&��@�G�G��D�$�v�,�0�1� 1��$�$��=��F�G�G��v�&�&��:�A�A�$�G�H�Hrc��eZdZd�Zy)rRc�>�dt|jd�zdzS)NzM --------------------------------------------------------------------------- rzK---------------------------------------------------------------------------)rNrDr.s r�__str__zRemoteError.__str__os��$�s�4�9�9�Q�<�'8�8�6�A�BrN)r7r9r:rVr<rrrRrRns��CrrRc�~� g}t|�D]+}t||�}t|�s�|j|��-|Sr)�dir�getattr�callable�append)r#�temp�name�funcs r�all_methodsr_vsB����D��C����s�D�!���D�>��K�K�����Krc�R� t|�D�cgc] }|ddk7s�|��c}Scc}w)Nr�_)r_)r#r]s r�public_methodsrb�s2���)��-�@�-�T��a��C��D�-�@�@��@s� $�$c��eZdZ gd�Zd�Zd�Zd�Zd�Zd�Zd�Z d�Z d �Zd �Zeee d�Z d�Zd �Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zy)�Server) �shutdown�create�accept_connection�get_methods� debug_info�number_of_objects�dummy�incref�decrefc�z�t|t�s$tdj|t |����||_t j|�|_t|\}}||d��|_ |jj|_ddi|_i|_ i|_tj �|_y)Nz&Authkey {0!r} is type {1!s}, not bytes�)r(�backlog�0�Nr<)rM�bytesrOrPrQ�registryr�AuthenticationString�authkey�listener_client�listenerr(� id_to_obj�id_to_refcount�id_to_local_proxy_obj� threading�Lock�mutex)r+rtr(rv� serializer�Listener�Clients rr,zServer.__init__�s����'�5�)��8�?�?��T�'�]�,�-� -�!�� ��3�3�G�<���*�:�6���&�!��#�>�� ��}�}�,�,����z�*��� ���%'��"��^�^�%�� rc�� tj�|_|tj�_ tj|j��}d|_|j� |jj�s6|jjd�|jj�s�6tjtj k7rGt#j$d�tj t_tj&t_tj*d�y#ttf$rY��wxYw#tjtj k7rGt#j$d�tj t_tj&t_tj*d�wxYw)N)�targetTr zresetting stdout, stderrr)r|�Event� stop_eventr�current_process�_manager_server�Thread�accepter�daemon�start�is_set�wait�KeyboardInterrupt� SystemExit�sys�stdout� __stdout__r�debug� __stderr__�stderr�exit)r+r�s r� serve_foreverzServer.serve_forever�s%�� �$�/�/�+���48����!�1� � �'�'�t�}�}�=�H�"�H�O��N�N�� ��/�/�0�0�2��O�O�(�(��+��/�/�0�0�2� �z�z�S�^�^�+�� � �5�6� �^�^�� � �^�^�� ��H�H�Q�K��&�z�2� �� ���z�z�S�^�^�+�� � �5�6� �^�^�� � �^�^�� ��H�H�Q�K�s+�7E�-AD;�;E � E�E � E�A?Gc��� |jj�}tj|j |f��}d|_|j��U#t$rY�awxYw)NT�r�rD)rx�accept�OSErrorr|r��handle_requestr�r�)r+rB�ts rr�zServer.accepter�sa��� ��M�M�(�(�*��� � ��(;�(;�1�$�G�A��A�H� �G�G�I���� �� �s�A� A#�"A#c��d} tj||j�tj||j�|j �}|\}}}}t||�} ||g|��i|��}d|f} |j| �y#t$rdt�f} Y�*wxYw#t$rdt�f} Y�EwxYw#t$rx} |jdt�f�n#t$rYnwxYwtjd| �tjd|�tjd| �Yd} ~ yd} ~ wwxYw)Nr>rKzFailure to send message: %rz ... request was %r� ... exception was %r)r �deliver_challengerv�answer_challenger@rY� Exceptionrr?r�info)r+rB�request�ignore�funcnamerDrEr^rG�msg�es r�_handle_requestzServer._handle_request�s2���� *��(�(��D�L�L�9��'�'��4�<�<�8��f�f�h�G�+2�(�F�H�d�D��4��*�D� *��a�/�$�/�$�/��!�&�)�� 2� �F�F�3�K�� � 3�#�Z�\�2�� 3��� /����.�C� /��� 2� �����j�l�3�4��� �� ���I�I�3�S�9��I�I�+�W�5��I�I�-�q�1�1�� 2�s[�A#B&�(B�9C�B#�"B#�&B>�=B>� E�C'�&D=�' C3�0D=�2C3�3AD=�=Ec�� |j|�|j�y#t$rY�wxYw#|j�wxYwr)r�r��close�r+�conns rr�zServer.handle_request�sE�� � �� � ��&� �J�J�L�� � �� �� �J�J�L�s�%� 1�4�1�4�Ac�&� tjdtj�j�|j }|j}|j}|jj�s� dx}}|�}|\}}} } ||\}}}||vrtd|�dt|��d|����t||�} || i| ��}|xr|j|d�}|r4|j!|||�\}}t#||j$|�}d||ff}nd|f} |�|jj�s��yy#t$r.} |j|\}}}n#t$r| �wxYwYd} ~ ��d} ~ wwxYw#t&$r}d|f}Yd}~�sd}~wwxYw#t$rQ� dt)�f}n? |j*|}|||g ��i ��}d|f}n#t&$rdt)�f}YnwxYwY��t,$rKtjd tj�j�t/j0d �Y��&t&$rdt)�f}Y��=wxYw#t&$r|dt)�f�Y��UwxYw#t&$r�}tj2dtj�j�tj2d �tj2d|�|j5�t/j0d�Yd}~���d}~wwxYw)Nz$starting server thread to service %rzmethod z of z object is not in exposed=�#PROXYr>rJrKz$got EOF -- exiting thread serving %rrrLzexception in thread serving %rz ... message was %rr�r )rr�r|�current_threadr]r@r?ryr�r��KeyErrorr{�AttributeErrorrQrY�getrfrr(r�r�fallback_mapping�EOFErrorr�r�r�r�)r+r�r@r?ryrCr#r��identrDrE�exposed� gettypeid�ke�function�resr'�rident�rexposed�tokenr�r�� fallback_funcrGs r�serve_clientzServer.serve_client�s�� � � � �9��+�+�-�2�2� 4��y�y���y�y���N�N� ��/�/�(�(�*�5 3�#'�'� �S��&��07�-��z�4��!�.7��.>�+�C��)��W�,�(�#�T�#�Y��9��� #�3� �3��/�"�D�1�D�1�C�'�J�9�=�=��T�+J�F��+/�;�;�t�V�S�+I�(��� %�f�d�l�l�F� C��'�(�E�):�;��(�#�.��. �<���I�w�/�/�(�(�*�� �!�!� �6�6�u�=�0��W�i��#�!� ��!��'0��!��"!�(�#�Q�-�C��(��"� ;��%�'���6�C�;�(,�(=�(=�j�(I� �!.� �$��s�"�59�"�=A�"�� )�&�1���$�;�+�Z�\�:��;��� �� � �A�$�3�3�5�:�:�<������� 3�#�Z�\�2�� 3��!�<��+�Z�\�:�;�<��� �� � �:�!�0�0�2�7�7�9�� � �/��5�� � �1�1�5�� � ��������� �s��3F� D=�-F�=E7�AF�I�= E4�E�E/�E'�'E/�*F�/E4�4F�7 F�F �F� F�F�I�*"G �I� G%�"I�$G%�%I�*AI�<I�I�I6�2I9�5I6�6I9�9 L�BL�Lc��|Srr<�r+r�r�r#s r�fallback_getvaluezServer.fallback_getvalue?s��� rc��t|�Sr�rNr�s r�fallback_strzServer.fallback_strBs���3�x�rc��t|�Sr)�reprr�s r� fallback_reprzServer.fallback_reprEs���C�y�r)rVr8� #GETVALUEc��yrr<�r+rBs rrkzServer.dummyNs��rc �t� |j5g}t|jj��}|j �|D]K}|dk7s� |jd|�d|j|�dt |j|d�dd����Mdj|�cddd�S#1swYyxYw)Nrqz z: refcount=z r�K� ) r~r!rzr�sortr[rNry�join)r+rBrGrr�s rrizServer.debug_infoQs��� ��Z�Z��F���+�+�0�0�2�3�D��I�I�K����C�<��M�M�#(�$�*=�*=�e�*D�#&�t�~�~�e�'<�Q�'?�#@��"�#E�#G�H�� �9�9�V�$��Z�Z�s�AB.�AB.�.B7c�.� t|j�Sr)�lenrzr�s rrjzServer.number_of_objectsas�� ��4�&�&�'�'rc�� tjd�|jd�|j j �y#ddl}|j �Y�3xYw#|j j �wxYw)Nz!manager received shutdown message�r>Nr)rr�r?� traceback� print_excr��set)r+rBr�s rrezServer.shutdownhs_�� � "��J�J�:�;� �F�F�$�%� �O�O���!�� "�����!���O�O���!�s�&A�A�A�A;c �p� |j5|j|\}}}}|�!|st|�dk7rtd��|d} n||i|��} |�t | �}|�Kt|t�s$tdj|t|����t|�t|�z}dt| �z} tjd|| �| t|�|f|j| <| |j vrd|j | <ddd�|j#| �| t%�fS#1swY�(xYw)Nr z4Without callable, must have one non-keyword argumentrz,Method_to_typeid {0!r}: type {1!s}, not dictz%xz&%r callable returned object with id %r)r~rtr�rSrbrM�dictrOrPrQr!r)rr�r�ryrzrl�tuple)r+rBr'rDrErZr��method_to_typeid� proxytyper#r�s rrfz Server.createusJ�� ��Z�Z��m�m�F�+� ;�H�g�/�����C��I��N�$�N�P�P��1�g����-��-����(��-���+�!�"2�D�9�#�F�M�M�,�d�3C�.D�F�G�G��w�-�$�/?�*@�@���2�c�7�N�E��J�J�?���O�%(�#�g�,�8H�$I�D�N�N�5�!��D�/�/�/�-.��#�#�E�*�7�: ���A�u���e�G�n�$�$�=�Z�s�C7D,�,D5c�N� t|j|jd�S)Nr )r�ryr))r+rBr�s rrhzServer.get_methods�s&�� ��T�^�^�E�H�H�-�a�0�1�1rc�|� |tj�_|jd�|j |�y)Nr�)r|r�r]r?r�)r+rBr]s rrgzServer.accept_connection�s5�� �+/� � � �"�'� ��� �!����!�rc�F�|j5 |j|xxdz cc<ddd�y#t$r\}||jvrBd|j|<|j||j|<tjd|�n|�Yd}~�id}~wwxYw#1swYyxYw)Nr z&Server re-enabled tracking & INCREF %r)r~rzr�r{ryrr�)r+rBr�r�s rrlz Server.incref�s��� �Z�Z� ��#�#�E�*�a�/�*��Z��� � �D�6�6�6�12�D�'�'��.��2�2�5�9��N�N�5�)��J�J�G��O��H�P�� ���Z�s,�B�/� B�AB� B�B�B�B c �l�||jvr%||jvrtjd|�y|j5|j|dkr6tdj ||j||j|���|j|xxdzcc<|j|dk(r |j|=ddd�||jvrHd|j|<tjd|�|j5|j|=ddd�yy#1swY�`xYw#1swYyxYw)NzServer DECREF skipping %rrz+Id {0!s} ({1!r}) has refcount {2:n}, not 1+r )Nr<Nzdisposing of obj with id %r)rzr{rr�r~�AssertionErrorrPry)r+rBr�s rrmz Server.decref�s����+�+�+��T�/�/�/��J�J�2�E�:�� �Z�Z��"�"�5�)�Q�.�$�A�H�H��t�~�~�e�4��+�+�E�2�4�5�5� ����&�!�+�&��"�"�5�)�Q�.��'�'��.����+�+�+�%5�D�N�N�5�!��J�J�4�e�<�����N�N�5�)���,��Z��$��s�A?D�D*�D'�*D3N)r7r9r:�publicr,r�r�r�r�r�r�r�r�r�rkrirjrerfrhrgrlrmr<rrrdrd�s���N�F�&�$�,�2�< �O�b���� �%� �� �%� (�"�"%�H2���"*rrdc��eZdZdgZdZdZdZy)�State�valuerr �N)r7r9r:r;�INITIAL�STARTED�SHUTDOWNr<rrr�r��s��� �I��G��G��Hrr�)�pickle� xmlrpclibc��eZdZ iZeZ ddd�d�Zd�Zd�Zdd�Z e dd��Zd �Zdd �Z d�Zd�Zd �Zd�Zed��Zed��Ze dd��Zy)rNg�?)�shutdown_timeoutc�P�|�tj�j}||_tj|�|_t �|_tj|j_ ||_ t|\|_|_ |xs t�|_||_yr)rr�rv�_addressru�_authkeyr��_stater�r��_serializerrw� _Listener�_Clientr�_ctx�_shutdown_timeout)r+r(rvr�ctxr�s rr,zBaseManager.__init__�s~���?��-�-�/�7�7�G��� ��4�4�W�=�� ��g���!�M�M�����%���'6�z�'B�$������(�;�=�� �!1��rc��� |jjtjk7r�|jjtjk(rtd��|jjtjk(rtd��tdj|jj���t|j|j|j|j�S)N�Already started server�Manager has shut down�Unknown state {!r}) r�r�r�r�r�r r�rPrd� _registryr�r�r�r.s r� get_serverzBaseManager.get_server�s��� ��;�;���� � �-��{�{� � �E�M�M�1�"�#;�<�<����"�"�e�n�n�4�"�#:�;�;�"�(�/�/����0A�0A�B�D�D��d�n�n�d�m�m��m�m�T�%5�%5�7� 7rc��� t|j\}}||j|j��}t |dd�t j|j_y)N�rvrk) rwr�r�r�rHr�r�r�r�)r+r�r�r�s r�connectzBaseManager.connectsN�� �+�4�+;�+;�<���&��d�m�m�T�]�]�;����t�W�%�!�M�M����rc �� |jjtjk7r�|jjtjk(rtd��|jjtjk(rtd��tdj|jj���|�t|�std��tjd��\}}|jjt|�j|j |j"|j$|j&|||f��|_dj+d �|j(j,D��}t|�j.d z|z|j(_|j(j3�|j5�|j7�|_|j5�tj|j_t9j:|t|�j<|j(|j"|j$|j|j>|j@fd��|_!y) Nr�r�r�zinitializer must be a callableF)�duplexr��:c3�2K�|]}t|����y�wrr�)�.0�is r� <genexpr>z$BaseManager.start.<locals>.<genexpr>0s����A�)@�A��Q��)@�s��-r�rD�exitpriority)"r�r�r�r�r�r r�rPrZrOr �Piper��ProcessrQ�_run_serverr�r�r�r��_processr�� _identityr7r]r�r�r@r�Finalize�_finalize_managerr�r�re)r+�initializer�initargs�reader�writerr�s rr�zBaseManager.starts��� ��;�;���� � �-��{�{� � �E�M�M�1�"�#;�<�<����"�"�e�n�n�4�"�#:�;�;�"�(�/�/����0A�0A�B�D�D��"�8�K�+@��<�=�=�$����6����� � �)�)���:�)�)��.�.�$�-�-�����"�"�F�K��C�*��� � ���A����)@�)@�A�A��!�$�Z�0�0�C�7�%�?�� � ��� � ���� ������� �� �����"�M�M������ � ��$�t�*�.�.��-�-����� � �t�{�{��,�,�� 6� 6�8�� �� rc�V� tjtjtj�|�||�|j||||�}|j |j �|j �tjd|j �|j�y)Nzmanager serving at %r) �signal�SIGINT�SIG_IGN�_Serverr?r(r�rr�r�) �clsrtr(rvrrrr�servers rrzBaseManager._run_serverBs�� � � � �f�m�m�V�^�^�4��"���"����X�w���D�� ���F�N�N�#����� � � �)�6�>�>�:����rc�� |j|j|j��} t|dd|f|z|�\}}|j �t||j|�|fS#|j �wxYw)Nrrf)r�r�r�rHr�r)r+r'rDrEr�r)r�s r�_createzBaseManager._createYsr�� ��|�|�D�M�M�4�=�=�|�A�� �"�4��x�&��4���N�K�B���J�J�L��V�T�]�]�B�/��8�8�� �J�J�L�s�A)�)A;c�� |j�>|jj|�|jj�sd|_yyyr)rr��is_alive�r+�timeouts rr�zBaseManager.joinesF�� ��=�=�$��M�M���w�'��=�=�)�)�+� $�� �,�%rc�� |j|j|j��} t|dd�|j �S#|j �wxYw)Nrri�r�r�r�rHr�r�s r�_debug_infozBaseManager._debug_infonsG�� ��|�|�D�M�M�4�=�=�|�A�� ��D�$��5��J�J�L��D�J�J�L���A�Ac�� |j|j|j��} t|dd�|j �S#|j �wxYw)Nrrjr%r�s r�_number_of_objectszBaseManager._number_of_objectsxsH�� ��|�|�D�M�M�4�=�=�|�A�� ��D�$�(;�<��J�J�L��D�J�J�L�r'c���|jjtjk(r|j �|jjtj k7r�|jjtjk(rt d��|jjtjk(rt d��t dj|jj���|S)NzUnable to start serverr�r�) r�r�r�r�r�r�r r�rPr.s r� __enter__zBaseManager.__enter__�s����;�;���� � �-��J�J�L��;�;���� � �-��{�{� � �E�M�M�1�"�#;�<�<����"�"�e�n�n�4�"�#:�;�;�"�(�/�/����0A�0A�B�D�D��rc�$�|j�yr)re�r+�exc_type�exc_val�exc_tbs r�__exit__zBaseManager.__exit__�s��� � �rc��� |j��rtjd� |||��} t|dd�|j � |j|��|j�r�tjd�t|d�r�tjd�|j�|j|��|j�r7tjd�|j�|j�tj|_ tj|=y#|j �wxYw#t $rY��wxYw#t$rYywxYw) Nz#sending shutdown message to managerrre)r#zmanager still alive� terminatez'trying to `terminate()` manager processz#manager still alive after terminate)r!rr�rHr�r�r��hasattrr3�killr�r�r�r�_address_to_localr�)rr(rvr2r�r�r�s rrzBaseManager._finalize_manager�s/�� ��7�����I�I�;�<� ��w��8��!��T�4��4��J�J�L� �G�L�L�!1�2��w���!�� � �/�0��7�K�0��I�I�G�H�%�G�%�%�'� �G�L�L�)9�:�'�w�'�'�)�� � �"G�H�$�����$������n�n��� ��+�+�G�4��%�J�J�L��� �� ��$� �� �s:� E� E�E�/E&�E�E� E#�"E#�& E2�1E2c��|jSr)r�r.s rr(zBaseManager.address�s���}�}�rc�^��� d|jvr|jj�|_��t�|xs t �dd�}|xs t �dd�}|r!t|j ��D]\}}�|||�f|j�<|r��fd�} �| _t|�| �yy)Nr�� _exposed_�_method_to_typeid_c�(��tjd��|j�g|��i|��\}}�||j||j|��}|j|j|j��}t|dd|jf�|S)Nz)requesting creation of a shared %r object��managerrvr�rrm) rr�rr�r�r�r(rHr)) r+rDrEr��exp�proxyr�r�r's ��rr\z"BaseManager.register.<locals>.temp�s����� � �F��O�)�T�\�\�&�@�4�@�4�@� ��s�!��4�+�+�T� �M�M�3����|�|�E�M�M�4�=�=�|�I����t�X����{�;��r) �__dict__r��copy� AutoProxyrYr!rr7�setattr) rr'rZr�r�r�� create_method�keyr�r\s ` ` r�registerzBaseManager.register�s���� ��c�l�l�*��M�M�.�.�0�C�M���!�I��B�W�Y��T�B��+�J�"�9�.B�D�I� ��"�#3�#9�#9�#;�<� ��U�<� �g�/��!�� � �f��� �#�D�M��C���&�r)NNr�Nrrr)NNNNT)r7r9r:r�rdrr,r�rr��classmethodrrr�r&r)r+r1�staticmethodr�propertyr(rFr<rrrr�s�����I��G�>F��2�/2�2� 7�*�)�V�/1����, 9�%������ �� �D�����EI�6:�%'��%'rrc��eZdZd�Zd�Zy)�ProcessLocalSetc�2�tj|d��y)Nc�"�|j�Sr)�clearr"s r�<lambda>z*ProcessLocalSet.__init__.<locals>.<lambda>�s ��3�9�9�;r)r�register_after_forkr.s rr,zProcessLocalSet.__init__�s��� � ��'>�?rc��t|�dfSrr)rQr.s r� __reduce__zProcessLocalSet.__reduce__�s���D�z�2�~�rN)r7r9r:r,rRr<rrrKrK�s ��@�rrKc��eZdZ iZej �ZdZ dd�Zd�Z difd�Z d�Zd�Ze d ��Zd �Zd�Zd�Zd �Zd�Zy)rr Nc�n�tj5tjj|jd�}|�;tj�t�f}|tj|j<tj|_ txjdz c_ddd�d|_ |d|_||_|jj|_||_||_t"|d|_||_|�t)j*|�|_nK|j�|jj,|_n#t)j.�j0|_|r|j3�tj4|tj6�y#1swY��xYw)Nr r)r�_mutexr6r�r(r�ForkAwareLocalrK�_next_serial�_serial�_tls�_all_serials�_tokenr)�_id�_managerr�rwr��_owned_by_managerrrur�r�rv�_increfrP�_after_fork) r+r�rr=rvr�rl� manager_owned�tls_serialss rr,zBaseProxy.__init__�sJ�� � � �#�5�5�9�9�%�-�-��N�K��"�"�1�1�3�_�5F�F��=H� �+�+�E�M�M�:�$�1�1�D�L��"�"�a�'�"�� ��N�� � (��N�������;�;�>�>����� �%���&�z�2�1�5���"/�����#�8�8��A�D�M� �]�]� &� �M�M�2�2�D�M�#�3�3�5�=�=�D�M���L�L�N�� � ��y�'<�'<�=�Q� �s�BF*�*F4c��tjd�tj�j}tj�jdk7r$|dtj�jzz }|j|jj|j��}t|dd|f�||j_ y)Nzmaking connection to manager� MainThread�|rrg)rr�rr�r]r|r�r�r[r(r�rHrYr )r+r]r�s r�_connectzBaseProxy._connect&s���� � �1�2��&�&�(�-�-���#�#�%�*�*�l�:��C�)�2�2�4�9�9�9�9�D��|�|�D�K�K�/�/����|�G����t�0�4�'�:�#�� � �rr<c�� |jj}|j|j|||f�|j�\}}|dk(r|S|dk(r�|\}}|jj|jd} |jj |_| ||j"|j|j$|��} |j'|j |j$��}t)|dd|j*f�| St-||��#t$r\tjdtj�j�|j�|jj}Y��awxYw)Nz#thread %r does not own a connectionr>r����r<rrm)rYr r�rr�r|r�r]rfr?r\r@r]r�r'r[r(r�r�r�rHr)rA)r+rCrDrEr�rFrGr�r�r�r?s r�_callmethodzBaseProxy._callmethod/sA�� � (��9�9�'�'�D� � � �4�8�8�Z��t�4�5��y�y�{���f��9���M� �X� �#�N�G�U�� � �/�/����=�b�A�I� �K�K�/�/�E�M���t�'�'����� � �w��E��<�<�� � �t�}�}�<�E�D��T�4��E�H�H�;�7��L��t�V�,�,��-� (��J�J�<� �/�/�1�6�6� 8��M�M�O��9�9�'�'�D� (�s�D�A!E;�:E;c�&� |jd�S)Nr��rir.s r� _getvaluezBaseProxy._getvalueMs�� �����,�,rc���|jr+tjd|jj�y|j|jj|j��}t|dd|jf�tjd|jj�|jj|j�|jxr|jj}tj|t j"|j|j|j||j$|j|j fd��|_y)Nz%owned_by_manager skipped INCREF of %rrrlz INCREF %r� r )r^rr�r[r)r�r(r�rHr\rZ�addrXr]r�rr�_decrefrY�_close)r+r�r2s rr_zBaseProxy._increfSs����!�!��J�J�>������O���|�|�D�K�K�/�/����|�G����t�X����{�3�� � �;������/������d�l�l�+�� � �6�$�-�-�"6�"6���m�m��)�#�#��+�+�t�|�|�T�]�]�E��)�)�T�.�.����>�� ��rc�V�|j|�|�|jtjk(rO t j d|j�||j|��}t|dd|jf�n t j d|j�|s\t|d�rOt j dtj�j�|jj�|`yyy#t$r }t j d|�Yd}~��d}~wwxYw)Nz DECREF %rrrmz... decref failed %sz%DECREF %r -- manager already shutdownr z-thread %r has no more proxies so closing conn)�discardr�r�r�rr�r)r(rHr�r4r|r�r]r r�) r��serialrvr2�tls�idsetr�r�r�s rrpzBaseProxy._decrefgs��� � � �f���=�E�K�K�5�=�=�8� 6�� � �;����1��u�}�}�g�>����t�X����{�;� �J�J�>����I����l�3��J�J�F� �/�/�1�6�6� 8��N�N� � �"��� 4�u��� 6�� � �1�1�5�5�� 6�s�A C?�? D(�D#�#D(c��d|_ |j�y#t$r"}tjd|z�Yd}~yd}~wwxYw)Nzincref failed: %s)r]r_r�rr�)r+r�s rr`zBaseProxy._after_fork�s<���� � /��L�L�N��� /��I�I�)�A�-�.�.�� /�s�� A�A�Ac� �i}t��|j|d<t|dd�r3|j|d<tt |j|j|ffStt|�|j|j|ffS)Nrv�_isautoFr�) rr�rYr9�RebuildProxyrBr[r�rQ�r+rEs rrRzBaseProxy.__reduce__�s�������+�"�m�m�D��O��4��E�*�"�n�n�D��O� �����T�-=�-=�t�D�F� F�!��$�Z����d�.>�.>��E�G� Grc�"�|j�Sr)rl)r+�memos r�__deepcopy__zBaseProxy.__deepcopy__�s���~�~��rc�r�dt|�j|jjt |�fzS)Nz<%s object, typeid %r at %#x>)rQr7r[r'r)r.s rr8zBaseProxy.__repr__�s3��.��T� �#�#�T�[�[�%7�%7��D��B�C� Crc�h� |jd�S#t$rt|�dddzcYSwxYw)Nr8rhz; '__str__()' failed>)rir�r�r.s rrVzBaseProxy.__str__�sB�� � =��#�#�J�/�/��� =���:�c�r�?�%<�<�<� =�s��1�1�NNNTF)r7r9r:r6r�ForkAwareThreadLockrUrWr,rfrirlr_rHrpr`rRr~r8rVr<rrrr�s|����� %�T� %� %� '�F��L�26�HM�*>�X$�,.�B�-�<-��(����0/�G� �C�=rrc�� ttj�dd�}|r||j|jk(rct j d|�d|d<|j|jvr0|j|j|j|j<|jdd�xr ttj�dd�}|||fd|i|��S)Nr�z*Rebuild a proxy owned by manager, token=%rTrarl�_inheritingF) rYrr�r(rr�r)r{ry�pop)r^r�rrErrls rrzrz�s�����W�,�,�.�0A�4� H�F� �&�.�.�E�M�M�1�� � �?��G� $��_���8�8�6�7�7�7�� � ����*� �(�(����2� ����4� � E��G�+�+�-�}�e�D�D����z�9�&�9�D�9�9rc��� t|�} |||fS#t$rYnwxYwi}|D]}td|�d|�d�|��t|tf|�}||_||||f<|S)Nzdef z:(self, /, *args, **kwds): return self._callmethod(z , args, kwds))r�r��execrQrr9)r]r��_cache�dic�meth� ProxyTypes r� MakeProxyTyper��s�����G�n�G� ��t�W�o�&�&��� �� �� �C����6:�D�B�CF� H���T�I�<��-�I�!�I��'�F�D�'�?���s�� !�!c�r� t|d}|�4||j|��} t|dd|f�}|j�|�|�|j}|�tj�j}td|jz|�} | ||||||��} d| _ | S#|j�wxYw)Nr rrhz AutoProxy[%s])r=rvrlraT)rwr(rHr�r�rr�rvr�r'ry)r�rr=rvr�rlrar�r�r�r?s rrBrB�s�����j�)�!�,�G����u�}�}�g�6�� ��t�T�=�5�(�C�G��J�J�L���7�.��"�"�����)�)�+�3�3���o����<�g�F�I��e�Z��'�#�=� B�E��E�M��L�� �J�J�L�s�B$�$B6c��eZdZd�Zd�Zy)� Namespacec�:�|jj|�yr)r@�updater{s rr,zNamespace.__init__�s��� � ���T�"rc�&�t|jj��}g}|D]-\}}|jd�r�|j |�d|����/|j�|jj�ddj|��d�S)Nra�=�(�, r5) r!r@r� startswithr[r�r6r7r�)r+rr\r]r�s rr8zNamespace.__repr__�sq���T�]�]�(�(�*�+���� �K�D�%��?�?�3�'����t�U�3�4�!� � � ���>�>�2�2�D�I�I�d�O�D�DrN)r7r9r:r,r8r<rrr�r��s ��#�Err�c�8�eZdZdd�Zd�Zd�Zd�Zeee�Zy)�Valuec� �||_||_yr)� _typecode�_value)r+rr��locks rr,zValue.__init__�s��!�����rc��|jSr�r�r.s rr�z Value.gets���{�{�rc��||_yrr��r+r�s rr�z Value.sets ����rc�f�t|�j�d|j�d|j�d�S)Nr�r�r5)rQr7r�r�r.s rr8zValue.__repr__s!��!�$�Z�0�0�$�.�.�$�+�+�N�NrN�T) r7r9r:r,r�r�r8rIr�r<rrr�r��s#�����O��S�#��Err�c�.�tj||�Sr)r)r�sequencer�s r�Arrayr� s���;�;�x��*�*rc�.�eZdZdZd�Zd�Zd�Zd�Zd�Zy)� IteratorProxy)�__next__r?�throwr�c��|Srr<r.s r�__iter__zIteratorProxy.__iter__����rc�&�|jd|�S)Nr�rk�r+rDs rr�zIteratorProxy.__next__s����� �D�1�1rc�&�|jd|�S)Nr?rkr�s rr?zIteratorProxy.sends�������-�-rc�&�|jd|�S)Nr�rkr�s rr�zIteratorProxy.throw��������.�.rc�&�|jd|�S)Nr�rkr�s rr�zIteratorProxy.closer�rN) r7r9r:r9r�r�r?r�r�r<rrr�r�s ��6�I��2�.�/�/rr�c�*�eZdZdZdd�Zd�Zd�Zd�Zy)� AcquirerProxy)�acquire�releaseNc�8�|�|fn||f}|jd|�S�Nr�rk)r+�blockingr#rDs rr�zAcquirerProxy.acquire s'��%�o��{�H�g�3F����� �4�0�0rc�$�|jd�S�Nr�rkr.s rr�zAcquirerProxy.release#������ �*�*rc�$�|jd�Sr�rkr.s rr+zAcquirerProxy.__enter__%r�rc�$�|jd�Sr�rkr-s rr1zAcquirerProxy.__exit__'r�r)TN)r7r9r:r9r�r�r+r1r<rrr�r�s��&�I�1�+�+�+rr�c�.�eZdZdZdd�Zdd�Zd�Zdd�Zy) �ConditionProxy)r�r�r��notify� notify_allNc�(�|jd|f�S�Nr�rkr"s rr�zConditionProxy.wait-�������� �3�3rc�(�|jd|f�S)Nr�rk)r+�ns rr�zConditionProxy.notify/s������1�$�/�/rc�$�|jd�S)Nr�rkr.s rr�zConditionProxy.notify_all1s������-�-rc���|�}|r|S|�tj�|z}nd}d}|s<|�|tj�z }|dkr |S|j�|�}|s�<|S)Nr)�time� monotonicr�)r+� predicater#rG�endtime�waittimes r�wait_forzConditionProxy.wait_for3s~�������M����n�n�&��0�G��G��H���"�"�T�^�^�%5�5���q�=��� � �I�I�h���[�F� �� rr)r )r7r9r:r9r�r�r�r�r<rrr�r�+s��F�I�4�0�.�rr�c�*�eZdZdZd�Zd�Zd�Zdd�Zy)� EventProxy)r�r�rNr�c�$�|jd�S)Nr�rkr.s rr�zEventProxy.is_setHs������)�)rc�$�|jd�S�Nr�rkr.s rr�zEventProxy.setJ�������&�&rc�$�|jd�S)NrNrkr.s rrNzEventProxy.clearL�������(�(rNc�(�|jd|f�Sr�rkr"s rr�zEventProxy.waitNr�rr)r7r9r:r9r�r�rNr�r<rrr�r�Fs��2�I�*�'�)�4rr�c�T�eZdZdZd d�Zd�Zd�Zed��Zed��Z ed��Z y) �BarrierProxy)�__getattribute__r��abort�resetNc�(�|jd|f�Sr�rkr"s rr�zBarrierProxy.waitTr�rc�$�|jd�S)Nr�rkr.s rr�zBarrierProxy.abortVr�rc�$�|jd�S)Nr�rkr.s rr�zBarrierProxy.resetXr�rc�&�|jdd�S)Nr�)�partiesrkr.s rr�zBarrierProxy.partiesZs����� 2�L�A�Arc�&�|jdd�S)Nr�)� n_waitingrkr.s rr�zBarrierProxy.n_waiting]s����� 2�N�C�Crc�&�|jdd�S)Nr�)�brokenrkr.s rr�zBarrierProxy.broken`s����� 2�K�@�@rr)r7r9r:r9r�r�r�rIr�r�r�r<rrr�r�RsR��>�I�4�)�)� �B��B� �D��D� �A��Arr�c�"�eZdZdZd�Zd�Zd�Zy)�NamespaceProxy)r��__setattr__�__delattr__c�~�|ddk(rtj||�Stj|d�}|d|f�S)Nrrarir�)�objectr��r+rE� callmethods r�__getattr__zNamespaceProxy.__getattr__gsB���q�6�S�=��*�*�4��5�5��,�,�T�=�A� ��,�s�f�5�5rc��|ddk(rtj|||�Stj|d�}|d||f�S)Nrrarir�)r�r�r�)r+rEr�r�s rr�zNamespaceProxy.__setattr__lsE���q�6�S�=��%�%�d�C��7�7��,�,�T�=�A� ��-�#�u��6�6rc�~�|ddk(rtj||�Stj|d�}|d|f�S)Nrrarir�)r�r�r�r�s rr�zNamespaceProxy.__delattr__qsA���q�6�S�=��%�%�d�C�0�0��,�,�T�=�A� ��-�#��0�0rN)r7r9r:r9r�r�r�r<rrr�r�es��B�I�6� 7� 1rr�c�R�eZdZdZd�Zd�Zeee�Zee j�Zy)� ValueProxy)r�r�c�$�|jd�S)Nr�rkr.s rr�zValueProxy.getzr�rc�(�|jd|f�Sr�rkr�s rr�zValueProxy.set|s�������x�0�0rN)r7r9r:r9r�r�rIr�rG�types�GenericAlias�__class_getitem__r<rrr�r�xs.���I�'�1��S�#��E�#�E�$6�$6�7�rr�� BaseListProxy)�__add__�__contains__�__delitem__�__getitem__�__len__�__mul__�__reversed__�__rmul__�__setitem__r[�count�extend�index�insertr��remove�reverser��__imul__c��eZdZd�Zd�Zy)� ListProxyc�,�|jd|f�|S)Nrrkr�s r�__iadd__zListProxy.__iadd__�s������E�8�,��rc�,�|jd|f�|S)Nr rkr�s rr zListProxy.__imul__�s������e�X�.��rN)r7r9r:r r r<rrrr�s���rr� DictProxy)r�r�r�r�r�rrNrAr�rrr��popitem� setdefaultr�rr��Iterator� ArrayProxy)r�r�r� PoolProxy)�apply�apply_asyncr��imap�imap_unorderedr��map� map_async�starmap� starmap_asyncr3�AsyncResult)rrrrrc��eZdZd�Zd�Zy)rc��|Srr<r.s rr+zPoolProxy.__enter__�r�rc�$�|j�yr)r3r-s rr1zPoolProxy.__exit__�s�����rN)r7r9r:r+r1r<rrrr�s���rc��eZdZy)rN)r7r9r:r<rrrr�s��rr�Queue� JoinableQueuer�r}�RLock� Semaphore�BoundedSemaphore� Condition�Barrier�Poolr!r�r�)r�rD)rDc�<�eZdZ gfd�Zd�Zd�Zd�Zd�Zd�Zd�Z y) �_SharedMemoryTrackerc� �||_||_yr��shared_memory_context_name� segment_names)r+r]r/s rr,z_SharedMemoryTracker.__init__�s��.2�D�+�!.�D�rc�� tjd|�dt����|jj |�y)NzRegister segment � in pid )rr�rr/r[�r+�segment_names r�register_segmentz%_SharedMemoryTracker.register_segment�s6��D��J�J�*�<�*:�(�6�8�*�M�N����%�%�l�3rc��� tjd|�dt����|jj |�tj|�}|j�|j�y)NzDestroy segment r1) rr�rr/rr�SharedMemoryr��unlink)r+r3�segments r�destroy_segmentz$_SharedMemoryTracker.destroy_segment�s\�� E��J�J�)�,�)9��&�(��L�M����%�%�l�3�#�0�0��>�G��M�M�O��N�N�rc�P� |jddD]}|j|��yr)r/r9r2s rr7z_SharedMemoryTracker.unlink�s(��J� $� 2� 2�1� 5���$�$�\�2�!6rc��tjd|jj�dt ����|j�y)NzCall z.__del__ in )rr�r6r7rr7r.s r�__del__z_SharedMemoryTracker.__del__�s1���J�J��t�~�~�6�6�7�|�F�H�:�N�O��K�K�Mrc�2�|j|jfSrr-r.s rr/z!_SharedMemoryTracker.__getstate__�s���3�3�T�5G�5G�H�Hrc�"�|j|�yr)r,r1s rr3z!_SharedMemoryTracker.__setstate__�s���D�M�M�5�!rN) r7r9r:r,r4r9r7r<r/r3r<rrr+r+�s,��5�/1� /� 4� � 3� � I� "rr+c�R�eZdZejgd�zZd�Zd�Zd�Zd�Zd�Z d�Z y) �SharedMemoryServer)� track_segment�release_segment� list_segmentsc��tj|g|��i|��|j}t|t�rtj|�}td|�dt����|_ tjdt����y)N�shm_raz"SharedMemoryServer started by pid )rdr,r(rMrs�os�fsdecoder+r�shared_memory_contextrr�)r+rD�kwargsr(s rr,zSharedMemoryServer.__init__sn���O�O�D�2�4�2�6�2��l�l�G��'�5�)��+�+�g�.��$�t�G�9�A�f�h�Z�%@�A� �&��J�J�;�F�H�:�F�Grc�� t|j|dd�r|j|d<tj|||g|��i|��S)Nrh�_shared_memory_proxyrH)r4rtrHrdrf)r+rBr'rDrIs rrfzSharedMemoryServer.createsQ�� M� �t�}�}�V�,�R�0�2H�I�26�2L�2L��.�/��=�=��q�&�B�4�B�6�B�Brc�d� |jj�tj||�Sr)rHr7rdrer�s rrezSharedMemoryServer.shutdowns(��O��&�&�-�-�/��?�?�4��+�+rc�<� |jj|�yr)rHr4�r+rBr3s rrAz SharedMemoryServer.track_segments��M��&�&�7�7��Erc�<� |jj|�yr)rHr9rNs rrBz"SharedMemoryServer.release_segment"s�� K��&�&�6�6�|�Drc�0� |jjSr)rHr/r�s rrCz SharedMemoryServer.list_segments's�� &��-�-�;�;�;rN)r7r9r:rdr�r,rfrerArBrCr<rrr@r@s6�����F�G�� H� C� ,� F� E� <rr@c�0�eZdZ eZd�Zd�Zd�Zd�Zd�Z y)rc���tjdk(rddlm}|j �tj|g|��i|��tj|jj�dt����y)N�posixr )�resource_trackerz created by pid )rFr]�rT�ensure_runningrr,rr�r6r7r)r+rDrIrTs rr,zSharedMemoryManager.__init__9s\���w�w�'�!�/� �/�/�1�� � ��7��7��7��J�J�$�.�.�1�1�2�2B�6�8�*�M�Nrc�p�tj|jj�dt ����y)Nz.__del__ by pid )rr�r6r7rr.s rr<zSharedMemoryManager.__del__Es'���J�J�$�.�.�1�1�2�2B�6�8�*�M�Nrc��� |jjtjk7r�|jjtjk(rtd��|jjtjk(rtd��tdj|jj���|j|j|j|j|j�S)Nz"Already started SharedMemoryServerz!SharedMemoryManager has shut downr�) r�r�r�r�r�r r�rPrr�r�r�r�r.s rr�zSharedMemoryManager.get_serverHs���N��{�{� � �E�M�M�1��;�;�$�$�� � �5�&�'K�L�L��[�[�&�&�%�.�.�8�&�'J�K�K�&�,�3�3�D�K�K�4E�4E�F�H�H��<�<����� � � $� � �t�/?�/?�A� Arc�.� |j|j|j��5}tjdd|��} t|dd|jf� ddd�|S#t$r}|j�|�d}~wwxYw#1swYSxYw)NrT)rf�sizerA) r�r�r�rr6rHr]� BaseExceptionr7)r+rZr��smsr�s rr6z SharedMemoryManager.SharedMemoryUs��� 4����d�m�m�T�]�]��C�t�#�0�0��d��N����T�4��3�8�8�+�F�D��J��%���J�J�L��G���� D��J�s)�B �A'�' B�0B�B�B � Bc�P� |j|j|j��5}tj|�} t|dd|jjf� ddd�|S#t$r!}|jj�|�d}~wwxYw#1swYSxYw)NrrA) r�r�r�r� ShareableListrH�shmr]r[r7)r+r�r��slr�s rr^z!SharedMemoryManager.ShareableListas��� F����d�m�m�T�]�]��C�t�"�0�0��:����T�4��2�6�6�;�;�.�I�D��I��%���F�F�M�M�O��G���� D��I�s)�B�#A.�. B�7B�B�B�B%N) r7r9r:r@rr,r<r�r6r^r<rrrr-s*�� �%�� O� O� A� � rr�r�)W�__all__r�r|rr�queuer�r�rFrr�rrUr �contextrrr rrrrr� HAS_SHMEMr[�ImportErrorrrFrQrY� view_typesr$� view_typer�rrHrAr�rRr_rbrdr�r�r��XmlListener� XmlClientrwrr�rKrrzr�rBr�r�r�r�r�r�r�r�r�r�r�rrr:r� BasePoolProxyrrr"r�r}r$r%r&r'r(r)r!r�r+r@r)r]s0r�<module>rksX��A���� ����� �� ��@�@�����*���I��N�N�(�)�2�� ���5�;�;��-�4M� N�4M�D�d�$�7�2�t�$�&�'�4M� N� ���I��I���y�/�2�� �z�M�F�M�.&(�b�)� I�C�)�C� �A�F*�V�F*�Z �F���#�#�Z�%6�%6�7��)�)�:�+?�+?�@���t'�&�t'�t�c��t=��t=�t:�*)+��,8<�7<��: E�� E� �F� �+�/�I�/� +�I� +��]��6 4�� 4�A�9�A�&1�Y�1�&8��8��o�0�� �� �� �+�(� � �� � � �� �<�*�� � �k�,�� � !��"�� �$� � �� �� �+� ����W�e�k�k�*����_�e�k�k�2����W�i�o�o�z�:����V�Y�^�^�]�;����W�i�o�o�}�=����[�)�"5�"5�}�E����'��)C�)C�"�$����[�)�"5�"5�~�F����Y� � 1� 1�<�@����V�T�Y�Y� �2����V�T�9�-����V�T�9�-����W�e�Z�0����W�e�Z�0����[�)�^�<����Z�=���N����]�%��8� �""�""�J*<�V�*<�Z>�k�>�g ��k%���I���Os�O;�P �;P�PPK:W�\��]�& & $__pycache__/managers.cpython-312.pycnu�[���� T��h�� ��gd�ZddlZddlZddlZddlZddlZddlZddlZddlZddlm Z ddl mZddlm Z ddlmZmZmZddlmZdd lmZdd lmZddlmZ ddlmZd Zej1d�d�Zej6eje�dD�cgc]}eei|�����c}Zd�ZeD]Z ej6e e��[ [Gd�de!�Z"difd�Z#d�Z$Gd�de%�Z&d�Z'd�Z(Gd�de!�Z)Gd�de!�Z*e jVe jXfe jZe j\fd �Z/Gd!�d"e!�Z0Gd#�d$e1�Z2Gd%�d&e!�Z3d'�Z4ifd(�Z5 dbd)�Z6Gd*�d+e!�Z7Gd,�d-e!�Z8dcd.�Z9Gd/�d0e3�Z:Gd1�d2e3�Z;Gd3�d4e;�Z<Gd5�d6e3�Z=Gd7�d8e3�Z>Gd9�d:e3�Z?Gd;�d<e3�Z@e5d=d>�ZAGd?�d@eA�ZBe5dAdB�ZCdCdDieC_De5dEdF�ZEe5dGdH�ZFdIdIdIdDdDdJ�eF_DGdK�dGeF�ZGGdL�dMe0�ZHeHj7dNej��eHj7dOej��eHj7dPej�e=�eHj7dQej�e;�eHj7dRej�e;�eHj7dSej�e;�eHj7dTej�e;�eHj7dUej�e<�eHj7dVej�e>�eHj7dWej�eG�eHj7dXeReB�eHj7dYeSeC�eHj7d-e8e@�eHj7dZe9eE�eHj7d+e7e?�eHj7dDe:d�[�eHj7dId�\�er!Gd]�d^�ZTGd_�d`e)�ZUGda�de0�ZVyy#e$rdZY���wxYwcc}w)d)�BaseManager�SyncManager� BaseProxy�Token�N)�getpid)� format_exc�)� connection)� reduction�get_spawning_popen�ProcessError)�pool)�process)�util)�get_context)� shared_memoryT�SharedMemoryManagerFc�Z�tj|j|j�ffS�N)�array�typecode�tobytes)�as �1/usr/lib64/python3.12/multiprocessing/managers.py�reduce_arrayr/s ���;�;����Q�Y�Y�[�1�1�1�)�items�keys�valuesc�&�tt|�ffSr)�list��objs r�rebuild_as_listr$4s���$�s�)���rc�,�eZdZdZdZd�Zd�Zd�Zd�Zy)rz3 Type to uniquely identify a shared object ��typeid�address�idc�0�|||c|_|_|_yrr&)�selfr'r(r)s r�__init__zToken.__init__Ds��06���,���d�l�D�Grc�H�|j|j|jfSrr&�r+s r�__getstate__zToken.__getstate__Gs�����T�\�\�4�7�7�3�3rc�.�|\|_|_|_yrr&�r+�states r�__setstate__zToken.__setstate__Js��/4�,���d�l�D�Grc��|jj�d|j�d|j�d|j�d�S)Nz(typeid=z , address=z, id=�))� __class__�__name__r'r(r)r.s r�__repr__zToken.__repr__Ms-�����'�'����d�l�l�D�G�G�M� MrN) r7� __module__�__qualname__�__doc__� __slots__r,r/r3r8�rrrr>s$���,�I�E�4�5�Mrrr=c�x�|j||||f�|j�\}}|dk(r|St||��)zL Send a message to manager using connection `c` and return response �#RETURN)�send�recv�convert_to_error)�cr)� methodname�args�kwds�kind�results r�dispatchrIUsB���F�F�B� �D�$�'�(��6�6�8�L�D�&��y��� � �4�� (�(rc ���|dk(r|S|dvrSt|t�s%tdj||t |����|dk(rtd|z�St|�St dj|��S)N�#ERROR)� #TRACEBACK�#UNSERIALIZABLEz.Result {0!r} (kind '{1}') type is {2}, not strrMzUnserializable message: %s zUnrecognized message type {!r})� isinstance�str� TypeError�format�type�RemoteError� ValueError)rGrHs rrBrB_s����x��� � �2� 2��&�#�&��@�G�G��D�$�v�,�0�1� 1��$�$��=��F�G�G��v�&�&��:�A�A�$�G�H�Hrc��eZdZd�Zy)rSc�>�dt|jd�zdzS)NzM --------------------------------------------------------------------------- rzK---------------------------------------------------------------------------)rOrEr.s r�__str__zRemoteError.__str__os��$�s�4�9�9�Q�<�'8�8�6�A�BrN)r7r9r:rWr=rrrSrSns��CrrSc�|�g}t|�D]+}t||�}t|�s�|j|��-|S)z4 Return a list of names of methods of `obj` )�dir�getattr�callable�append)r#�temp�name�funcs r�all_methodsr`vs=���D��C����s�D�!���D�>��K�K�����Krc�P�t|�D�cgc] }|ddk7s�|��c}Scc}w)zP Return a list of names of methods of `obj` which do not start with '_' r�_)r`)r#r^s r�public_methodsrc�s-��)��-�@�-�T��a��C��D�-�@�@��@s� #�#c��eZdZdZgd�Zd�Zd�Zd�Zd�Zd�Z d�Z d �Zd �Zd�Z ee ed�Zd �Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zy)�ServerzM Server class which runs in a process controlled by a manager object ) �shutdown�create�accept_connection�get_methods� debug_info�number_of_objects�dummy�incref�decrefc�z�t|t�s$tdj|t |����||_t j|�|_t|\}}||d��|_ |jj|_ddi|_i|_ i|_tj �|_y)Nz&Authkey {0!r} is type {1!s}, not bytes�)r(�backlog�0�Nr=)rN�bytesrPrQrR�registryr�AuthenticationString�authkey�listener_client�listenerr(� id_to_obj�id_to_refcount�id_to_local_proxy_obj� threading�Lock�mutex)r+rur(rw� serializer�Listener�Clients rr,zServer.__init__�s����'�5�)��8�?�?��T�'�]�,�-� -�!�� ��3�3�G�<���*�:�6���&�!��#�>�� ��}�}�,�,����z�*��� ���%'��"��^�^�%�� rc��tj�|_|tj�_ tj|j��}d|_|j� |jj�s6|jjd�|jj�s�6tjtj k7rGt#j$d�tj t_tj&t_tj*d�y#ttf$rY��wxYw#tjtj k7rGt#j$d�tj t_tj&t_tj*d�wxYw)z( Run the server forever )�targetTr zresetting stdout, stderrrN)r}�Event� stop_eventr�current_process�_manager_server�Thread�accepter�daemon�start�is_set�wait�KeyboardInterrupt� SystemExit�sys�stdout� __stdout__r�debug� __stderr__�stderr�exit)r+r�s r� serve_foreverzServer.serve_forever�s ��$�/�/�+���48����!�1� � �'�'�t�}�}�=�H�"�H�O��N�N�� ��/�/�0�0�2��O�O�(�(��+��/�/�0�0�2� �z�z�S�^�^�+�� � �5�6� �^�^�� � �^�^�� ��H�H�Q�K��&�z�2� �� ���z�z�S�^�^�+�� � �5�6� �^�^�� � �^�^�� ��H�H�Q�K�s+�7E�,AD:�:E� E�E�E�A?Gc��� |jj�}tj|j |f��}d|_|j��U#t$rY�awxYw)NT�r�rE)ry�accept�OSErrorr}r��handle_requestr�r�)r+rC�ts rr�zServer.accepter�sa��� ��M�M�(�(�*��� � ��(;�(;�1�$�G�A��A�H� �G�G�I���� �� �s�A� A#�"A#c��d} tj||j�tj||j�|j �}|\}}}}||j vs Jd|z��t ||�} ||g|��i|��}d|f} |j| �y#t$rdt�f} Y�*wxYw#t$rdt�f} Y�EwxYw#t$rx} |jdt�f�n#t$rYnwxYwtjd| �tjd|�tjd| �Yd} ~ yd} ~ wwxYw)Nz%r unrecognizedr?rLzFailure to send message: %rz ... request was %r� ... exception was %r)r �deliver_challengerw�answer_challengerA�publicrZ� Exceptionrr@r�info)r+rC�request�ignore�funcnamerErFr_rH�msg�es r�_handle_requestzServer._handle_request�sO���� *��(�(��D�L�L�9��'�'��4�<�<�8��f�f�h�G�+2�(�F�H�d�D��t�{�{�*�H�,=��,H�H�*��4��*�D� *��a�/�$�/�$�/��!�&�)�� 2� �F�F�3�K�� � 3�#�Z�\�2�� 3��� /����.�C� /��� 2� �����j�l�3�4��� �� ���I�I�3�S�9��I�I�+�W�5��I�I�-�q�1�1�� 2�s[�A;B>�B#�C�#B;�:B;�>C�C� E�#C?�>E�? D�E� D�AE�Ec�� |j|�|j�y#t$rY�wxYw#|j�wxYw)z) Handle a new connection N)r�r��close�r+�conns rr�zServer.handle_request�s@�� �� � ��&� �J�J�L�� � �� �� �J�J�L�s�$� 0�3�0�3�Ac�$�tjdtj�j�|j }|j}|j}|jj�s� dx}}|�}|\}}} } ||\}}}||vrtd|�dt|��d|����t||�} || i| ��}|xr|j|d�}|r4|j!|||�\}}t#||j$|�}d||ff}nd|f} |�|jj�s��yy#t$r.} |j|\}}}n#t$r| �wxYwYd} ~ ��d} ~ wwxYw#t&$r}d|f}Yd}~�sd}~wwxYw#t$rQ� d t)�f}n? |j*|}|||g ��i ��}d|f}n#t&$rd t)�f}YnwxYwY��t,$rKtjd tj�j�t/j0d�Y��&t&$rd t)�f}Y��=wxYw#t&$r|dt)�f�Y��UwxYw#t&$r�}tj2d tj�j�tj2d�tj2d|�|j5�t/j0d�Yd}~���d}~wwxYw)zQ Handle requests from the proxies in a particular process/thread z$starting server thread to service %rNzmethod z of z object is not in exposed=�#PROXYr?rKrLz$got EOF -- exiting thread serving %rrrMzexception in thread serving %rz ... message was %rr�r )rr�r}�current_threadr^rAr@rzr�r��KeyErrorr|�AttributeErrorrRrZ�getrgrr(r�r�fallback_mapping�EOFErrorr�r�r�r�)r+r�rAr@rzrDr#r��identrErF�exposed� gettypeid�ke�function�resr'�rident�rexposed�tokenr�r�� fallback_funcrHs r�serve_clientzServer.serve_client�s�� � � �9��+�+�-�2�2� 4��y�y���y�y���N�N� ��/�/�(�(�*�5 3�#'�'� �S��&��07�-��z�4��!�.7��.>�+�C��)��W�,�(�#�T�#�Y��9��� #�3� �3��/�"�D�1�D�1�C�'�J�9�=�=��T�+J�F��+/�;�;�t�V�S�+I�(��� %�f�d�l�l�F� C��'�(�E�):�;��(�#�.��. �<���I�w�/�/�(�(�*�� �!�!� �6�6�u�=�0��W�i��#�!� ��!��'0��!��"!�(�#�Q�-�C��(��"� ;��%�'���6�C�;�(,�(=�(=�j�(I� �!.� �$��s�"�59�"�=A�"�� )�&�1���$�;�+�Z�\�:��;��� �� � �A�$�3�3�5�:�:�<������� 3�#�Z�\�2�� 3��!�<��+�Z�\�:�;�<��� �� � �:�!�0�0�2�7�7�9�� � �/��5�� � �1�1�5�� � ��������� �s��2F� D<�-F�<E6�AF�I�< E3�E�E.�E&�&E.�)F�.E3�3F�6 F �?F�F�F � F�I�)"G�I�G$�!I�#G$�$I�)AI�;I�I�I5�1I8�4I5�5I8�8 L�BL � Lc��|Srr=�r+r�r�r#s r�fallback_getvaluezServer.fallback_getvalue?s��� rc��t|�Sr�rOr�s r�fallback_strzServer.fallback_strBs���3�x�rc��t|�Sr)�reprr�s r� fallback_reprzServer.fallback_reprEs���C�y�r)rWr8� #GETVALUEc��yrr=�r+rCs rrlzServer.dummyNs��rc �r�|j5g}t|jj��}|j �|D]K}|dk7s� |jd|�d|j|�dt |j|d�dd����Mdj|�cddd�S#1swYyxYw) zO Return some info --- useful to spot problems with refcounting rrz z: refcount=z rN�K� ) rr!r{r�sortr\rOrz�join)r+rCrHrr�s rrjzServer.debug_infoQs��� �Z�Z��F���+�+�0�0�2�3�D��I�I�K����C�<��M�M�#(�$�*=�*=�e�*D�#&�t�~�~�e�'<�Q�'?�#@��"�#E�#G�H�� �9�9�V�$��Z�Z�s�AB-�AB-�-B6c�,�t|j�S)z* Number of shared objects )�lenr{r�s rrkzServer.number_of_objectsas�� �4�&�&�'�'rc�� tjd�|jd�|j j �y#ddl}|j �Y�3xYw#|j j �wxYw)z' Shutdown this process z!manager received shutdown message�r?NrN)rr�r@� traceback� print_excr��set)r+rCr�s rrfzServer.shutdownhsZ�� "��J�J�:�;� �F�F�$�%� �O�O���!�� "�����!���O�O���!�s�&A�A�A�A:c �n�|j5|j|\}}}}|�!|st|�dk7rtd��|d} n||i|��} |�t | �}|�Kt|t�s$tdj|t|����t|�t|�z}dt| �z} tjd|| �| t|�|f|j| <| |j vrd|j | <ddd�|j#| �| t%�fS#1swY�(xYw)z> Create a new shared object and return its id Nr z4Without callable, must have one non-keyword argumentrz,Method_to_typeid {0!r}: type {1!s}, not dictz%xz&%r callable returned object with id %r)rrur�rTrcrN�dictrPrQrRr!r)rr�r�rzr{rm�tuple)r+rCr'rErFr[r��method_to_typeid� proxytyper#r�s rrgz Server.createusE���Z�Z��m�m�F�+� ;�H�g�/�����C��I��N�$�N�P�P��1�g����-��-����(��-���+�!�"2�D�9�#�F�M�M�,�d�3C�.D�F�G�G��w�-�$�/?�*@�@���2�c�7�N�E��J�J�?���O�%(�#�g�,�8H�$I�D�N�N�5�!��D�/�/�/�-.��#�#�E�*�7�: ���A�u���e�G�n�$�$�=�Z�s�C7D+�+D4c�L�t|j|jd�S)zL Return the methods of the shared object indicated by token r )r�rzr))r+rCr�s rrizServer.get_methods�s!���T�^�^�E�H�H�-�a�0�1�1rc�z�|tj�_|jd�|j |�y)z= Spawn a new thread to serve this connection r�N)r}r�r^r@r�)r+rCr^s rrhzServer.accept_connection�s0��+/� � � �"�'� ��� �!����!�rc�F�|j5 |j|xxdz cc<ddd�y#t$r\}||jvrBd|j|<|j||j|<tjd|�n|�Yd}~�id}~wwxYw#1swYyxYw)Nr z&Server re-enabled tracking & INCREF %r)rr{r�r|rzrr�)r+rCr�r�s rrmz Server.incref�s��� �Z�Z� ��#�#�E�*�a�/�*��Z��� � �D�6�6�6�12�D�'�'��.��2�2�5�9��N�N�5�)��J�J�G��O��H�P�� ���Z�s,�B�/� B�AB� B�B�B�B c �l�||jvr%||jvrtjd|�y|j5|j|dkr6tdj ||j||j|���|j|xxdzcc<|j|dk(r |j|=ddd�||jvrHd|j|<tjd|�|j5|j|=ddd�yy#1swY�`xYw#1swYyxYw)NzServer DECREF skipping %rrz+Id {0!s} ({1!r}) has refcount {2:n}, not 1+r )Nr=Nzdisposing of obj with id %r)r{r|rr�r�AssertionErrorrQrz)r+rCr�s rrnz Server.decref�s����+�+�+��T�/�/�/��J�J�2�E�:�� �Z�Z��"�"�5�)�Q�.�$�A�H�H��t�~�~�e�4��+�+�E�2�4�5�5� ����&�!�+�&��"�"�5�)�Q�.��'�'��.����+�+�+�%5�D�N�N�5�!��J�J�4�e�<�����N�N�5�)���,��Z��$��s�A?D�D*�D'�*D3N)r7r9r:r;r�r,r�r�r�r�r�r�r�r�r�rlrjrkrfrgrirhrmrnr=rrrere�s���N�F�&�$�,�2�< �O�b���� �%� �� �%� (�"�"%�H2���"*rrec��eZdZdgZdZdZdZy)�State�valuerr �N)r7r9r:r<�INITIAL�STARTED�SHUTDOWNr=rrr�r��s��� �I��G��G��Hrr�)�pickle� xmlrpclibc��eZdZdZiZeZ ddd�d�Zd�Zd�Z dd�Z e dd ��Zd �Z dd�Zd�Zd �Zd�Zd�Zed��Zed��Ze dd��Zy)rz! Base class for managers Ng�?)�shutdown_timeoutc�P�|�tj�j}||_tj|�|_t �|_tj|j_ ||_ t|\|_|_ |xs t�|_||_yr)rr�rw�_addressrv�_authkeyr��_stater�r��_serializerrx� _Listener�_Clientr�_ctx�_shutdown_timeout)r+r(rwr��ctxr�s rr,zBaseManager.__init__�s~���?��-�-�/�7�7�G��� ��4�4�W�=�� ��g���!�M�M�����%���'6�z�'B�$������(�;�=�� �!1��rc���|jjtjk7r�|jjtjk(rtd��|jjtjk(rtd��tdj|jj���t|j|j|j|j�S)zX Return server object with serve_forever() method and address attribute �Already started server�Manager has shut down�Unknown state {!r}) r�r�r�r�r�r r�rQre� _registryr�r�r�r.s r� get_serverzBaseManager.get_server�s����;�;���� � �-��{�{� � �E�M�M�1�"�#;�<�<����"�"�e�n�n�4�"�#:�;�;�"�(�/�/����0A�0A�B�D�D��d�n�n�d�m�m��m�m�T�%5�%5�7� 7rc���t|j\}}||j|j��}t |dd�t j|j_y)z> Connect manager object to the server process �rwNrl) rxr�r�r�rIr�r�r�r�)r+r�r�r�s r�connectzBaseManager.connectsI��+�4�+;�+;�<���&��d�m�m�T�]�]�;����t�W�%�!�M�M����rc ��|jjtjk7r�|jjtjk(rtd��|jjtjk(rtd��tdj|jj���|�t|�std��tjd��\}}|jjt|�j|j |j"|j$|j&|||f��|_d j+d �|j(j,D��}t|�j.dz|z|j(_|j(j3�|j5�|j7�|_|j5�tj|j_t9j:|t|�j<|j(|j"|j$|j|j>|j@fd� �|_!y)z@ Spawn a server process for this manager object r�r�r�Nzinitializer must be a callableF)�duplexr��:c3�2K�|]}t|����y�wrr�)�.0�is r� <genexpr>z$BaseManager.start.<locals>.<genexpr>0s����A�)@�A��Q��)@�s��-r�rE�exitpriority)"r�r�r�r�r�r r�rQr[rPr �Piper��ProcessrR�_run_serverr�r�r�r��_processr�� _identityr7r^r�r�rAr�Finalize�_finalize_managerr�r�rf)r+�initializer�initargs�reader�writerr�s rr�zBaseManager.starts����;�;���� � �-��{�{� � �E�M�M�1�"�#;�<�<����"�"�e�n�n�4�"�#:�;�;�"�(�/�/����0A�0A�B�D�D��"�8�K�+@��<�=�=�$����6����� � �)�)���:�)�)��.�.�$�-�-�����"�"�F�K��C�*��� � ���A����)@�)@�A�A��!�$�Z�0�0�C�7�%�?�� � ��� � ���� ������� �� �����"�M�M������ � ��$�t�*�.�.��-�-����� � �t�{�{��,�,�� 6� 6�8�� �� rc�T�tjtjtj�|�||�|j||||�}|j |j �|j �tjd|j �|j�y)z@ Create a server, report its address and run it Nzmanager serving at %r) �signal�SIGINT�SIG_IGN�_Serverr@r(r�rr�r�) �clsrur(rwr�rrr�servers rrzBaseManager._run_serverBsz�� � � �f�m�m�V�^�^�4��"���"����X�w���D�� ���F�N�N�#����� � � �)�6�>�>�:����rc�V�|jjtjk(sJd��|j |j |j��} t|dd|f|z|�\}}|j�t||j |�|fS#|j�wxYw)zP Create a new shared object; return the token and exposed tuple zserver not yet startedrNrg) r�r�r�r�r�r�r�rIr�r)r+r'rErFr�r)r�s r�_createzBaseManager._createYs����{�{� � �E�M�M�1�K�3K�K�1��|�|�D�M�M�4�=�=�|�A�� �"�4��x�&��4���N�K�B���J�J�L��V�T�]�]�B�/��8�8�� �J�J�L�s�B�B(c��|j�>|jj|�|jj�sd|_yyy)zC Join the manager process (if it has been spawned) N)rr��is_alive�r+�timeouts rr�zBaseManager.joinesA���=�=�$��M�M���w�'��=�=�)�)�+� $�� �,�%rc��|j|j|j��} t|dd�|j �S#|j �wxYw)zS Return some info about the servers shared objects and connections rNrj�r�r�r�rIr�r�s r�_debug_infozBaseManager._debug_infonsB���|�|�D�M�M�4�=�=�|�A�� ��D�$��5��J�J�L��D�J�J�L���A�Ac��|j|j|j��} t|dd�|j �S#|j �wxYw)z5 Return the number of shared objects rNrkr&r�s r�_number_of_objectszBaseManager._number_of_objectsxsC���|�|�D�M�M�4�=�=�|�A�� ��D�$�(;�<��J�J�L��D�J�J�L�r(c���|jjtjk(r|j �|jjtj k7r�|jjtjk(rt d��|jjtjk(rt d��t dj|jj���|S)NzUnable to start serverr�r�) r�r�r�r�r�r�r r�rQr.s r� __enter__zBaseManager.__enter__�s����;�;���� � �-��J�J�L��;�;���� � �-��{�{� � �E�M�M�1�"�#;�<�<����"�"�e�n�n�4�"�#:�;�;�"�(�/�/����0A�0A�B�D�D��rc�$�|j�yr)rf�r+�exc_type�exc_val�exc_tbs r�__exit__zBaseManager.__exit__�s��� � �rc���|j��rtjd� |||��} t|dd�|j � |j|��|j�r�tjd�t|d�r�tjd�|j�|j|��|j�r7tjd �|j�|j�tj|_ tj|=y#|j �wxYw#t $rY��wxYw#t$rYywxYw) zQ Shutdown the manager process; will be registered as a finalizer z#sending shutdown message to managerrNrf)r$zmanager still alive� terminatez'trying to `terminate()` manager processz#manager still alive after terminate)r"rr�rIr�r�r��hasattrr4�killr�r�r�r�_address_to_localr�)rr(rwr2r�r�r�s rrzBaseManager._finalize_manager�s*���7�����I�I�;�<� ��w��8��!��T�4��4��J�J�L� �G�L�L�!1�2��w���!�� � �/�0��7�K�0��I�I�G�H�%�G�%�%�'� �G�L�L�)9�:�'�w�'�'�)�� � �"G�H�$�����$������n�n��� ��+�+�G�4��%�J�J�L��� �� ��$� �� �s:� E� E�E�.E%�E�E� E"�!E"�% E1�0E1c��|jSr)r�r.s rr(zBaseManager.address�s���}�}�rc�����d|jvr|jj�|_��t�|xs t �dd�}|xs t �dd�}|rWt|j ��D];\}}t|�tus Jd|z��t|�tur�3Jd|z��|||�f|j�<|r��fd�} �| _ t|�| �yy)z9 Register a typeid with the manager type r�N� _exposed_�_method_to_typeid_z%r is not a stringc�(��tjd��|j�g|��i|��\}}�||j||j|��}|j|j|j��}t|dd|jf�|S)Nz)requesting creation of a shared %r object��managerrwr�rrn) rr�r r�r�r�r(rIr)) r+rErFr��exp�proxyr�r�r's ��rr]z"BaseManager.register.<locals>.temp�s����� � �F��O�)�T�\�\�&�@�4�@�4�@� ��s�!��4�+�+�T� �M�M�3����|�|�E�M�M�4�=�=�|�I����t�X����{�;��r)�__dict__r��copy� AutoProxyrZr!rrRrOr7�setattr) rr'r[r�r�r�� create_method�keyr�r]s ` ` r�registerzBaseManager.register�s�����c�l�l�*��M�M�.�.�0�C�M���!�I��B�W�Y��T�B��+�J�"�9�.B�D�I� ��"�#3�#9�#9�#;�<� ��U��C�y�C�'�C�)=��)C�C�'��E�{�c�)�G�+?�%�+G�G�)�=� �g�/��!�� � �f��� �#�D�M��C���&�r)NNr�Nrsr)NNNNT)r7r9r:r;r�rerr,r�rr��classmethodrr r�r'r*r,r2�staticmethodr�propertyr(rGr=rrrr�s�����I��G�>F��2�/2�2� 7�*�)�V�/1����, 9�%������ �� �D�����EI�6:�%'��%'rrc��eZdZd�Zd�Zy)�ProcessLocalSetc�2�tj|d��y)Nc�"�|j�Sr)�clearr"s r�<lambda>z*ProcessLocalSet.__init__.<locals>.<lambda>�s ��3�9�9�;r)r�register_after_forkr.s rr,zProcessLocalSet.__init__�s��� � ��'>�?rc��t|�dfSrs)rRr.s r� __reduce__zProcessLocalSet.__reduce__�s���D�z�2�~�rN)r7r9r:r,rSr=rrrLrL�s ��@�rrLc��eZdZdZiZej�ZdZ dd�Z d�Z difd�Zd�Zd �Z ed ��Zd�Zd�Zd �Zd�Zd�Zy)rz. A base for proxies of shared objects r Nc�n�tj5tjj|jd�}|�;tj�t�f}|tj|j<tj|_ txjdz c_ddd�d|_ |d|_||_|jj|_||_||_t"|d|_||_|�t)j*|�|_nK|j�|jj,|_n#t)j.�j0|_|r|j3�tj4|tj6�y#1swY��xYw)Nr r)r�_mutexr7r�r(r�ForkAwareLocalrL�_next_serial�_serial�_tls�_all_serials�_tokenr)�_id�_managerr�rxr��_owned_by_managerrrvr�r�rw�_increfrQ�_after_fork) r+r�r�r>rwr�rm� manager_owned�tls_serialss rr,zBaseProxy.__init__�sJ�� � � �#�5�5�9�9�%�-�-��N�K��"�"�1�1�3�_�5F�F��=H� �+�+�E�M�M�:�$�1�1�D�L��"�"�a�'�"�� ��N�� � (��N�������;�;�>�>����� �%���&�z�2�1�5���"/�����#�8�8��A�D�M� �]�]� &� �M�M�2�2�D�M�#�3�3�5�=�=�D�M���L�L�N�� � ��y�'<�'<�=�Q� �s�BF*�*F4c��tjd�tj�j}tj�jdk7r$|dtj�jzz }|j|jj|j��}t|dd|f�||j_ y)Nzmaking connection to manager� MainThread�|rrh)rr�rr�r^r}r�r�r\r(r�rIrZr )r+r^r�s r�_connectzBaseProxy._connect&s���� � �1�2��&�&�(�-�-���#�#�%�*�*�l�:��C�)�2�2�4�9�9�9�9�D��|�|�D�K�K�/�/����|�G����t�0�4�'�:�#�� � �rr=c�� |jj}|j|j|||f�|j�\}}|dk(r|S|dk(r�|\}}|jj|jd} |jj |_| ||j"|j|j$|��} |j'|j |j$��}t)|dd|j*f�| St-||��#t$r\tjdtj�j�|j�|jj}Y��awxYw) zV Try to call a method of the referent and return a copy of the result z#thread %r does not own a connectionr?r����r=rNrn)rZr r�rr�r}r�r^rgr@r]rAr^r�r'r\r(r�r�r�rIr)rB)r+rDrErFr�rGrHr�r�r�r@s r�_callmethodzBaseProxy._callmethod/s<�� (��9�9�'�'�D� � � �4�8�8�Z��t�4�5��y�y�{���f��9���M� �X� �#�N�G�U�� � �/�/����=�b�A�I� �K�K�/�/�E�M���t�'�'����� � �w��E��<�<�� � �t�}�}�<�E�D��T�4��E�H�H�;�7��L��t�V�,�,��-� (��J�J�<� �/�/�1�6�6� 8��M�M�O��9�9�'�'�D� (�s�D�A!E:�9E:c�$�|jd�S)z9 Get a copy of the value of the referent r��rjr.s r� _getvaluezBaseProxy._getvalueMs������,�,rc���|jr+tjd|jj�y|j|jj|j��}t|dd|jf�tjd|jj�|jj|j�|jxr|jj}tj|t j"|j|j|j||j$|j|j fd��|_y)Nz%owned_by_manager skipped INCREF of %rrrmz INCREF %r� r)r_rr�r\r)r�r(r�rIr]r[�addrYr^r�rr�_decrefrZ�_close)r+r�r2s rr`zBaseProxy._increfSs����!�!��J�J�>������O���|�|�D�K�K�/�/����|�G����t�X����{�3�� � �;������/������d�l�l�+�� � �6�$�-�-�"6�"6���m�m��)�#�#��+�+�t�|�|�T�]�]�E��)�)�T�.�.����>�� ��rc�V�|j|�|�|jtjk(rO t j d|j�||j|��}t|dd|jf�n t j d|j�|s\t|d�rOt j dtj�j�|jj�|`yyy#t$r }t j d|�Yd}~��d}~wwxYw)Nz DECREF %rrrnz... decref failed %sz%DECREF %r -- manager already shutdownr z-thread %r has no more proxies so closing conn)�discardr�r�r�rr�r)r(rIr�r5r}r�r^r r�) r��serialrwr2�tls�idsetr�r�r�s rrqzBaseProxy._decrefgs��� � � �f���=�E�K�K�5�=�=�8� 6�� � �;����1��u�}�}�g�>����t�X����{�;� �J�J�>����I����l�3��J�J�F� �/�/�1�6�6� 8��N�N� � �"��� 4�u��� 6�� � �1�1�5�5�� 6�s�A C?�? D(�D#�#D(c��d|_ |j�y#t$r"}tjd|z�Yd}~yd}~wwxYw)Nzincref failed: %s)r^r`r�rr�)r+r�s rrazBaseProxy._after_fork�s<���� � /��L�L�N��� /��I�I�)�A�-�.�.�� /�s�� A�A�Ac� �i}t��|j|d<t|dd�r3|j|d<tt |j|j|ffStt|�|j|j|ffS)Nrw�_isautoFr�) rr�rZr:�RebuildProxyrCr\r�rR�r+rFs rrSzBaseProxy.__reduce__�s�������+�"�m�m�D��O��4��E�*�"�n�n�D��O� �����T�-=�-=�t�D�F� F�!��$�Z����d�.>�.>��E�G� Grc�"�|j�Sr)rm)r+�memos r�__deepcopy__zBaseProxy.__deepcopy__�s���~�~��rc�r�dt|�j|jjt |�fzS)Nz<%s object, typeid %r at %#x>)rRr7r\r'r)r.s rr8zBaseProxy.__repr__�s3��.��T� �#�#�T�[�[�%7�%7��D��B�C� Crc�f� |jd�S#t$rt|�dddzcYSwxYw)zV Return representation of the referent (or a fall-back if that fails) r8Nriz; '__str__()' failed>)rjr�r�r.s rrWzBaseProxy.__str__�s=�� =��#�#�J�/�/��� =���:�c�r�?�%<�<�<� =�s��0�0�NNNTF)r7r9r:r;r7r�ForkAwareThreadLockrVrXr,rgrjrmr`rIrqrarSrr8rWr=rrrr�s|����� %�T� %� %� '�F��L�26�HM�*>�X$�,.�B�-�<-��(����0/�G� �C�=rrc��ttj�dd�}|r||j|jk(rct j d|�d|d<|j|jvr0|j|j|j|j<|jdd�xr ttj�dd�}|||fd|i|��S) z5 Function used for unpickling proxy objects. r�Nz*Rebuild a proxy owned by manager, token=%rTrbrm�_inheritingF) rZrr�r(rr�r)r|rz�pop)r_r�r�rFrrms rr{r{�s����W�,�,�.�0A�4� H�F� �&�.�.�E�M�M�1�� � �?��G� $��_���8�8�6�7�7�7�� � ����*� �(�(����2� ����4� � E��G�+�+�-�}�e�D�D����z�9�&�9�D�9�9rc���t|�} |||fS#t$rYnwxYwi}|D]}td|�d|�d�|��t|tf|�}||_||||f<|S)zB Return a proxy type whose methods are given by `exposed` zdef z:(self, /, *args, **kwds): return self._callmethod(z , args, kwds))r�r��execrRrr:)r^r��_cache�dic�meth� ProxyTypes r� MakeProxyTyper��s����G�n�G� ��t�W�o�&�&��� �� �� �C����6:�D�B�CF� H���T�I�<��-�I�!�I��'�F�D�'�?���s�� � c�p�t|d}|�4||j|��} t|dd|f�}|j�|�|�|j}|�tj�j}td|jz|�} | ||||||��} d| _ | S#|j�wxYw)z* Return an auto-proxy for `token` r Nrriz AutoProxy[%s])r>rwrmrbT)rxr(rIr�r�rr�rwr�r'rz)r�r�r>rwr�rmrbr�r�r�r@s rrCrC�s��� �j�)�!�,�G����u�}�}�g�6�� ��t�T�=�5�(�C�G��J�J�L���7�.��"�"�����)�)�+�3�3���o����<�g�F�I��e�Z��'�#�=� B�E��E�M��L�� �J�J�L�s�B#�#B5c��eZdZd�Zd�Zy)� Namespacec�:�|jj|�yr)rA�updater|s rr,zNamespace.__init__�s��� � ���T�"rc�&�t|jj��}g}|D]-\}}|jd�r�|j |�d|����/|j�|jj�ddj|��d�S)Nrb�=�(�, r5) r!rAr� startswithr\r�r6r7r�)r+rr]r^r�s rr8zNamespace.__repr__�sq���T�]�]�(�(�*�+���� �K�D�%��?�?�3�'����t�U�3�4�!� � � ���>�>�2�2�D�I�I�d�O�D�DrN)r7r9r:r,r8r=rrr�r��s ��#�Err�c�8�eZdZdd�Zd�Zd�Zd�Zeee�Zy)�Valuec� �||_||_yr)� _typecode�_value)r+rr��locks rr,zValue.__init__�s��!�����rc��|jSr�r�r.s rr�z Value.gets���{�{�rc��||_yrr��r+r�s rr�z Value.sets ����rc�f�t|�j�d|j�d|j�d�S)Nr�r�r5)rRr7r�r�r.s rr8zValue.__repr__s!��!�$�Z�0�0�$�.�.�$�+�+�N�NrN�T) r7r9r:r,r�r�r8rJr�r=rrr�r��s#�����O��S�#��Err�c�.�tj||�Sr)r)r�sequencer�s r�Arrayr� s���;�;�x��*�*rc�.�eZdZdZd�Zd�Zd�Zd�Zd�Zy)� IteratorProxy)�__next__r@�throwr�c��|Srr=r.s r�__iter__zIteratorProxy.__iter__����rc�&�|jd|�S)Nr�rl�r+rEs rr�zIteratorProxy.__next__s����� �D�1�1rc�&�|jd|�S)Nr@rlr�s rr@zIteratorProxy.sends�������-�-rc�&�|jd|�S)Nr�rlr�s rr�zIteratorProxy.throw��������.�.rc�&�|jd|�S)Nr�rlr�s rr�zIteratorProxy.closer�rN) r7r9r:r:r�r�r@r�r�r=rrr�r�s ��6�I��2�.�/�/rr�c�*�eZdZdZdd�Zd�Zd�Zd�Zy)� AcquirerProxy)�acquire�releaseNc�8�|�|fn||f}|jd|�S�Nr�rl)r+�blockingr$rEs rr�zAcquirerProxy.acquire s'��%�o��{�H�g�3F����� �4�0�0rc�$�|jd�S�Nr�rlr.s rr�zAcquirerProxy.release#������ �*�*rc�$�|jd�Sr�rlr.s rr,zAcquirerProxy.__enter__%r�rc�$�|jd�Sr�rlr.s rr2zAcquirerProxy.__exit__'r�r)TN)r7r9r:r:r�r�r,r2r=rrr�r�s��&�I�1�+�+�+rr�c�.�eZdZdZdd�Zdd�Zd�Zdd�Zy) �ConditionProxy)r�r�r��notify� notify_allNc�(�|jd|f�S�Nr�rlr#s rr�zConditionProxy.wait-�������� �3�3rc�(�|jd|f�S)Nr�rl)r+�ns rr�zConditionProxy.notify/s������1�$�/�/rc�$�|jd�S)Nr�rlr.s rr�zConditionProxy.notify_all1s������-�-rc���|�}|r|S|�tj�|z}nd}d}|s<|�|tj�z }|dkr |S|j�|�}|s�<|S)Nr)�time� monotonicr�)r+� predicater$rH�endtime�waittimes r�wait_forzConditionProxy.wait_for3s~�������M����n�n�&��0�G��G��H���"�"�T�^�^�%5�5���q�=��� � �I�I�h���[�F� �� rr)r )r7r9r:r:r�r�r�r�r=rrr�r�+s��F�I�4�0�.�rr�c�*�eZdZdZd�Zd�Zd�Zdd�Zy)� EventProxy)r�r�rOr�c�$�|jd�S)Nr�rlr.s rr�zEventProxy.is_setHs������)�)rc�$�|jd�S�Nr�rlr.s rr�zEventProxy.setJ�������&�&rc�$�|jd�S)NrOrlr.s rrOzEventProxy.clearL�������(�(rNc�(�|jd|f�Sr�rlr#s rr�zEventProxy.waitNr�rr)r7r9r:r:r�r�rOr�r=rrr�r�Fs��2�I�*�'�)�4rr�c�T�eZdZdZd d�Zd�Zd�Zed��Zed��Z ed��Z y) �BarrierProxy)�__getattribute__r��abort�resetNc�(�|jd|f�Sr�rlr#s rr�zBarrierProxy.waitTr�rc�$�|jd�S)Nr�rlr.s rr�zBarrierProxy.abortVr�rc�$�|jd�S)Nr�rlr.s rr�zBarrierProxy.resetXr�rc�&�|jdd�S)Nr�)�partiesrlr.s rr�zBarrierProxy.partiesZs����� 2�L�A�Arc�&�|jdd�S)Nr�)� n_waitingrlr.s rr�zBarrierProxy.n_waiting]s����� 2�N�C�Crc�&�|jdd�S)Nr�)�brokenrlr.s rr�zBarrierProxy.broken`s����� 2�K�@�@rr)r7r9r:r:r�r�r�rJr�r�r�r=rrr�r�RsR��>�I�4�)�)� �B��B� �D��D� �A��Arr�c�"�eZdZdZd�Zd�Zd�Zy)�NamespaceProxy)r��__setattr__�__delattr__c�~�|ddk(rtj||�Stj|d�}|d|f�S)Nrrbrjr�)�objectr��r+rF� callmethods r�__getattr__zNamespaceProxy.__getattr__gsB���q�6�S�=��*�*�4��5�5��,�,�T�=�A� ��,�s�f�5�5rc��|ddk(rtj|||�Stj|d�}|d||f�S)Nrrbrjr�)r�r�r�)r+rFr�r�s rr�zNamespaceProxy.__setattr__lsE���q�6�S�=��%�%�d�C��7�7��,�,�T�=�A� ��-�#�u��6�6rc�~�|ddk(rtj||�Stj|d�}|d|f�S)Nrrbrjr�)r�r�r�r�s rr�zNamespaceProxy.__delattr__qsA���q�6�S�=��%�%�d�C�0�0��,�,�T�=�A� ��-�#��0�0rN)r7r9r:r:r�r�r�r=rrr�r�es��B�I�6� 7� 1rr�c�R�eZdZdZd�Zd�Zeee�Zee j�Zy)� ValueProxy)r�r�c�$�|jd�S)Nr�rlr.s rr�zValueProxy.getzr�rc�(�|jd|f�Sr�rlr�s rr�zValueProxy.set|s�������x�0�0rN)r7r9r:r:r�r�rJr�rH�types�GenericAlias�__class_getitem__r=rrr�r�xs.���I�'�1��S�#��E�#�E�$6�$6�7�rr�� BaseListProxy)�__add__�__contains__�__delitem__�__getitem__�__len__�__mul__�__reversed__�__rmul__�__setitem__r\�count�extend�index�insertr��remove�reverser��__imul__c��eZdZd�Zd�Zy)� ListProxyc�,�|jd|f�|S)Nrrlr�s r�__iadd__zListProxy.__iadd__�s������E�8�,��rc�,�|jd|f�|S)Nr rlr�s rr zListProxy.__imul__�s������e�X�.��rN)r7r9r:rr r=rrrr�s���rr� DictProxy)r�r�r�r�r�rrOrBr�rrr��popitem� setdefaultr�rr��Iterator� ArrayProxy)r�r�r� PoolProxy)�apply�apply_asyncr��imap�imap_unorderedr��map� map_async�starmap� starmap_asyncr4�AsyncResult)rrrrrc��eZdZd�Zd�Zy)rc��|Srr=r.s rr,zPoolProxy.__enter__�r�rc�$�|j�yr)r4r.s rr2zPoolProxy.__exit__�s�����rN)r7r9r:r,r2r=rrrr�s���rc��eZdZdZy)ra( Subclass of `BaseManager` which supports a number of shared object types. The types registered are those intended for the synchronization of threads, plus `dict`, `list` and `Namespace`. The `multiprocessing.Manager()` function creates started instances of this class. N)r7r9r:r;r=rrrr�s��rr�Queue� JoinableQueuer�r~�RLock� Semaphore�BoundedSemaphore� Condition�Barrier�Poolr!r�r�)r�rE)rEc�>�eZdZdZgfd�Zd�Zd�Zd�Zd�Zd�Z d�Z y ) �_SharedMemoryTrackerz+Manages one or more shared memory segments.c� �||_||_yr��shared_memory_context_name� segment_names)r+r^r0s rr,z_SharedMemoryTracker.__init__�s��.2�D�+�!.�D�rc��tjd|�dt����|jj |�y)z6Adds the supplied shared memory block name to tracker.zRegister segment � in pid N)rr�rr0r\�r+�segment_names r�register_segmentz%_SharedMemoryTracker.register_segment�s3���J�J�*�<�*:�(�6�8�*�M�N����%�%�l�3rc���tjd|�dt����|jj |�tj|�}|j�|j�y)z�Calls unlink() on the shared memory block with the supplied name and removes it from the list of blocks being tracked.zDestroy segment r2N) rr�rr0rr�SharedMemoryr��unlink)r+r4�segments r�destroy_segmentz$_SharedMemoryTracker.destroy_segment�sX�� �J�J�)�,�)9��&�(��L�M����%�%�l�3�#�0�0��>�G��M�M�O��N�N�rc�N�|jddD]}|j|��y)z<Calls destroy_segment() on all tracked shared memory blocks.N)r0r:r3s rr8z_SharedMemoryTracker.unlink�s%�� $� 2� 2�1� 5���$�$�\�2�!6rc��tjd|jj�dt ����|j�y)NzCall z.__del__ in )rr�r6r7rr8r.s r�__del__z_SharedMemoryTracker.__del__�s1���J�J��t�~�~�6�6�7�|�F�H�:�N�O��K�K�Mrc�2�|j|jfSrr.r.s rr/z!_SharedMemoryTracker.__getstate__�s���3�3�T�5G�5G�H�Hrc�"�|j|�yr)r,r1s rr3z!_SharedMemoryTracker.__setstate__�s���D�M�M�5�!rN)r7r9r:r;r,r5r:r8r=r/r3r=rrr,r,�s,��5�/1� /� 4� � 3� � I� "rr,c�R�eZdZejgd�zZd�Zd�Zd�Zd�Zd�Z d�Z y) �SharedMemoryServer)� track_segment�release_segment� list_segmentsc��tj|g|��i|��|j}t|t�rtj|�}td|�dt����|_ tjdt����y)N�shm_rbz"SharedMemoryServer started by pid )rer,r(rNrt�os�fsdecoder,r�shared_memory_contextrr�)r+rE�kwargsr(s rr,zSharedMemoryServer.__init__sn���O�O�D�2�4�2�6�2��l�l�G��'�5�)��+�+�g�.��$�t�G�9�A�f�h�Z�%@�A� �&��J�J�;�F�H�:�F�Grc��t|j|dd�r|j|d<tj|||g|��i|��S)z�Create a new distributed-shared object (not backed by a shared memory block) and return its id to be used in a Proxy Object.ri�_shared_memory_proxyrI)r5rurIrerg)r+rCr'rErJs rrgzSharedMemoryServer.createsK���t�}�}�V�,�R�0�2H�I�26�2L�2L��.�/��=�=��q�&�B�4�B�6�B�Brc�b�|jj�tj||�S)zACall unlink() on all tracked shared memory, terminate the Server.)rIr8rerfr�s rrfzSharedMemoryServer.shutdowns%���&�&�-�-�/��?�?�4��+�+rc�:�|jj|�y)z?Adds the supplied shared memory block name to Server's tracker.N)rIr5�r+rCr4s rrBz SharedMemoryServer.track_segments���&�&�7�7��Erc�:�|jj|�y)z�Calls unlink() on the shared memory block with the supplied name and removes it from the tracker instance inside the Server.N)rIr:rOs rrCz"SharedMemoryServer.release_segment"s�� �&�&�6�6�|�Drc�.�|jjS)zbReturns a list of names of shared memory blocks that the Server is currently tracking.)rIr0r�s rrDz SharedMemoryServer.list_segments's���-�-�;�;�;rN)r7r9r:rer�r,rgrfrBrCrDr=rrrArAs6�����F�G�� H� C� ,� F� E� <rrAc�2�eZdZdZeZd�Zd�Zd�Zd�Z d�Z y)ra�Like SyncManager but uses SharedMemoryServer instead of Server. It provides methods for creating and returning SharedMemory instances and for creating a list-like object (ShareableList) backed by shared memory. It also provides methods that create and return Proxy Objects that support synchronization across processes (i.e. multi-process-safe locks and semaphores). c���tjdk(rddlm}|j �tj|g|��i|��tj|jj�dt����y)N�posixr )�resource_trackerz created by pid )rGr^�rU�ensure_runningrr,rr�r6r7r)r+rErJrUs rr,zSharedMemoryManager.__init__9s\���w�w�'�!�/� �/�/�1�� � ��7��7��7��J�J�$�.�.�1�1�2�2B�6�8�*�M�Nrc�p�tj|jj�dt ����y)Nz.__del__ by pid )rr�r6r7rr.s rr=zSharedMemoryManager.__del__Es'���J�J�$�.�.�1�1�2�2B�6�8�*�M�Nrc���|jjtjk7r�|jjtjk(rtd��|jjtjk(rtd��tdj|jj���|j|j|j|j|j�S)z@Better than monkeypatching for now; merge into Server ultimatelyz"Already started SharedMemoryServerz!SharedMemoryManager has shut downr�) r�r�r�r�r�r r�rQrr�r�r�r�r.s rr�zSharedMemoryManager.get_serverHs����{�{� � �E�M�M�1��;�;�$�$�� � �5�&�'K�L�L��[�[�&�&�%�.�.�8�&�'J�K�K�&�,�3�3�D�K�K�4E�4E�F�H�H��<�<����� � � $� � �t�/?�/?�A� Arc�,�|j|j|j��5}tjdd|��} t|dd|jf� ddd�|S#t$r}|j�|�d}~wwxYw#1swYSxYw)zoReturns a new SharedMemory instance with the specified size in bytes, to be tracked by the manager.rNT)rg�sizerB) r�r�r�rr7rIr^� BaseExceptionr8)r+r[r��smsr�s rr7z SharedMemoryManager.SharedMemoryUs������d�m�m�T�]�]��C�t�#�0�0��d��N����T�4��3�8�8�+�F�D��J��%���J�J�L��G���� D��J�s)�B �A&�& B�/B�B�B � Bc�N�|j|j|j��5}tj|�} t|dd|jjf� ddd�|S#t$r!}|jj�|�d}~wwxYw#1swYSxYw)z�Returns a new ShareableList instance populated with the values from the input sequence, to be tracked by the manager.rNrB) r�r�r�r� ShareableListrI�shmr^r\r8)r+r�r��slr�s rr_z!SharedMemoryManager.ShareableListas������d�m�m�T�]�]��C�t�"�0�0��:����T�4��2�6�6�;�;�.�I�D��I��%���F�F�M�M�O��G���� D��I�s(�B�#A-�- B�6B�B�B�B$N)r7r9r:r;rArr,r=r�r7r_r=rrrr-s*�� �%�� O� O� A� � rr�r�)W�__all__r�r}rr�queuer�r�rGrr�rrVr �contextrrr rrrrr� HAS_SHMEMr\�ImportErrorrrGrRrZ� view_typesr$� view_typer�rrIrBr�rSr`rcrer�r�r��XmlListener� XmlClientrxrr�rLrr{r�rCr�r�r�r�r�r�r�r�r�r�r�rrr;r� BasePoolProxyrrr#r�r~r%r&r'r(r)r*r!r�r,rAr)r^s0r�<module>rlsX��A���� ����� �� ��@�@�����*���I��N�N�(�)�2�� ���5�;�;��-�4M� N�4M�D�d�$�7�2�t�$�&�'�4M� N� ���I��I���y�/�2�� �z�M�F�M�.&(�b�)� I�C�)�C� �A�F*�V�F*�Z �F���#�#�Z�%6�%6�7��)�)�:�+?�+?�@���t'�&�t'�t�c��t=��t=�t:�*)+��,8<�7<��: E�� E� �F� �+�/�I�/� +�I� +��]��6 4�� 4�A�9�A�&1�Y�1�&8��8��o�0�� �� �� �+�(� � �� � � �� �<�*�� � �k�,�� � !��"�� �$� � �� �� �+� ����W�e�k�k�*����_�e�k�k�2����W�i�o�o�z�:����V�Y�^�^�]�;����W�i�o�o�}�=����[�)�"5�"5�}�E����'��)C�)C�"�$����[�)�"5�"5�~�F����Y� � 1� 1�<�@����V�T�Y�Y� �2����V�T�9�-����V�T�9�-����W�e�Z�0����W�e�Z�0����[�)�^�<����Z�=���N����]�%��8� �""�""�J*<�V�*<�Z>�k�>�g ��k%���I���Os�O;�P �;P�PPK:W�\4ϕ�A�A�&__pycache__/pool.cpython-312.opt-1.pycnu�[���� T��h����ddgZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl mZddl mZm Z ddlmZdZd Zd ZdZej(�Zd�Zd �ZGd�de�ZGd�d�Zd�ZGd�de�Z d#d�Zd�ZGd�de�Z Gd�de!�Z"Gd�de!�Z#e#Z$Gd�de#�Z%Gd�de!�Z&Gd �d!e&�Z'Gd"�de"�Z(y)$�Pool� ThreadPool�N�)�util)�get_context�TimeoutError)�wait�INIT�RUN�CLOSE� TERMINATEc�$�tt|��S�N)�list�map��argss �-/usr/lib64/python3.12/multiprocessing/pool.py�mapstarr/s����T� ���c�L�ttj|d|d��S)Nrr)r� itertools�starmaprs r�starmapstarr2s"��� �!�!�$�q�'�4��7�3�4�4rc��eZdZd�Zd�Zy)�RemoteTracebackc��||_yr��tb)�selfrs r�__init__zRemoteTraceback.__init__:s ����rc��|jSrr�r s r�__str__zRemoteTraceback.__str__<s���w�w�rN)�__name__� __module__�__qualname__r!r$�rrrr9s���rrc��eZdZd�Zd�Zy)�ExceptionWithTracebackc��tjt|�||�}dj|�}||_d|z|_y)N�z """ %s""")� traceback�format_exception�type�join�excr)r r1rs rr!zExceptionWithTraceback.__init__@s:�� � '� '��S� �3�� ;�� �W�W�R�[����� �2�%��rc�>�t|j|jffSr)�rebuild_excr1rr#s r� __reduce__z!ExceptionWithTraceback.__reduce__Es���T�X�X�t�w�w�/�/�/rN)r%r&r'r!r4r(rrr*r*?s��&� 0rr*c�&�t|�|_|Sr)r� __cause__)r1rs rr3r3Hs��#�B�'�C�M��Jrc�.��eZdZdZ�fd�Zd�Zd�Z�xZS)�MaybeEncodingErrorzVWraps possible unpickleable errors, so they can be safely sent through the socket.c���t|�|_t|�|_tt|�|j|j�yr)�reprr1�value�superr8r!)r r1r;� __class__s �rr!zMaybeEncodingError.__init__Ts3�����9����%�[�� � � �$�0����4�:�:�Frc�<�d|j�d|j�d�S)NzError sending result: 'z'. Reason: '�')r;r1r#s rr$zMaybeEncodingError.__str__Ys��=A�Z�Z�=A�X�X�G� Grc�<�d|jj�d|�d�S)N�<z: �>)r=r%r#s r�__repr__zMaybeEncodingError.__repr__]s��!�^�^�4�4�d�;�;r)r%r&r'�__doc__r!r$rC� __classcell__�r=s@rr8r8Ps���'�G� G�<rr8c�|�|�/t|t�r|dk\stdj|���|j}|j }t |d�r4|jj�|jj�|�||�d}|�|r`||kr[ |�} | �tjd�n;| \} }}} } d|| i|��f} || ||f�dx} x} x}x}x} }|dz }|��S|r||kr�[tjd |z�y#ttf$rtjd�Y�?wxYw#t$r.}|r|turt!||j"�}d|f}Yd}~��d}~wwxYw#t$r>}t%||d�}tjd |z�|| |d|ff�Yd}~��d}~wwxYw)NrzMaxtasks {!r} is not valid�_writerrz)worker got EOFError or OSError -- exitingzworker got sentinel -- exitingTFz0Possible encoding error while sending result: %szworker exiting after %d tasks)� isinstance�int�AssertionError�format�put�get�hasattrrH�close�_reader�EOFError�OSErrorr�debug� Exception�_helper_reraises_exceptionr*� __traceback__r8)�inqueue�outqueue�initializer�initargs�maxtasks�wrap_exceptionrMrN� completed�task�job�i�funcr�kwds�result�e�wrappeds r�workerrgas�����z�(�C�'@�+3�q�=��9�@�@��J�K�K� �,�,�C� �+�+�C��w� �"������������ ����X���I� � �x�I��,@� ��5�D� �<��J�J�7�8��#'� ��Q��d�D� ��D�$�/�$�/�0�F� ,���a�� �!�48�7��7�s�7�V�7�d�7�T�D��Q�� �7� �x�I��,@�8 �J�J�.��:�;��3�'�"� ��J�J�B�C�� ��� ��$�.H�"H�*�1�a�o�o�>���Q�Z�F�� ��� ,�(��F�1�I�6�G��J�J�I��� ���a�%��)�*�+�+�� ,�sB�D� D:�E4�$D7�6D7�: E1�$E,�,E1�4 F;�=4F6�6F;c��|�)z@Pickle-able helper function for use by _guarded_task_generation.r()�exs rrVrV�s�� �Hrc�2��eZdZdZdd��fd� Z�fd�Z�xZS)� _PoolCachez� Class that implements a cache for the Pool class that will notify the pool management threads every time the cache is emptied. The notification is done by the use of a queue that is provided when instantiating the cache. N��notifierc�2��||_t�|�|i|��yr)rmr<r!)r rmrrcr=s �rr!z_PoolCache.__init__�s��� �� � ���$�'�$�'rc�`��t�|�|�|s|jjd�yyr)r<�__delitem__rmrM)r �itemr=s �rrpz_PoolCache.__delitem__�s,��� ���D�!���M�M���d�#�r)r%r&r'rDr!rprErFs@rrkrk�s����+/�(� $� $rrkc��eZdZdZdZed��Z d(d�Zeje fd�Zd�Zd �Z ed ��Zed��Zd�Zed ��Zed��Zd�Zd�Zdifd�Zd)d�Zd)d�Z d*d�Zd�Zd+d�Zd+d�Zdiddfd�Z d*d�Z d*d�Zed)d��Ze d��Z!ed��Z"ed��Z#ed��Z$d �Z%d!�Z&d"�Z'd#�Z(ed$��Z)e d%��Z*d&�Z+d'�Z,y),rzS Class which supports an async version of applying functions to arguments. Tc�&�|j|i|��Sr��Process)�ctxrrcs rruzPool.Process�s���s�{�{�D�)�D�)�)rNr(c��g|_t|_|xs t�|_|j�t j�|_|jj�|_ t|j��|_||_||_ ||_|�tj �xsd}|dkrt#d��|� t%|t&�r|dkrt#d��|�t)|�st+d��||_ |j/�|j9�}t;j<t>j@|j|j|j|jB|j,|j|jD|jF|j|j|j|jH||jf��|_%d|jJ_&tN|jJ_|jJjQ�t;j<t>jR|j|jT|jF|j|jf��|_+d|jV_&tN|jV_|jVjQ�t;j<t>jX|jF|jZ|jf��|_.d|j\_&tN|j\_|j\jQ�t_j`||jb|j|jD|jF|j|j|jJ|jV|j\|jf d � �|_2tN|_y#t0$rQ|jD]}|j2��|j5��!|jD]}|j7���wxYw)Nrlrz&Number of processes must be at least 1rz/maxtasksperchild must be a positive int or Nonezinitializer must be a callable��targetrT�)r�exitpriority)3�_poolr �_stater�_ctx� _setup_queues�queue�SimpleQueue� _taskqueue�_change_notifierrk�_cache�_maxtasksperchild�_initializer� _initargs�os� cpu_count� ValueErrorrIrJ�callable� TypeError� _processes�_repopulate_poolrU�exitcode� terminater0�_get_sentinels� threading�Threadr�_handle_workersru�_inqueue� _outqueue�_wrap_exception�_worker_handler�daemonr�start� _handle_tasks� _quick_put� _task_handler�_handle_results� _quick_get�_result_handlerr�Finalize�_terminate_pool� _terminate)r � processesrZr[�maxtasksperchild�context�p� sentinelss rr!z Pool.__init__�sL���� �����,�{�}�� ������+�+�-���!%� � � 5� 5� 7��� �$�*?�*?�@���!1���'���!���������+�!�I��q�=��E�F�F��'��.��4�8H�A�8M� �!R�S�S��"�8�K�+@��<�=�=�#��� ��!�!�#��'�'�)� �(�/�/��'�'��+�+�t���� � �4�<�<��/�/�4�:�:�t�}�}�d�n�n��#�#�T�^�^�T�5K�5K��&�&� �4�3H�3H�J� ���'+����#�&)����#����"�"�$�'�-�-��%�%��/�/�4�?�?�D�N�N��*�*�d�k�k�+���� %)����!�$'����!���� � �"�(�/�/��'�'��.�.�$�/�/�4�;�;�?� ���'+����#�&)����#����"�"�$��-�-��$�&�&��/�/�4�=�=�$�.�.�$�*�*��'�'��)=�)=�t�?Q�?Q��&�&����5���������]� ��Z�Z���:�:�%��K�K�M� ��Z�Z������ �� �s� O'�'$Q�5Qc��|j|k(r<|d|��t|��t|dd��|jj d�yyy)Nz&unclosed running multiprocessing pool )�sourcer�)r}�ResourceWarning�getattrr�rM)r �_warnrs r�__del__zPool.__del__ sT���;�;�#���:�4�(�C�!�$� 0��t�/��6�B��%�%�)�)�$�/�C�rc ��|j}d|j�d|j�d|j�dt |j ��d� S)NrA�.z state=z pool_size=rB)r=r&r'r}�lenr|)r �clss rrCz Pool.__repr__sQ���n�n���C�N�N�#�1�S�%5�%5�$6�7���� �&� ����_�-�Q�0� 1rc�j�|jjg}|jjg}g|�|�Sr)r�rQr�)r �task_queue_sentinels�self_notifier_sentinelss rr�zPool._get_sentinelss<�� $��� 6� 6�7��#'�#8�#8�#@�#@�"A��@�%�@�(?�@�@rc�X�|D�cgc]}t|d�r|j��c}Scc}w)N�sentinel)rOr�)�workersrgs r�_get_worker_sentinelszPool._get_worker_sentinelss:���8��%+�"�6�:�6�����8� 8��8s�'c���d}ttt|���D]A}||}|j��t j d|z�|j �d}||=�C|S)z�Cleanup after any worker processes which have exited due to reaching their specified lifetime. Returns True if any workers were cleaned up. F�cleaning up worker %dT)�reversed�ranger�r�rrTr0)�pool�cleanedrargs r�_join_exited_workerszPool._join_exited_workers!sb�� ���%��D� �*�+�A��!�W�F����*�� � �2�Q�6�7���� �����G�,��rc��|j|j|j|j|j|j |j|j|j|j|j� Sr)�_repopulate_pool_staticr~rur�r|r�r�r�r�r�r�r#s rr�zPool._repopulate_pool1s_���+�+�D�I�I�t�|�|�,0�O�O�,0�J�J�� � �,0�N�N�D�<M�<M�,0�N�N�,0�,B�,B�,0�,@�,@� B� Brc �"�t|t|�z �D]u} ||t|||||| f��}|jj dd�|_d|_|j �|j|�tjd��wy)z�Bring the number of pool processes up to the specified number, for use after reaping workers which have exited. rxru� PoolWorkerTzadded workerN) r�r�rg�name�replacer�r��appendrrT)rvrur�r�rXrYrZr[r�r]ra�ws rr�zPool._repopulate_pool_static:s���y�3�t�9�,�-�A���F�%�x�)�&�(8�,�.�/�A� �V�V�^�^�I�|�<�A�F��A�H� �G�G�I��K�K��N��J�J�~�&�.rc �l�tj|�rtj|||||||||| � yy)zEClean up any exited workers and start replacements for them. N)rr�r�) rvrur�r�rXrYrZr[r�r]s r�_maintain_poolzPool._maintain_poolMs=���$�$�T�*��(�(��g�y�$�)0�(�K�)1�3C�)7� 9�+rc��|jj�|_|jj�|_|jjj |_|jjj|_ yr) r~r�r�r�rH�sendr�rQ�recvr�r#s rrzPool._setup_queuesYsX��� � �-�-�/�� ����.�.�0����-�-�/�/�4�4����.�.�0�0�5�5��rc�@�|jtk7rtd��y)NzPool not running)r}rr�r#s r�_check_runningzPool._check_running_s���;�;�#���/�0�0�rc�D�|j|||�j�S)zT Equivalent of `func(*args, **kwds)`. Pool must be running. )�apply_asyncrN)r rbrrcs r�applyz Pool.applycs"�� ����d�D�1�5�5�7�7rc�N�|j||t|�j�S)zx Apply `func` to each element in `iterable`, collecting the results in a list that is returned. )� _map_asyncrrN�r rb�iterable� chunksizes rrzPool.mapjs"�� ���t�X�w� �B�F�F�H�Hrc�N�|j||t|�j�S)z� Like `map()` method but the elements of the `iterable` are expected to be iterables as well and will be unpacked as arguments. Hence `func` and (a, b) becomes func(a, b). )r�rrNr�s rrzPool.starmapqs"�����t�X�{�I�F�J�J�L�Lrc�6�|j||t|||�S)z= Asynchronous version of `starmap()` method. )r�r�r rbr�r��callback�error_callbacks r� starmap_asynczPool.starmap_asyncys"�� ���t�X�{�I�'��9� 9rc#�K� d}t|�D]\}}||||fif���y#t$r}|dzt|fif��Yd}~yd}~wwxYw�w)z�Provides a generator of tasks for imap and imap_unordered with appropriate handling for iterables which throw exceptions during iteration.���rN)� enumeraterUrV)r � result_jobrbr�ra�xres r�_guarded_task_generationzPool._guarded_task_generation�s`���� J��A�!�(�+���1�!�1�d�Q�D�"�5�5�,��� J��q��s�$>���b�I�I�� J�s)�A�$�A� A�A�A�A�Ac���|j�|dk(rOt|�}|jj|j |j ||�|jf�|S|dkrtdj|���tj|||�}t|�}|jj|j |j t|�|jf�d�|D�S)zP Equivalent of `map()` -- can be MUCH slower than `Pool.map()`. rzChunksize must be 1+, not {0:n}c3�.K�|] }|D]}|����y�wrr(��.0�chunkrqs r� <genexpr>zPool.imap.<locals>.<genexpr>������?�f�U���D��D�f���)r��IMapIteratorr�rMr��_job�_set_lengthr�rLr� _get_tasksr�r rbr�r�rd�task_batchess r�imapz Pool.imap�s��� ������>�!�$�'�F��O�O����1�1�&�+�+�t�X�N��&�&�� � �M��1�}� �5�<�<�!�#�$�$� �?�?�4��9�E�L�!�$�'�F��O�O����1�1�&�+�+�29�2>�@��&�&� � �@�f�?�?rc���|j�|dk(rOt|�}|jj|j |j ||�|jf�|S|dkrtdj|���tj|||�}t|�}|jj|j |j t|�|jf�d�|D�S)zL Like `imap()` method but ordering of results is arbitrary. rzChunksize must be 1+, not {0!r}c3�.K�|] }|D]}|����y�wrr(r�s rr�z&Pool.imap_unordered.<locals>.<genexpr>�r�r�)r��IMapUnorderedIteratorr�rMr�r�r�r�rLrr�rr�s r�imap_unorderedzPool.imap_unordered�s��� ������>�*�4�0�F��O�O����1�1�&�+�+�t�X�N��&�&�� � �M��1�}� �5�<�<�Y�G�I�I��?�?�4��9�E�L�*�4�0�F��O�O����1�1�&�+�+�29�2>�@��&�&� � �@�f�?�?rc��|j�t|||�}|jj|jd|||fgdf�|S)z; Asynchronous version of `apply()` method. rN)r��ApplyResultr�rMr�)r rbrrcr�r�rds rr�zPool.apply_async�sL�� �����T�8�^�<�������v�{�{�A�t�T�4�@�A�4�H�I�� rc�6�|j||t|||�S)z9 Asynchronous version of `map()` method. )r�rr�s r� map_asynczPool.map_async�s"�� ���t�X�w� �8��� rc��|j�t|d�st|�}|�5tt |�t |j �dz�\}}|r|dz }t |�dk(rd}tj|||�}t||t |�||��} |jj|j| j||�df�| S)zY Helper function to implement map, starmap and their async counterparts. �__len__N�rr�r�) r�rOr�divmodr�r|rr�� MapResultr�rMr�r�) r rbr��mapperr�r�r��extrar�rds rr�zPool._map_async�s��� �����x��+��H�~�H���%�c�(�m�S����_�q�5H�I��I�u���Q�� ��x�=�A���I����t�X�y�A���4��C��M�8�*8�:��������-�-�f�k�k�.4�.:�<�� � �� rc��t||��|j�s"|j�|j�s�!yy)N)�timeout)r �emptyrN)r��change_notifierrs r�_wait_for_updateszPool._wait_for_updates�s2���Y��(�!�'�'�)����!�"�'�'�)rc��tj�}|jtk(s|r~|jtk7rk|j||||||| | ||� g|j |��| �}|j||�|jtk(r�U|r|jtk7r�k|jd�tjd�y)Nzworker handler exiting)r��current_threadr}rr r�r�rrMrrT)r��cache� taskqueuervrur�r�rXrYrZr[r�r]r�r�thread�current_sentinelss rr�zPool._handle_workers�s��� �)�)�+���m�m�s�"�u����)�1K����s�G�Y��g�'��h�/�� A�!O�#�";�";�D�"A� N�I� N���!�!�"3�_�E��m�m�s�"�u����)�1K� � � �d��� � �+�,rc�0�tj�}t|jd�D]}\}}d} |D]5}|jt k7rt jd�n> ||��7|r)t jd�|r|dnd}||dz� dx}x}} �v dx}x}} nt jd� t jd�|jd�t jd �|D] }|d�� t jd�y#t$r;} |dd\} } || j|d| f�n#t$rYnwxYwYd} ~ ��+d} ~ wwxYw#dx}x}} wxYw#t$rt jd �Y��wxYw)Nz'task handler found thread._state != RUN�Fzdoing set_length()rr�ztask handler got sentinelz/task handler sending sentinel to result handlerz(task handler sending sentinel to workersz/task handler got OSError when sending sentinelsztask handler exiting) r�r �iterrNr}rrrTrU�_set�KeyErrorrMrS) rrMrYr�r r�taskseq� set_lengthr_rer`�idxr�s rr�zPool._handle_taskss����)�)�+��#'� � � �t�#<��G�Z��D� ,�#�D��}�}��+�� � �#L�M��!��D� �$�"�� � �#7�8�)-�d�1�g�2��"�3��7�+��(,�+��+�w���'+�+��+�w��1$=�4 �J�J�2�3� J��J�J�H�I��L�L��� �J�J�A�B����D� �� � � �)�*��=%�!�#'���8���S�!�!�#�J�O�O�C�%���<��'�!� �!��� !��(,�+��+�w���� J��J�J�H�I� J�sl�/E)�$D"�,-E)�A E4�" E&�+E!�4E�E!� E �E!�E �E!�E)�!E&�&E)�)E1�4F�Fc���tj�} |�}|jtk7rt j d�n;|�t j d�n#|\}}} ||j||�dx}x}}�l|rk|jtk7rX |�}|�t j d��5|\}}} ||j||�dx}x}}|r|jtk7r�Xt|d�rIt j d� td�D]%}|jj�sn |��'t j dt|�|j�y#ttf$rt j d�YywxYw#t$rY��*wxYw#ttf$rt j d�YywxYw#t$rY��wxYw#ttf$rY��wxYw) Nz.result handler got EOFError/OSError -- exitingz,result handler found thread._state=TERMINATEzresult handler got sentinelz&result handler ignoring extra sentinelrQz"ensuring that outqueue is not full� z7result handler exiting: len(cache)=%s, thread._state=%s)r�r rSrRrrTr}rrrr rOr�rQ�pollr�)rYrNr rr_r`ra�objs rr�zPool._handle_results=s����)�)�+��� ��u�� �}�}��#�� � �I�J���|�� � �8�9���K�C��C� ��c� ����3�'� $�#�D�#�3��+�.�� � ��2� ��u�� �|�� � �C�D���K�C��C� ��c� ����3�'� $�#�D�#�3���� � ��2�"�8�Y�'��J�J�;�<� ��r��A�#�+�+�0�0�2���E�#� � � �L��%�j�&�-�-� )��e�X�&� �� � �K�L�� �� � �� ���X�&� �� � �K�L�� ��� �� ���X�&� �� �sY�E/�&F�F)�>G�3G#�/$F�F� F&�%F&�)$G�G� G �G �#G5�4G5c#�tK�t|�} ttj||��}|sy||f���)�wr)r�tupler�islice)rb�it�sizer�s rr�zPool._get_tasksys=���� �"�X����i�&�&�r�4�0�1�A�����)�O� �s�68c��td��)Nz:pool objects cannot be passed between processes or pickled)�NotImplementedErrorr#s rr4zPool.__reduce__�s��!�J�� rc���tjd�|jtk(r<t|_t|j _|jjd�yy)Nzclosing pool)rrTr}rrr�r�rMr#s rrPz Pool.close�sH��� � �>�"��;�;�#���D�K�*/�D� � �'��!�!�%�%�d�+�rc�d�tjd�t|_|j �y)Nzterminating pool)rrTr r}r�r#s rr�zPool.terminate�s ��� � �%�&�������rc��tjd�|jtk(rt d��|jt tfvrt d��|jj�|jj�|jj�|jD]}|j��y)Nzjoining poolzPool is still runningzIn unknown state)rrTr}rr�rr r�r0r�r�r|)r r�s rr0z Pool.join�s���� � �>�"��;�;�#���4�5�5� �[�[�� � 2� 2��/�0�0����!�!�#������!����!�!�#����A� �F�F�H�rc�p�tjd�|jj�|j �rw|j j �r\|j j�tjd�|j �r|j j �r�Zyyyy)Nz7removing tasks from inqueue until task handler finishedr) rrT�_rlock�acquire�is_aliverQrr��time�sleep)rX�task_handlerrs r�_help_stuff_finishzPool._help_stuff_finish�s}�� � � �L�M������ ��#�#�%�'�/�/�*>�*>�*@��O�O� � �"��J�J�q�M��#�#�%�'�/�/�*>�*>�*@�%�*@�%rc �d�tjd�t|_|j d�t|_tjd�|j||t |��|j�st | �dk7rtd��t|_|j d�|j d�tjd�tj�|ur|j�|rHt|dd�r9tjd�|D]} | j��| j��!tjd�tj�|ur|j�tjd �tj�|ur|j�|rpt|dd�r`tjd �|D]E} | j�s�tjd| jz�| j��Gyyy)Nzfinalizing poolz&helping task handler/workers to finishrz/Cannot have cache with result_handler not alivezjoining worker handlerr�zterminating workerszjoining task handlerzjoining result handlerzjoining pool workersr�)rrTr r}rMr+r�r'rKr�r r0rOr�r��pid)r�rrXrYr�r�worker_handlerr*�result_handlerr r�s rr�zPool._terminate_pool�s��� � � �$�%� !*������D�!�'���� � �;�<����w��c�$�i�@��'�'�)��E� �a�� �A�C� C�!*������D�!����T�� � � �+�,��#�#�%�^�;����!��G�D��G�[�1��J�J�,�-����:�:�%��K�K�M�� � � �)�*��#�#�%�\�9������ � �+�,��#�#�%�^�;����!��G�D��G�[�1��J�J�-�.����:�:�<��J�J�6����>�?��F�F�H� �2�4rc�&�|j�|Sr)r�r#s r� __enter__zPool.__enter__�s�������rc�$�|j�yr)r�)r �exc_type�exc_val�exc_tbs r�__exit__z Pool.__exit__�s�����r)NNr(NNr)NNN)r)-r%r&r'rDr��staticmethodrur!�warnings�warnrr�rCr�r�r�r�r�r�rr�r�rrr�r�r�r�r�r�r�r�classmethodr�r�r�r�r4rPr�r0r+r�r1r6r(rrrr�s�����O��*��*�CE�04�O�f%�M�M�s�0�1�A� �8��8�� �� �B��'��'�$� 9�� 9�6�1� "��8�I�M�FJ��9� J�@�:@�8&(�b�4���BF���KO���:�"��"� �-��-�(�++��++�Z�9)��9)�v����� ,�� ������3��3�j�rc�X�eZdZd�Zd�Zd�Zdd�Zdd�Zd�Ze e j�Zy) r�c���||_tj�|_t t �|_|j|_||_||_ ||j|j<yr) r|r��Event�_event�next�job_counterr�r�� _callback�_error_callback)r r�r�r�s rr!zApplyResult.__init__�sO���� ��o�o�'�����%�� ��k�k���!���-���!%����D�I�I�rc�6�|jj�Sr)r>�is_setr#s r�readyzApplyResult.ready�s���{�{�!�!�#�#rc�n�|j�stdj|���|jS)Nz{0!r} not ready)rEr�rL�_successr#s r� successfulzApplyResult.successful�s,���z�z�|��.�5�5�d�;�<�<��}�}�rNc�:�|jj|�yr)r>r �r rs rr zApplyResult.wait�s��������!rc��|j|�|j�st�|jr|jS|j�r)r rErrG�_valuerJs rrNzApplyResult.get�s8��� � �'���z�z�|����=�=��;�;���+�+�rc�^�|\|_|_|jr'|jr|j|j�|jr'|js|j|j�|jj�|j|j=d|_yr) rGrLrArBr>�setr�r�r|�r rars rrzApplyResult._setss��%(�"�� �t�{��>�>�d�m�m��N�N�4�;�;�'����� � �� � ����-��������K�K�� � �"��� rr) r%r&r'r!rErHr rNrr:�types�GenericAlias�__class_getitem__r(rrr�r��s3��&�$�� "���$�E�$6�$6�7�rr�c��eZdZd�Zd�Zy)rc��tj||||��d|_dg|z|_||_|dkr9d|_|jj�|j|j=y||zt||z�z|_y)Nr�Tr)r�r!rGrL� _chunksize�_number_leftr>rNr�r��bool)r r�r��lengthr�r�s rr!zMapResult.__init__s������T�4��,:� � <��� ��f�v�o���#�����>� !�D���K�K�O�O�����D�I�I�&� &� � 1�D��)�9K�4L� L�D�rc��|xjdzc_|\}}|r�|jr�||j||jz|dz|jz|jdk(r`|jr|j |j�|j |j=|jj�d|_ yy|s|jrd|_||_|jdk(r`|jr|j|j�|j |j=|jj�d|_ yy)NrrF)rVrGrLrUrAr�r�r>rNr|rB)r ra�success_result�successrds rrzMapResult._set)s�����Q���(�����t�}�}�CI�D�K�K��$�/�/�)�1�Q�3����*?�@�� � �A�%��>�>��N�N�4�;�;�/��K�K�� � �*������!�!�� �&��t�}�}� %�� �$���� � �A�%��'�'��(�(����5��K�K�� � �*������!�!�� � &rN)r%r&r'r!rr(rrrrs ��M�"rrc�0�eZdZd�Zd�Zdd�ZeZd�Zd�Zy)r�c�B�||_tjtj��|_tt�|_|j|_tj�|_d|_d|_ i|_||j|j<y)Nr)r|r�� Condition�Lock�_condr?r@r�r��collections�deque�_items�_index�_length� _unsorted)r r�s rr!zIMapIterator.__init__Gsp���� ��(�(����)9�:�� ���%�� ��k�k���!�'�'�)������������!%����D�I�I�rc��|Srr(r#s r�__iter__zIMapIterator.__iter__Rs���rNc���|j5 |jj�}ddd�\}}|r|S|�#t$r�|j|j k(rd|_td�|jj|� |jj�}n;#t$r/|j|j k(rd|_td�td�wxYwY��wxYw#1swY��xYwr) r`rc�popleft� IndexErrorrdrer|� StopIterationr r)r rrqr[r;s rr?zIMapIterator.nextUs��� �Z�Z� 1��{�{�*�*�,��� ������L����!� 1��;�;�$�,�,�.�!%�D�J�'�T�1�� � ����(�1��;�;�.�.�0�D��!�1��{�{�d�l�l�2�%)�� �+��5�&�D�0� 1��� 1���Z�s?�C$�<�AC!�B#�"C!�#8C�C!�C$� C!�!C$�$C-c��|j5|j|k(r�|jj|�|xjdz c_|j|jvrn|jj|j�}|jj|�|xjdz c_|j|jvr�n|jj �n||j|<|j|jk(r|j|j=d|_ ddd�y#1swYyxYw�Nr)r`rdrcr�rf�pop�notifyrer�r�r|rOs rrzIMapIterator._setms��� �Z�Z��{�{�a�����"�"�3�'����q� ���k�k�T�^�^�3��.�.�,�,�T�[�[�9�C��K�K�&�&�s�+��K�K�1�$�K��k�k�T�^�^�3�� � �!�!�#�$'����q�!��{�{�d�l�l�*��K�K�� � �*�!�� ��Z�Z�s�CD=�A!D=�=Ec��|j5||_|j|jk(r8|jj�|j|j =d|_ddd�y#1swYyxYwr)r`rerdrpr�r�r|)r rXs rr�zIMapIterator._set_length~sQ�� �Z�Z�!�D�L��{�{�d�l�l�*�� � �!�!�#��K�K�� � �*�!�� ��Z�Z�s�AA/�/A8r) r%r&r'r!rhr?�__next__rr�r(rrr�r�Es"�� &���,�H�"�""rr�c��eZdZd�Zy)r�c�H�|j5|jj|�|xjdz c_|jj �|j|j k(r|j|j=d|_ddd�y#1swYyxYwrn) r`rcr�rdrprer�r�r|rOs rrzIMapUnorderedIterator._set�sj�� �Z�Z��K�K���s�#��K�K�1��K��J�J�����{�{�d�l�l�*��K�K�� � �*�!�� � �Z�Z�s�BB�B!N)r%r&r'rr(rrr�r��s��"rr�c�Z�eZdZdZed��Zd d�Zd�Zd�Zed��Z ed��Z d �Zy)rFc��ddlm}||i|��S)Nrrt)�dummyru)rvrrcrus rruzThreadPool.Process�s��"���%��%�%rNc�4�tj||||�yr)rr!)r r�rZr[s rr!zThreadPool.__init__�s��� � �d�I�{�H�=rc���tj�|_tj�|_|jj|_|jj|_yr)r�r�r�r�rMr�rNr�r#s rrzThreadPool._setup_queues�sD���)�)�+�� ��*�*�,����-�-�+�+����.�.�,�,��rc�0�|jjgSr)r�rQr#s rr�zThreadPool._get_sentinels�s���%�%�-�-�.�.rc��gSrr()r�s rr�z ThreadPool._get_worker_sentinels�s��� rc�� |jd���#tj$rYnwxYwt|�D]}|j d��y)NF)�block)rNr��Emptyr�rM)rXr*rras rr+zThreadPool._help_stuff_finish�sM�� �����%��(����{�{� �� ���t��A��K�K���s��,�,c�.�tj|�yr)r(r))r r�rrs rrzThreadPool._wait_for_updates�s��� � �7�r)NNr()r%r&r'r�r7rur!rr�r�r+rr(rrrr�sU���O��&��&�>�-�/���������r)Nr(NF))�__all__rarr�r�r�r(r-rPr8r,rrr� connectionr r rrr �countr@rrrUrr*r3r8rgrV�dictrk�objectrr��AsyncResultrr�r�rr(rr�<module>r�s���<� ���� ��������'��������� ��i�o�o����5��i��0�0��<��<�"GK��+<�Z �$��$�.v�6�v�x)8�&�)8�V��%"��%"�V?"�6�?"�J "�L� "�$��$rPK:W�\��"c�c�&__pycache__/pool.cpython-312.opt-2.pycnu�[���� T��h����ddgZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl mZddl mZm Z ddlmZdZd Zd ZdZej(�Zd�Zd �ZGd�de�ZGd�d�Zd�ZGd�de�Z d#d�Zd�ZGd�de�Z Gd�de!�Z"Gd�de!�Z#e#Z$Gd�de#�Z%Gd�de!�Z&Gd �d!e&�Z'Gd"�de"�Z(y)$�Pool� ThreadPool�N�)�util)�get_context�TimeoutError)�wait�INIT�RUN�CLOSE� TERMINATEc�$�tt|��S�N)�list�map��argss �-/usr/lib64/python3.12/multiprocessing/pool.py�mapstarr/s����T� ���c�L�ttj|d|d��S)Nrr)r� itertools�starmaprs r�starmapstarr2s"��� �!�!�$�q�'�4��7�3�4�4rc��eZdZd�Zd�Zy)�RemoteTracebackc��||_yr��tb)�selfrs r�__init__zRemoteTraceback.__init__:s ����rc��|jSrr�r s r�__str__zRemoteTraceback.__str__<s���w�w�rN)�__name__� __module__�__qualname__r!r$�rrrr9s���rrc��eZdZd�Zd�Zy)�ExceptionWithTracebackc��tjt|�||�}dj|�}||_d|z|_y)N�z """ %s""")� traceback�format_exception�type�join�excr)r r1rs rr!zExceptionWithTraceback.__init__@s:�� � '� '��S� �3�� ;�� �W�W�R�[����� �2�%��rc�>�t|j|jffSr)�rebuild_excr1rr#s r� __reduce__z!ExceptionWithTraceback.__reduce__Es���T�X�X�t�w�w�/�/�/rN)r%r&r'r!r4r(rrr*r*?s��&� 0rr*c�&�t|�|_|Sr)r� __cause__)r1rs rr3r3Hs��#�B�'�C�M��Jrc�,��eZdZ �fd�Zd�Zd�Z�xZS)�MaybeEncodingErrorc���t|�|_t|�|_tt|�|j|j�yr)�reprr1�value�superr8r!)r r1r;� __class__s �rr!zMaybeEncodingError.__init__Ts3�����9����%�[�� � � �$�0����4�:�:�Frc�<�d|j�d|j�d�S)NzError sending result: 'z'. Reason: '�')r;r1r#s rr$zMaybeEncodingError.__str__Ys��=A�Z�Z�=A�X�X�G� Grc�<�d|jj�d|�d�S)N�<z: �>)r=r%r#s r�__repr__zMaybeEncodingError.__repr__]s��!�^�^�4�4�d�;�;r)r%r&r'r!r$rC� __classcell__�r=s@rr8r8Ps���'�G� G�<rr8c�|�|�/t|t�r|dk\stdj|���|j}|j }t |d�r4|jj�|jj�|�||�d}|�|r`||kr[ |�} | �tjd�n;| \} }}} } d|| i|��f} || ||f�dx} x} x}x}x} }|dz }|��S|r||kr�[tjd |z�y#ttf$rtjd�Y�?wxYw#t$r.}|r|turt!||j"�}d|f}Yd}~��d}~wwxYw#t$r>}t%||d�}tjd |z�|| |d|ff�Yd}~��d}~wwxYw)NrzMaxtasks {!r} is not valid�_writerrz)worker got EOFError or OSError -- exitingzworker got sentinel -- exitingTFz0Possible encoding error while sending result: %szworker exiting after %d tasks)� isinstance�int�AssertionError�format�put�get�hasattrrG�close�_reader�EOFError�OSErrorr�debug� Exception�_helper_reraises_exceptionr*� __traceback__r8)�inqueue�outqueue�initializer�initargs�maxtasks�wrap_exceptionrLrM� completed�task�job�i�funcr�kwds�result�e�wrappeds r�workerrfas�����z�(�C�'@�+3�q�=��9�@�@��J�K�K� �,�,�C� �+�+�C��w� �"������������ ����X���I� � �x�I��,@� ��5�D� �<��J�J�7�8��#'� ��Q��d�D� ��D�$�/�$�/�0�F� ,���a�� �!�48�7��7�s�7�V�7�d�7�T�D��Q�� �7� �x�I��,@�8 �J�J�.��:�;��3�'�"� ��J�J�B�C�� ��� ��$�.H�"H�*�1�a�o�o�>���Q�Z�F�� ��� ,�(��F�1�I�6�G��J�J�I��� ���a�%��)�*�+�+�� ,�sB�D� D:�E4�$D7�6D7�: E1�$E,�,E1�4 F;�=4F6�6F;c�� |�rr()�exs rrUrU�s ��F� �Hrc�0��eZdZ dd��fd� Z�fd�Z�xZS)� _PoolCacheN��notifierc�2��||_t�|�|i|��yr)rlr<r!)r rlrrbr=s �rr!z_PoolCache.__init__�s��� �� � ���$�'�$�'rc�`��t�|�|�|s|jjd�yyr)r<�__delitem__rlrL)r �itemr=s �rroz_PoolCache.__delitem__�s,��� ���D�!���M�M���d�#�r)r%r&r'r!rorDrEs@rrjrj�s����+/�(� $� $rrjc��eZdZ dZed��Z d'd�Zeje fd�Z d�Zd�Zed ��Z ed ��Zd�Zed��Zed ��Zd�Zd�Zdifd�Zd(d�Zd(d�Z d)d�Zd�Zd*d�Zd*d�Zdiddfd�Z d)d�Z d)d�Zed(d��Zed��Z ed��Z!ed��Z"ed��Z#d�Z$d �Z%d!�Z&d"�Z'ed#��Z(ed$��Z)d%�Z*d&�Z+y)+rTc�&�|j|i|��Sr��Process)�ctxrrbs rrtzPool.Process�s���s�{�{�D�)�D�)�)rNr(c��g|_t|_|xs t�|_|j�t j�|_|jj�|_ t|j��|_||_||_ ||_|�tj �xsd}|dkrt#d��|� t%|t&�r|dkrt#d��|�t)|�st+d��||_ |j/�|j9�}t;j<t>j@|j|j|j|jB|j,|j|jD|jF|j|j|j|jH||jf��|_%d|jJ_&tN|jJ_|jJjQ�t;j<t>jR|j|jT|jF|j|jf��|_+d|jV_&tN|jV_|jVjQ�t;j<t>jX|jF|jZ|jf��|_.d|j\_&tN|j\_|j\jQ�t_j`||jb|j|jD|jF|j|j|jJ|jV|j\|jf d � �|_2tN|_y#t0$rQ|jD]}|j2��|j5��!|jD]}|j7���wxYw)Nrkrz&Number of processes must be at least 1rz/maxtasksperchild must be a positive int or Nonezinitializer must be a callable��targetrT�)r�exitpriority)3�_poolr �_stater�_ctx� _setup_queues�queue�SimpleQueue� _taskqueue�_change_notifierrj�_cache�_maxtasksperchild�_initializer� _initargs�os� cpu_count� ValueErrorrHrI�callable� TypeError� _processes�_repopulate_poolrT�exitcode� terminater0�_get_sentinels� threading�Threadr�_handle_workersrt�_inqueue� _outqueue�_wrap_exception�_worker_handler�daemonr�start� _handle_tasks� _quick_put� _task_handler�_handle_results� _quick_get�_result_handlerr�Finalize�_terminate_pool� _terminate)r � processesrYrZ�maxtasksperchild�context�p� sentinelss rr!z Pool.__init__�sL���� �����,�{�}�� ������+�+�-���!%� � � 5� 5� 7��� �$�*?�*?�@���!1���'���!���������+�!�I��q�=��E�F�F��'��.��4�8H�A�8M� �!R�S�S��"�8�K�+@��<�=�=�#��� ��!�!�#��'�'�)� �(�/�/��'�'��+�+�t���� � �4�<�<��/�/�4�:�:�t�}�}�d�n�n��#�#�T�^�^�T�5K�5K��&�&� �4�3H�3H�J� ���'+����#�&)����#����"�"�$�'�-�-��%�%��/�/�4�?�?�D�N�N��*�*�d�k�k�+���� %)����!�$'����!���� � �"�(�/�/��'�'��.�.�$�/�/�4�;�;�?� ���'+����#�&)����#����"�"�$��-�-��$�&�&��/�/�4�=�=�$�.�.�$�*�*��'�'��)=�)=�t�?Q�?Q��&�&����5���������]� ��Z�Z���:�:�%��K�K�M� ��Z�Z������ �� �s� O'�'$Q�5Qc��|j|k(r<|d|��t|��t|dd��|jj d�yyy)Nz&unclosed running multiprocessing pool )�sourcer�)r|�ResourceWarning�getattrr�rL)r �_warnrs r�__del__zPool.__del__ sT���;�;�#���:�4�(�C�!�$� 0��t�/��6�B��%�%�)�)�$�/�C�rc ��|j}d|j�d|j�d|j�dt |j ��d� S)NrA�.z state=z pool_size=rB)r=r&r'r|�lenr{)r �clss rrCz Pool.__repr__sQ���n�n���C�N�N�#�1�S�%5�%5�$6�7���� �&� ����_�-�Q�0� 1rc�j�|jjg}|jjg}g|�|�Sr)r�rPr�)r �task_queue_sentinels�self_notifier_sentinelss rr�zPool._get_sentinelss<�� $��� 6� 6�7��#'�#8�#8�#@�#@�"A��@�%�@�(?�@�@rc�X�|D�cgc]}t|d�r|j��c}Scc}w)N�sentinel)rNr�)�workersrfs r�_get_worker_sentinelszPool._get_worker_sentinelss:���8��%+�"�6�:�6�����8� 8��8s�'c��� d}ttt|���D]A}||}|j��t j d|z�|j �d}||=�C|S)NF�cleaning up worker %dT)�reversed�ranger�r�rrSr0)�pool�cleanedr`rfs r�_join_exited_workerszPool._join_exited_workers!sg�� ����%��D� �*�+�A��!�W�F����*�� � �2�Q�6�7���� �����G�,��rc��|j|j|j|j|j|j |j|j|j|j|j� Sr)�_repopulate_pool_staticr}rtr�r{r�r�r�r�r�r�r#s rr�zPool._repopulate_pool1s_���+�+�D�I�I�t�|�|�,0�O�O�,0�J�J�� � �,0�N�N�D�<M�<M�,0�N�N�,0�,B�,B�,0�,@�,@� B� Brc �$� t|t|�z �D]u} ||t|||||| f��}|jj dd�|_d|_|j �|j|�tjd��wy)Nrwrt� PoolWorkerTzadded worker) r�r�rf�name�replacer�r��appendrrS)rurtr�r�rWrXrYrZr�r\r`�ws rr�zPool._repopulate_pool_static:s��� ��y�3�t�9�,�-�A���F�%�x�)�&�(8�,�.�/�A� �V�V�^�^�I�|�<�A�F��A�H� �G�G�I��K�K��N��J�J�~�&�.rc �n� tj|�rtj|||||||||| � yyr)rr�r�) rurtr�r�rWrXrYrZr�r\s r�_maintain_poolzPool._maintain_poolMs@�� ��$�$�T�*��(�(��g�y�$�)0�(�K�)1�3C�)7� 9�+rc��|jj�|_|jj�|_|jjj |_|jjj|_ yr) r}r�r�r�rG�sendr�rP�recvr�r#s rr~zPool._setup_queuesYsX��� � �-�-�/�� ����.�.�0����-�-�/�/�4�4����.�.�0�0�5�5��rc�@�|jtk7rtd��y)NzPool not running)r|rr�r#s r�_check_runningzPool._check_running_s���;�;�#���/�0�0�rc�F� |j|||�j�Sr)�apply_asyncrM)r rarrbs r�applyz Pool.applycs'�� �����d�D�1�5�5�7�7rc�P� |j||t|�j�Sr)� _map_asyncrrM�r ra�iterable� chunksizes rrzPool.mapjs'�� ����t�X�w� �B�F�F�H�Hrc�P� |j||t|�j�Sr)r�rrMr�s rrzPool.starmapqs'�� � ���t�X�{�I�F�J�J�L�Lrc�8� |j||t|||�Sr)r�r�r rar�r��callback�error_callbacks r� starmap_asynczPool.starmap_asyncys'�� ����t�X�{�I�'��9� 9rc#�K� d}t|�D]\}}||||fif���y#t$r}|dzt|fif��Yd}~yd}~wwxYw�w)N���r)� enumeraterTrU)r � result_jobrar�r`�xrds r�_guarded_task_generationzPool._guarded_task_generation�se���� � J��A�!�(�+���1�!�1�d�Q�D�"�5�5�,��� J��q��s�$>���b�I�I�� J�s)�A�%�A� A �A�A�A � Ac��� |j�|dk(rOt|�}|jj|j |j ||�|jf�|S|dkrtdj|���tj|||�}t|�}|jj|j |j t|�|jf�d�|D�S)NrzChunksize must be 1+, not {0:n}c3�.K�|] }|D]}|����y�wrr(��.0�chunkrps r� <genexpr>zPool.imap.<locals>.<genexpr>������?�f�U���D��D�f���)r��IMapIteratorr�rLr��_job�_set_lengthr�rKr� _get_tasksr�r rar�r�rc�task_batchess r�imapz Pool.imap�s��� � ������>�!�$�'�F��O�O����1�1�&�+�+�t�X�N��&�&�� � �M��1�}� �5�<�<�!�#�$�$� �?�?�4��9�E�L�!�$�'�F��O�O����1�1�&�+�+�29�2>�@��&�&� � �@�f�?�?rc��� |j�|dk(rOt|�}|jj|j |j ||�|jf�|S|dkrtdj|���tj|||�}t|�}|jj|j |j t|�|jf�d�|D�S)NrzChunksize must be 1+, not {0!r}c3�.K�|] }|D]}|����y�wrr(r�s rr�z&Pool.imap_unordered.<locals>.<genexpr>�r�r�)r��IMapUnorderedIteratorr�rLr�r�r�r�rKrr�rr�s r�imap_unorderedzPool.imap_unordered�s��� � ������>�*�4�0�F��O�O����1�1�&�+�+�t�X�N��&�&�� � �M��1�}� �5�<�<�Y�G�I�I��?�?�4��9�E�L�*�4�0�F��O�O����1�1�&�+�+�29�2>�@��&�&� � �@�f�?�?rc�� |j�t|||�}|jj|jd|||fgdf�|S�Nr)r��ApplyResultr�rLr�)r rarrbr�r�rcs rr�zPool.apply_async�sQ�� � �����T�8�^�<�������v�{�{�A�t�T�4�@�A�4�H�I�� rc�8� |j||t|||�Sr)r�rr�s r� map_asynczPool.map_async�s'�� ����t�X�w� �8��� rc�� |j�t|d�st|�}|�5tt |�t |j �dz�\}}|r|dz }t |�dk(rd}tj|||�}t||t |�||��} |jj|j| j||�df�| S)N�__len__�rr�r�) r�rNr�divmodr�r{rr�� MapResultr�rLr�r�) r rar��mapperr�r�r��extrar�rcs rr�zPool._map_async�s��� � �����x��+��H�~�H���%�c�(�m�S����_�q�5H�I��I�u���Q�� ��x�=�A���I����t�X�y�A���4��C��M�8�*8�:��������-�-�f�k�k�.4�.:�<�� � �� rc��t||��|j�s"|j�|j�s�!yy)N)�timeout)r �emptyrM)r��change_notifierrs r�_wait_for_updateszPool._wait_for_updates�s2���Y��(�!�'�'�)����!�"�'�'�)rc��tj�}|jtk(s|r~|jtk7rk|j||||||| | ||� g|j |��| �}|j||�|jtk(r�U|r|jtk7r�k|jd�tjd�y)Nzworker handler exiting)r��current_threadr|rr r�r�rrLrrS)r��cache� taskqueuerurtr�r�rWrXrYrZr�r\r�r�thread�current_sentinelss rr�zPool._handle_workers�s��� �)�)�+���m�m�s�"�u����)�1K����s�G�Y��g�'��h�/�� A�!O�#�";�";�D�"A� N�I� N���!�!�"3�_�E��m�m�s�"�u����)�1K� � � �d��� � �+�,rc�0�tj�}t|jd�D]}\}}d} |D]5}|jt k7rt jd�n> ||��7|r)t jd�|r|dnd}||dz� dx}x}} �v dx}x}} nt jd� t jd�|jd�t jd �|D] }|d�� t jd�y#t$r;} |dd\} } || j|d| f�n#t$rYnwxYwYd} ~ ��+d} ~ wwxYw#dx}x}} wxYw#t$rt jd �Y��wxYw)Nz'task handler found thread._state != RUN�Fzdoing set_length()rr�ztask handler got sentinelz/task handler sending sentinel to result handlerz(task handler sending sentinel to workersz/task handler got OSError when sending sentinelsztask handler exiting) r�r �iterrMr|rrrSrT�_set�KeyErrorrLrR) rrLrXr�r r�taskseq� set_lengthr^rdr_�idxr�s rr�zPool._handle_taskss����)�)�+��#'� � � �t�#<��G�Z��D� ,�#�D��}�}��+�� � �#L�M��!��D� �$�"�� � �#7�8�)-�d�1�g�2��"�3��7�+��(,�+��+�w���'+�+��+�w��1$=�4 �J�J�2�3� J��J�J�H�I��L�L��� �J�J�A�B����D� �� � � �)�*��=%�!�#'���8���S�!�!�#�J�O�O�C�%���<��'�!� �!��� !��(,�+��+�w���� J��J�J�H�I� J�sl�/E)�$D"�,-E)�A E4�" E&�+E!�4E�E!� E �E!�E �E!�E)�!E&�&E)�)E1�4F�Fc���tj�} |�}|jtk7rt j d�n;|�t j d�n#|\}}} ||j||�dx}x}}�l|rk|jtk7rX |�}|�t j d��5|\}}} ||j||�dx}x}}|r|jtk7r�Xt|d�rIt j d� td�D]%}|jj�sn |��'t j dt|�|j�y#ttf$rt j d�YywxYw#t$rY��*wxYw#ttf$rt j d�YywxYw#t$rY��wxYw#ttf$rY��wxYw) Nz.result handler got EOFError/OSError -- exitingz,result handler found thread._state=TERMINATEzresult handler got sentinelz&result handler ignoring extra sentinelrPz"ensuring that outqueue is not full� z7result handler exiting: len(cache)=%s, thread._state=%s)r�r rRrQrrSr|rrrr rNr�rP�pollr�)rXrMr rr^r_r`�objs rr�zPool._handle_results=s����)�)�+��� ��u�� �}�}��#�� � �I�J���|�� � �8�9���K�C��C� ��c� ����3�'� $�#�D�#�3��+�.�� � ��2� ��u�� �|�� � �C�D���K�C��C� ��c� ����3�'� $�#�D�#�3���� � ��2�"�8�Y�'��J�J�;�<� ��r��A�#�+�+�0�0�2���E�#� � � �L��%�j�&�-�-� )��e�X�&� �� � �K�L�� �� � �� ���X�&� �� � �K�L�� ��� �� ���X�&� �� �sY�E/�&F�F)�>G�3G#�/$F�F� F&�%F&�)$G�G� G �G �#G5�4G5c#�tK�t|�} ttj||��}|sy||f���)�wr)r�tupler�islice)ra�it�sizer�s rr�zPool._get_tasksys=���� �"�X����i�&�&�r�4�0�1�A�����)�O� �s�68c��td��)Nz:pool objects cannot be passed between processes or pickled)�NotImplementedErrorr#s rr4zPool.__reduce__�s��!�J�� rc���tjd�|jtk(r<t|_t|j _|jjd�yy)Nzclosing pool)rrSr|rrr�r�rLr#s rrOz Pool.close�sH��� � �>�"��;�;�#���D�K�*/�D� � �'��!�!�%�%�d�+�rc�d�tjd�t|_|j �y)Nzterminating pool)rrSr r|r�r#s rr�zPool.terminate�s ��� � �%�&�������rc��tjd�|jtk(rt d��|jt tfvrt d��|jj�|jj�|jj�|jD]}|j��y)Nzjoining poolzPool is still runningzIn unknown state)rrSr|rr�rr r�r0r�r�r{)r r�s rr0z Pool.join�s���� � �>�"��;�;�#���4�5�5� �[�[�� � 2� 2��/�0�0����!�!�#������!����!�!�#����A� �F�F�H�rc�p�tjd�|jj�|j �rw|j j �r\|j j�tjd�|j �r|j j �r�Zyyyy)Nz7removing tasks from inqueue until task handler finishedr) rrS�_rlock�acquire�is_aliverPrr��time�sleep)rW�task_handlerrs r�_help_stuff_finishzPool._help_stuff_finish�s}�� � � �L�M������ ��#�#�%�'�/�/�*>�*>�*@��O�O� � �"��J�J�q�M��#�#�%�'�/�/�*>�*>�*@�%�*@�%rc �d�tjd�t|_|j d�t|_tjd�|j||t |��|j�st | �dk7rtd��t|_|j d�|j d�tjd�tj�|ur|j�|rHt|dd�r9tjd�|D]} | j��| j��!tjd�tj�|ur|j�tjd �tj�|ur|j�|rpt|dd�r`tjd �|D]E} | j�s�tjd| jz�| j��Gyyy)Nzfinalizing poolz&helping task handler/workers to finishrz/Cannot have cache with result_handler not alivezjoining worker handlerr�zterminating workerszjoining task handlerzjoining result handlerzjoining pool workersr�)rrSr r|rLr+r�r'rJr�r r0rNr�r��pid)r�rrWrXr�r�worker_handlerr*�result_handlerr r�s rr�zPool._terminate_pool�s��� � � �$�%� !*������D�!�'���� � �;�<����w��c�$�i�@��'�'�)��E� �a�� �A�C� C�!*������D�!����T�� � � �+�,��#�#�%�^�;����!��G�D��G�[�1��J�J�,�-����:�:�%��K�K�M�� � � �)�*��#�#�%�\�9������ � �+�,��#�#�%�^�;����!��G�D��G�[�1��J�J�-�.����:�:�<��J�J�6����>�?��F�F�H� �2�4rc�&�|j�|Sr)r�r#s r� __enter__zPool.__enter__�s�������rc�$�|j�yr)r�)r �exc_type�exc_val�exc_tbs r�__exit__z Pool.__exit__�s�����r)NNr(NNr)NNN)r),r%r&r'r��staticmethodrtr!�warnings�warnrr�rCr�r�r�r�r�r�r~r�r�rrr�r�r�r�r�r�r�r�classmethodr�r�r�r�r4rOr�r0r+r�r1r6r(rrrr�s�����O��*��*�CE�04�O�f%�M�M�s�0�1�A� �8��8�� �� �B��'��'�$� 9�� 9�6�1� "��8�I�M�FJ��9� J�@�:@�8&(�b�4���BF���KO���:�"��"� �-��-�(�++��++�Z�9)��9)�v����� ,�� ������3��3�j�rc�X�eZdZd�Zd�Zd�Zdd�Zdd�Zd�Ze e j�Zy) r�c���||_tj�|_t t �|_|j|_||_||_ ||j|j<yr) r{r��Event�_event�next�job_counterr�r�� _callback�_error_callback)r r�r�r�s rr!zApplyResult.__init__�sO���� ��o�o�'�����%�� ��k�k���!���-���!%����D�I�I�rc�6�|jj�Sr)r>�is_setr#s r�readyzApplyResult.ready�s���{�{�!�!�#�#rc�n�|j�stdj|���|jS)Nz{0!r} not ready)rEr�rK�_successr#s r� successfulzApplyResult.successful�s,���z�z�|��.�5�5�d�;�<�<��}�}�rNc�:�|jj|�yr)r>r �r rs rr zApplyResult.wait�s��������!rc��|j|�|j�st�|jr|jS|j�r)r rErrG�_valuerJs rrMzApplyResult.get�s8��� � �'���z�z�|����=�=��;�;���+�+�rc�^�|\|_|_|jr'|jr|j|j�|jr'|js|j|j�|jj�|j|j=d|_yr) rGrLrArBr>�setr�r�r{�r r`rs rrzApplyResult._setss��%(�"�� �t�{��>�>�d�m�m��N�N�4�;�;�'����� � �� � ����-��������K�K�� � �"��� rr) r%r&r'r!rErHr rMrr:�types�GenericAlias�__class_getitem__r(rrr�r��s3��&�$�� "���$�E�$6�$6�7�rr�c��eZdZd�Zd�Zy)rc��tj||||��d|_dg|z|_||_|dkr9d|_|jj�|j|j=y||zt||z�z|_y)Nr�Tr)r�r!rGrL� _chunksize�_number_leftr>rNr�r��bool)r r�r��lengthr�r�s rr!zMapResult.__init__s������T�4��,:� � <��� ��f�v�o���#�����>� !�D���K�K�O�O�����D�I�I�&� &� � 1�D��)�9K�4L� L�D�rc��|xjdzc_|\}}|r�|jr�||j||jz|dz|jz|jdk(r`|jr|j |j�|j |j=|jj�d|_ yy|s|jrd|_||_|jdk(r`|jr|j|j�|j |j=|jj�d|_ yy)NrrF)rVrGrLrUrAr�r�r>rNr{rB)r r`�success_result�successrcs rrzMapResult._set)s�����Q���(�����t�}�}�CI�D�K�K��$�/�/�)�1�Q�3����*?�@�� � �A�%��>�>��N�N�4�;�;�/��K�K�� � �*������!�!�� �&��t�}�}� %�� �$���� � �A�%��'�'��(�(����5��K�K�� � �*������!�!�� � &rN)r%r&r'r!rr(rrrrs ��M�"rrc�0�eZdZd�Zd�Zdd�ZeZd�Zd�Zy)r�c�B�||_tjtj��|_tt�|_|j|_tj�|_d|_d|_ i|_||j|j<yr�)r{r�� Condition�Lock�_condr?r@r�r��collections�deque�_items�_index�_length� _unsorted)r r�s rr!zIMapIterator.__init__Gsp���� ��(�(����)9�:�� ���%�� ��k�k���!�'�'�)������������!%����D�I�I�rc��|Srr(r#s r�__iter__zIMapIterator.__iter__Rs���rNc���|j5 |jj�}ddd�\}}|r|S|�#t$r�|j|j k(rd|_td�|jj|� |jj�}n;#t$r/|j|j k(rd|_td�td�wxYwY��wxYw#1swY��xYwr) r`rc�popleft� IndexErrorrdrer{� StopIterationr r)r rrpr[r;s rr?zIMapIterator.nextUs��� �Z�Z� 1��{�{�*�*�,��� ������L����!� 1��;�;�$�,�,�.�!%�D�J�'�T�1�� � ����(�1��;�;�.�.�0�D��!�1��{�{�d�l�l�2�%)�� �+��5�&�D�0� 1��� 1���Z�s?�C$�<�AC!�B#�"C!�#8C�C!�C$� C!�!C$�$C-c��|j5|j|k(r�|jj|�|xjdz c_|j|jvrn|jj|j�}|jj|�|xjdz c_|j|jvr�n|jj �n||j|<|j|jk(r|j|j=d|_ ddd�y#1swYyxYw�Nr)r`rdrcr�rf�pop�notifyrer�r�r{rOs rrzIMapIterator._setms��� �Z�Z��{�{�a�����"�"�3�'����q� ���k�k�T�^�^�3��.�.�,�,�T�[�[�9�C��K�K�&�&�s�+��K�K�1�$�K��k�k�T�^�^�3�� � �!�!�#�$'����q�!��{�{�d�l�l�*��K�K�� � �*�!�� ��Z�Z�s�CD=�A!D=�=Ec��|j5||_|j|jk(r8|jj�|j|j =d|_ddd�y#1swYyxYwr)r`rerdrpr�r�r{)r rXs rr�zIMapIterator._set_length~sQ�� �Z�Z�!�D�L��{�{�d�l�l�*�� � �!�!�#��K�K�� � �*�!�� ��Z�Z�s�AA/�/A8r) r%r&r'r!rhr?�__next__rr�r(rrr�r�Es"�� &���,�H�"�""rr�c��eZdZd�Zy)r�c�H�|j5|jj|�|xjdz c_|jj �|j|j k(r|j|j=d|_ddd�y#1swYyxYwrn) r`rcr�rdrprer�r�r{rOs rrzIMapUnorderedIterator._set�sj�� �Z�Z��K�K���s�#��K�K�1��K��J�J�����{�{�d�l�l�*��K�K�� � �*�!�� � �Z�Z�s�BB�B!N)r%r&r'rr(rrr�r��s��"rr�c�Z�eZdZdZed��Zd d�Zd�Zd�Zed��Z ed��Z d �Zy)rFc��ddlm}||i|��S)Nrrs)�dummyrt)rurrbrts rrtzThreadPool.Process�s��"���%��%�%rNc�4�tj||||�yr)rr!)r r�rYrZs rr!zThreadPool.__init__�s��� � �d�I�{�H�=rc���tj�|_tj�|_|jj|_|jj|_yr)rr�r�r�rLr�rMr�r#s rr~zThreadPool._setup_queues�sD���)�)�+�� ��*�*�,����-�-�+�+����.�.�,�,��rc�0�|jjgSr)r�rPr#s rr�zThreadPool._get_sentinels�s���%�%�-�-�.�.rc��gSrr()r�s rr�z ThreadPool._get_worker_sentinels�s��� rc�� |jd���#tj$rYnwxYwt|�D]}|j d��y)NF)�block)rMr�Emptyr�rL)rWr*rr`s rr+zThreadPool._help_stuff_finish�sM�� �����%��(����{�{� �� ���t��A��K�K���s��,�,c�.�tj|�yr)r(r))r r�rrs rrzThreadPool._wait_for_updates�s��� � �7�r)NNr()r%r&r'r�r7rtr!r~r�r�r+rr(rrrr�sU���O��&��&�>�-�/���������r)Nr(NF))�__all__rarr�rr�r(r-rPr8r,rrr� connectionr r rrr �countr@rrrTrr*r3r8rfrU�dictrj�objectrr��AsyncResultrr�r�rr(rr�<module>r�s���<� ���� ��������'��������� ��i�o�o����5��i��0�0��<��<�"GK��+<�Z �$��$�.v�6�v�x)8�&�)8�V��%"��%"�V?"�6�?"�J "�L� "�$��$rPK:W�\��*����� __pycache__/pool.cpython-312.pycnu�[���� T��h����ddgZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl mZddl mZm Z ddlmZdZd Zd ZdZej(�Zd�Zd �ZGd�de�ZGd�d�Zd�ZGd�de�Z d#d�Zd�ZGd�de�Z Gd�de!�Z"Gd�de!�Z#e#Z$Gd�de#�Z%Gd�de!�Z&Gd �d!e&�Z'Gd"�de"�Z(y)$�Pool� ThreadPool�N�)�util)�get_context�TimeoutError)�wait�INIT�RUN�CLOSE� TERMINATEc�$�tt|��S�N)�list�map��argss �-/usr/lib64/python3.12/multiprocessing/pool.py�mapstarr/s����T� ���c�L�ttj|d|d��S)Nrr)r� itertools�starmaprs r�starmapstarr2s"��� �!�!�$�q�'�4��7�3�4�4rc��eZdZd�Zd�Zy)�RemoteTracebackc��||_yr��tb)�selfrs r�__init__zRemoteTraceback.__init__:s ����rc��|jSrr�r s r�__str__zRemoteTraceback.__str__<s���w�w�rN)�__name__� __module__�__qualname__r!r$�rrrr9s���rrc��eZdZd�Zd�Zy)�ExceptionWithTracebackc��tjt|�||�}dj|�}||_d|z|_y)N�z """ %s""")� traceback�format_exception�type�join�excr)r r1rs rr!zExceptionWithTraceback.__init__@s:�� � '� '��S� �3�� ;�� �W�W�R�[����� �2�%��rc�>�t|j|jffSr)�rebuild_excr1rr#s r� __reduce__z!ExceptionWithTraceback.__reduce__Es���T�X�X�t�w�w�/�/�/rN)r%r&r'r!r4r(rrr*r*?s��&� 0rr*c�&�t|�|_|Sr)r� __cause__)r1rs rr3r3Hs��#�B�'�C�M��Jrc�.��eZdZdZ�fd�Zd�Zd�Z�xZS)�MaybeEncodingErrorzVWraps possible unpickleable errors, so they can be safely sent through the socket.c���t|�|_t|�|_tt|�|j|j�yr)�reprr1�value�superr8r!)r r1r;� __class__s �rr!zMaybeEncodingError.__init__Ts3�����9����%�[�� � � �$�0����4�:�:�Frc�<�d|j�d|j�d�S)NzError sending result: 'z'. Reason: '�')r;r1r#s rr$zMaybeEncodingError.__str__Ys��=A�Z�Z�=A�X�X�G� Grc�<�d|jj�d|�d�S)N�<z: �>)r=r%r#s r�__repr__zMaybeEncodingError.__repr__]s��!�^�^�4�4�d�;�;r)r%r&r'�__doc__r!r$rC� __classcell__�r=s@rr8r8Ps���'�G� G�<rr8c�|�|�/t|t�r|dk\stdj|���|j}|j }t |d�r4|jj�|jj�|�||�d}|�|r`||kr[ |�} | �tjd�n;| \} }}} } d|| i|��f} || ||f�dx} x} x}x}x} }|dz }|��S|r||kr�[tjd |z�y#ttf$rtjd�Y�?wxYw#t$r.}|r|turt!||j"�}d|f}Yd}~��d}~wwxYw#t$r>}t%||d�}tjd |z�|| |d|ff�Yd}~��d}~wwxYw)NrzMaxtasks {!r} is not valid�_writerrz)worker got EOFError or OSError -- exitingzworker got sentinel -- exitingTFz0Possible encoding error while sending result: %szworker exiting after %d tasks)� isinstance�int�AssertionError�format�put�get�hasattrrH�close�_reader�EOFError�OSErrorr�debug� Exception�_helper_reraises_exceptionr*� __traceback__r8)�inqueue�outqueue�initializer�initargs�maxtasks�wrap_exceptionrMrN� completed�task�job�i�funcr�kwds�result�e�wrappeds r�workerrgas�����z�(�C�'@�+3�q�=��9�@�@��J�K�K� �,�,�C� �+�+�C��w� �"������������ ����X���I� � �x�I��,@� ��5�D� �<��J�J�7�8��#'� ��Q��d�D� ��D�$�/�$�/�0�F� ,���a�� �!�48�7��7�s�7�V�7�d�7�T�D��Q�� �7� �x�I��,@�8 �J�J�.��:�;��3�'�"� ��J�J�B�C�� ��� ��$�.H�"H�*�1�a�o�o�>���Q�Z�F�� ��� ,�(��F�1�I�6�G��J�J�I��� ���a�%��)�*�+�+�� ,�sB�D� D:�E4�$D7�6D7�: E1�$E,�,E1�4 F;�=4F6�6F;c��|�)z@Pickle-able helper function for use by _guarded_task_generation.r()�exs rrVrV�s�� �Hrc�2��eZdZdZdd��fd� Z�fd�Z�xZS)� _PoolCachez� Class that implements a cache for the Pool class that will notify the pool management threads every time the cache is emptied. The notification is done by the use of a queue that is provided when instantiating the cache. N��notifierc�2��||_t�|�|i|��yr)rmr<r!)r rmrrcr=s �rr!z_PoolCache.__init__�s��� �� � ���$�'�$�'rc�`��t�|�|�|s|jjd�yyr)r<�__delitem__rmrM)r �itemr=s �rrpz_PoolCache.__delitem__�s,��� ���D�!���M�M���d�#�r)r%r&r'rDr!rprErFs@rrkrk�s����+/�(� $� $rrkc��eZdZdZdZed��Z d(d�Zeje fd�Zd�Zd �Z ed ��Zed��Zd�Zed ��Zed��Zd�Zd�Zdifd�Zd)d�Zd)d�Z d*d�Zd�Zd+d�Zd+d�Zdiddfd�Z d*d�Z d*d�Zed)d��Ze d��Z!ed��Z"ed��Z#ed��Z$d �Z%d!�Z&d"�Z'd#�Z(ed$��Z)e d%��Z*d&�Z+d'�Z,y),rzS Class which supports an async version of applying functions to arguments. Tc�&�|j|i|��Sr��Process)�ctxrrcs rruzPool.Process�s���s�{�{�D�)�D�)�)rNr(c��g|_t|_|xs t�|_|j�t j�|_|jj�|_ t|j��|_||_||_ ||_|�tj �xsd}|dkrt#d��|� t%|t&�r|dkrt#d��|�t)|�st+d��||_ |j/�|j9�}t;j<t>j@|j|j|j|jB|j,|j|jD|jF|j|j|j|jH||jf��|_%d|jJ_&tN|jJ_|jJjQ�t;j<t>jR|j|jT|jF|j|jf��|_+d|jV_&tN|jV_|jVjQ�t;j<t>jX|jF|jZ|jf��|_.d|j\_&tN|j\_|j\jQ�t_j`||jb|j|jD|jF|j|j|jJ|jV|j\|jf d � �|_2tN|_y#t0$rQ|jD]}|j2��|j5��!|jD]}|j7���wxYw)Nrlrz&Number of processes must be at least 1rz/maxtasksperchild must be a positive int or Nonezinitializer must be a callable��targetrT�)r�exitpriority)3�_poolr �_stater�_ctx� _setup_queues�queue�SimpleQueue� _taskqueue�_change_notifierrk�_cache�_maxtasksperchild�_initializer� _initargs�os� cpu_count� ValueErrorrIrJ�callable� TypeError� _processes�_repopulate_poolrU�exitcode� terminater0�_get_sentinels� threading�Threadr�_handle_workersru�_inqueue� _outqueue�_wrap_exception�_worker_handler�daemonr�start� _handle_tasks� _quick_put� _task_handler�_handle_results� _quick_get�_result_handlerr�Finalize�_terminate_pool� _terminate)r � processesrZr[�maxtasksperchild�context�p� sentinelss rr!z Pool.__init__�sL���� �����,�{�}�� ������+�+�-���!%� � � 5� 5� 7��� �$�*?�*?�@���!1���'���!���������+�!�I��q�=��E�F�F��'��.��4�8H�A�8M� �!R�S�S��"�8�K�+@��<�=�=�#��� ��!�!�#��'�'�)� �(�/�/��'�'��+�+�t���� � �4�<�<��/�/�4�:�:�t�}�}�d�n�n��#�#�T�^�^�T�5K�5K��&�&� �4�3H�3H�J� ���'+����#�&)����#����"�"�$�'�-�-��%�%��/�/�4�?�?�D�N�N��*�*�d�k�k�+���� %)����!�$'����!���� � �"�(�/�/��'�'��.�.�$�/�/�4�;�;�?� ���'+����#�&)����#����"�"�$��-�-��$�&�&��/�/�4�=�=�$�.�.�$�*�*��'�'��)=�)=�t�?Q�?Q��&�&����5���������]� ��Z�Z���:�:�%��K�K�M� ��Z�Z������ �� �s� O'�'$Q�5Qc��|j|k(r<|d|��t|��t|dd��|jj d�yyy)Nz&unclosed running multiprocessing pool )�sourcer�)r}�ResourceWarning�getattrr�rM)r �_warnrs r�__del__zPool.__del__ sT���;�;�#���:�4�(�C�!�$� 0��t�/��6�B��%�%�)�)�$�/�C�rc ��|j}d|j�d|j�d|j�dt |j ��d� S)NrA�.z state=z pool_size=rB)r=r&r'r}�lenr|)r �clss rrCz Pool.__repr__sQ���n�n���C�N�N�#�1�S�%5�%5�$6�7���� �&� ����_�-�Q�0� 1rc�j�|jjg}|jjg}g|�|�Sr)r�rQr�)r �task_queue_sentinels�self_notifier_sentinelss rr�zPool._get_sentinelss<�� $��� 6� 6�7��#'�#8�#8�#@�#@�"A��@�%�@�(?�@�@rc�X�|D�cgc]}t|d�r|j��c}Scc}w)N�sentinel)rOr�)�workersrgs r�_get_worker_sentinelszPool._get_worker_sentinelss:���8��%+�"�6�:�6�����8� 8��8s�'c���d}ttt|���D]A}||}|j��t j d|z�|j �d}||=�C|S)z�Cleanup after any worker processes which have exited due to reaching their specified lifetime. Returns True if any workers were cleaned up. F�cleaning up worker %dT)�reversed�ranger�r�rrTr0)�pool�cleanedrargs r�_join_exited_workerszPool._join_exited_workers!sb�� ���%��D� �*�+�A��!�W�F����*�� � �2�Q�6�7���� �����G�,��rc��|j|j|j|j|j|j |j|j|j|j|j� Sr)�_repopulate_pool_staticr~rur�r|r�r�r�r�r�r�r#s rr�zPool._repopulate_pool1s_���+�+�D�I�I�t�|�|�,0�O�O�,0�J�J�� � �,0�N�N�D�<M�<M�,0�N�N�,0�,B�,B�,0�,@�,@� B� Brc �"�t|t|�z �D]u} ||t|||||| f��}|jj dd�|_d|_|j �|j|�tjd��wy)z�Bring the number of pool processes up to the specified number, for use after reaping workers which have exited. rxru� PoolWorkerTzadded workerN) r�r�rg�name�replacer�r��appendrrT)rvrur�r�rXrYrZr[r�r]ra�ws rr�zPool._repopulate_pool_static:s���y�3�t�9�,�-�A���F�%�x�)�&�(8�,�.�/�A� �V�V�^�^�I�|�<�A�F��A�H� �G�G�I��K�K��N��J�J�~�&�.rc �l�tj|�rtj|||||||||| � yy)zEClean up any exited workers and start replacements for them. N)rr�r�) rvrur�r�rXrYrZr[r�r]s r�_maintain_poolzPool._maintain_poolMs=���$�$�T�*��(�(��g�y�$�)0�(�K�)1�3C�)7� 9�+rc��|jj�|_|jj�|_|jjj |_|jjj|_ yr) r~r�r�r�rH�sendr�rQ�recvr�r#s rrzPool._setup_queuesYsX��� � �-�-�/�� ����.�.�0����-�-�/�/�4�4����.�.�0�0�5�5��rc�@�|jtk7rtd��y)NzPool not running)r}rr�r#s r�_check_runningzPool._check_running_s���;�;�#���/�0�0�rc�D�|j|||�j�S)zT Equivalent of `func(*args, **kwds)`. Pool must be running. )�apply_asyncrN)r rbrrcs r�applyz Pool.applycs"�� ����d�D�1�5�5�7�7rc�N�|j||t|�j�S)zx Apply `func` to each element in `iterable`, collecting the results in a list that is returned. )� _map_asyncrrN�r rb�iterable� chunksizes rrzPool.mapjs"�� ���t�X�w� �B�F�F�H�Hrc�N�|j||t|�j�S)z� Like `map()` method but the elements of the `iterable` are expected to be iterables as well and will be unpacked as arguments. Hence `func` and (a, b) becomes func(a, b). )r�rrNr�s rrzPool.starmapqs"�����t�X�{�I�F�J�J�L�Lrc�6�|j||t|||�S)z= Asynchronous version of `starmap()` method. )r�r�r rbr�r��callback�error_callbacks r� starmap_asynczPool.starmap_asyncys"�� ���t�X�{�I�'��9� 9rc#�K� d}t|�D]\}}||||fif���y#t$r}|dzt|fif��Yd}~yd}~wwxYw�w)z�Provides a generator of tasks for imap and imap_unordered with appropriate handling for iterables which throw exceptions during iteration.���rN)� enumeraterUrV)r � result_jobrbr�ra�xres r�_guarded_task_generationzPool._guarded_task_generation�s`���� J��A�!�(�+���1�!�1�d�Q�D�"�5�5�,��� J��q��s�$>���b�I�I�� J�s)�A�$�A� A�A�A�A�Ac���|j�|dk(rOt|�}|jj|j |j ||�|jf�|S|dkrtdj|���tj|||�}t|�}|jj|j |j t|�|jf�d�|D�S)zP Equivalent of `map()` -- can be MUCH slower than `Pool.map()`. rzChunksize must be 1+, not {0:n}c3�.K�|] }|D]}|����y�wrr(��.0�chunkrqs r� <genexpr>zPool.imap.<locals>.<genexpr>������?�f�U���D��D�f���)r��IMapIteratorr�rMr��_job�_set_lengthr�rLr� _get_tasksr�r rbr�r�rd�task_batchess r�imapz Pool.imap�s��� ������>�!�$�'�F��O�O����1�1�&�+�+�t�X�N��&�&�� � �M��1�}� �5�<�<�!�#�$�$� �?�?�4��9�E�L�!�$�'�F��O�O����1�1�&�+�+�29�2>�@��&�&� � �@�f�?�?rc���|j�|dk(rOt|�}|jj|j |j ||�|jf�|S|dkrtdj|���tj|||�}t|�}|jj|j |j t|�|jf�d�|D�S)zL Like `imap()` method but ordering of results is arbitrary. rzChunksize must be 1+, not {0!r}c3�.K�|] }|D]}|����y�wrr(r�s rr�z&Pool.imap_unordered.<locals>.<genexpr>�r�r�)r��IMapUnorderedIteratorr�rMr�r�r�r�rLrr�rr�s r�imap_unorderedzPool.imap_unordered�s��� ������>�*�4�0�F��O�O����1�1�&�+�+�t�X�N��&�&�� � �M��1�}� �5�<�<�Y�G�I�I��?�?�4��9�E�L�*�4�0�F��O�O����1�1�&�+�+�29�2>�@��&�&� � �@�f�?�?rc��|j�t|||�}|jj|jd|||fgdf�|S)z; Asynchronous version of `apply()` method. rN)r��ApplyResultr�rMr�)r rbrrcr�r�rds rr�zPool.apply_async�sL�� �����T�8�^�<�������v�{�{�A�t�T�4�@�A�4�H�I�� rc�6�|j||t|||�S)z9 Asynchronous version of `map()` method. )r�rr�s r� map_asynczPool.map_async�s"�� ���t�X�w� �8��� rc��|j�t|d�st|�}|�5tt |�t |j �dz�\}}|r|dz }t |�dk(rd}tj|||�}t||t |�||��} |jj|j| j||�df�| S)zY Helper function to implement map, starmap and their async counterparts. �__len__N�rr�r�) r�rOr�divmodr�r|rr�� MapResultr�rMr�r�) r rbr��mapperr�r�r��extrar�rds rr�zPool._map_async�s��� �����x��+��H�~�H���%�c�(�m�S����_�q�5H�I��I�u���Q�� ��x�=�A���I����t�X�y�A���4��C��M�8�*8�:��������-�-�f�k�k�.4�.:�<�� � �� rc��t||��|j�s"|j�|j�s�!yy)N)�timeout)r �emptyrN)r��change_notifierrs r�_wait_for_updateszPool._wait_for_updates�s2���Y��(�!�'�'�)����!�"�'�'�)rc��tj�}|jtk(s|r~|jtk7rk|j||||||| | ||� g|j |��| �}|j||�|jtk(r�U|r|jtk7r�k|jd�tjd�y)Nzworker handler exiting)r��current_threadr}rr r�r�rrMrrT)r��cache� taskqueuervrur�r�rXrYrZr[r�r]r�r�thread�current_sentinelss rr�zPool._handle_workers�s��� �)�)�+���m�m�s�"�u����)�1K����s�G�Y��g�'��h�/�� A�!O�#�";�";�D�"A� N�I� N���!�!�"3�_�E��m�m�s�"�u����)�1K� � � �d��� � �+�,rc�0�tj�}t|jd�D]}\}}d} |D]5}|jt k7rt jd�n> ||��7|r)t jd�|r|dnd}||dz� dx}x}} �v dx}x}} nt jd� t jd�|jd�t jd �|D] }|d�� t jd�y#t$r;} |dd\} } || j|d| f�n#t$rYnwxYwYd} ~ ��+d} ~ wwxYw#dx}x}} wxYw#t$rt jd �Y��wxYw)Nz'task handler found thread._state != RUN�Fzdoing set_length()rr�ztask handler got sentinelz/task handler sending sentinel to result handlerz(task handler sending sentinel to workersz/task handler got OSError when sending sentinelsztask handler exiting) r�r �iterrNr}rrrTrU�_set�KeyErrorrMrS) rrMrYr�r r�taskseq� set_lengthr_rer`�idxr�s rr�zPool._handle_taskss����)�)�+��#'� � � �t�#<��G�Z��D� ,�#�D��}�}��+�� � �#L�M��!��D� �$�"�� � �#7�8�)-�d�1�g�2��"�3��7�+��(,�+��+�w���'+�+��+�w��1$=�4 �J�J�2�3� J��J�J�H�I��L�L��� �J�J�A�B����D� �� � � �)�*��=%�!�#'���8���S�!�!�#�J�O�O�C�%���<��'�!� �!��� !��(,�+��+�w���� J��J�J�H�I� J�sl�/E)�$D"�,-E)�A E4�" E&�+E!�4E�E!� E �E!�E �E!�E)�!E&�&E)�)E1�4F�Fc�$�tj�} |�}|jtk7r0|jtk(sJd��t j d�n;|�t j d�n#|\}}} ||j||�dx}x}}��|rk|jtk7rX |�}|�t j d��5|\}}} ||j||�dx}x}}|r|jtk7r�Xt|d�rIt j d� td�D]%}|jj�sn |��'t j d t|�|j�y#ttf$rt j d�YywxYw#t$rY��*wxYw#ttf$rt j d�YywxYw#t$rY��wxYw#ttf$rY��wxYw) Nz.result handler got EOFError/OSError -- exitingzThread not in TERMINATEz,result handler found thread._state=TERMINATEzresult handler got sentinelz&result handler ignoring extra sentinelrQz"ensuring that outqueue is not full� z7result handler exiting: len(cache)=%s, thread._state=%s)r�r rSrRrrTr}rr rrrOr�rQ�pollr�)rYrNr rr_r`ra�objs rr�zPool._handle_results=s���)�)�+��� ��u�� �}�}��#��}�}� �1�L�3L�L�1�� � �I�J���|�� � �8�9���K�C��C� ��c� ����3�'� $�#�D�#�3��+�.�� � ��2� ��u�� �|�� � �C�D���K�C��C� ��c� ����3�'� $�#�D�#�3���� � ��2�"�8�Y�'��J�J�;�<� ��r��A�#�+�+�0�0�2���E�#� � � �L��%�j�&�-�-� )��e�X�&� �� � �K�L�� �� � �� ���X�&� �� � �K�L�� ��� �� ���X�&� �� �sY�F �F3�2G�G-�+3G=� $F0�/F0�3 G�?G�$G*�)G*�- G:�9G:�=H�Hc#�tK�t|�} ttj||��}|sy||f���)�wr)r�tupler�islice)rb�it�sizer�s rr�zPool._get_tasksys=���� �"�X����i�&�&�r�4�0�1�A�����)�O� �s�68c��td��)Nz:pool objects cannot be passed between processes or pickled)�NotImplementedErrorr#s rr4zPool.__reduce__�s��!�J�� rc���tjd�|jtk(r<t|_t|j _|jjd�yy)Nzclosing pool)rrTr}rrr�r�rMr#s rrPz Pool.close�sH��� � �>�"��;�;�#���D�K�*/�D� � �'��!�!�%�%�d�+�rc�d�tjd�t|_|j �y)Nzterminating pool)rrTr r}r�r#s rr�zPool.terminate�s ��� � �%�&�������rc��tjd�|jtk(rt d��|jt tfvrt d��|jj�|jj�|jj�|jD]}|j��y)Nzjoining poolzPool is still runningzIn unknown state)rrTr}rr�rr r�r0r�r�r|)r r�s rr0z Pool.join�s���� � �>�"��;�;�#���4�5�5� �[�[�� � 2� 2��/�0�0����!�!�#������!����!�!�#����A� �F�F�H�rc�p�tjd�|jj�|j �rw|j j �r\|j j�tjd�|j �r|j j �r�Zyyyy)Nz7removing tasks from inqueue until task handler finishedr) rrT�_rlock�acquire�is_aliverQrr��time�sleep)rX�task_handlerrs r�_help_stuff_finishzPool._help_stuff_finish�s}�� � � �L�M������ ��#�#�%�'�/�/�*>�*>�*@��O�O� � �"��J�J�q�M��#�#�%�'�/�/�*>�*>�*@�%�*@�%rc �d�tjd�t|_|j d�t|_tjd�|j||t |��|j�st | �dk7rtd��t|_|j d�|j d�tjd�tj�|ur|j�|rHt|dd�r9tjd�|D]} | j��| j��!tjd�tj�|ur|j�tjd �tj�|ur|j�|rpt|dd�r`tjd �|D]E} | j�s�tjd| jz�| j��Gyyy)Nzfinalizing poolz&helping task handler/workers to finishrz/Cannot have cache with result_handler not alivezjoining worker handlerr�zterminating workerszjoining task handlerzjoining result handlerzjoining pool workersr�)rrTr r}rMr+r�r'rKr�r r0rOr�r��pid)r�rrXrYr�r�worker_handlerr*�result_handlerr r�s rr�zPool._terminate_pool�s��� � � �$�%� !*������D�!�'���� � �;�<����w��c�$�i�@��'�'�)��E� �a�� �A�C� C�!*������D�!����T�� � � �+�,��#�#�%�^�;����!��G�D��G�[�1��J�J�,�-����:�:�%��K�K�M�� � � �)�*��#�#�%�\�9������ � �+�,��#�#�%�^�;����!��G�D��G�[�1��J�J�-�.����:�:�<��J�J�6����>�?��F�F�H� �2�4rc�&�|j�|Sr)r�r#s r� __enter__zPool.__enter__�s�������rc�$�|j�yr)r�)r �exc_type�exc_val�exc_tbs r�__exit__z Pool.__exit__�s�����r)NNr(NNr)NNN)r)-r%r&r'rDr��staticmethodrur!�warnings�warnrr�rCr�r�r�r�r�r�rr�r�rrr�r�r�r�r�r�r�r�classmethodr�r�r�r�r4rPr�r0r+r�r1r6r(rrrr�s�����O��*��*�CE�04�O�f%�M�M�s�0�1�A� �8��8�� �� �B��'��'�$� 9�� 9�6�1� "��8�I�M�FJ��9� J�@�:@�8&(�b�4���BF���KO���:�"��"� �-��-�(�++��++�Z�9)��9)�v����� ,�� ������3��3�j�rc�X�eZdZd�Zd�Zd�Zdd�Zdd�Zd�Ze e j�Zy) r�c���||_tj�|_t t �|_|j|_||_||_ ||j|j<yr) r|r��Event�_event�next�job_counterr�r�� _callback�_error_callback)r r�r�r�s rr!zApplyResult.__init__�sO���� ��o�o�'�����%�� ��k�k���!���-���!%����D�I�I�rc�6�|jj�Sr)r>�is_setr#s r�readyzApplyResult.ready�s���{�{�!�!�#�#rc�n�|j�stdj|���|jS)Nz{0!r} not ready)rEr�rL�_successr#s r� successfulzApplyResult.successful�s,���z�z�|��.�5�5�d�;�<�<��}�}�rNc�:�|jj|�yr)r>r �r rs rr zApplyResult.wait�s��������!rc��|j|�|j�st�|jr|jS|j�r)r rErrG�_valuerJs rrNzApplyResult.get�s8��� � �'���z�z�|����=�=��;�;���+�+�rc�^�|\|_|_|jr'|jr|j|j�|jr'|js|j|j�|jj�|j|j=d|_yr) rGrLrArBr>�setr�r�r|�r rars rrzApplyResult._setss��%(�"�� �t�{��>�>�d�m�m��N�N�4�;�;�'����� � �� � ����-��������K�K�� � �"��� rr) r%r&r'r!rErHr rNrr:�types�GenericAlias�__class_getitem__r(rrr�r��s3��&�$�� "���$�E�$6�$6�7�rr�c��eZdZd�Zd�Zy)rc��tj||||��d|_dg|z|_||_|dkr9d|_|jj�|j|j=y||zt||z�z|_y)Nr�Tr)r�r!rGrL� _chunksize�_number_leftr>rNr�r��bool)r r�r��lengthr�r�s rr!zMapResult.__init__s������T�4��,:� � <��� ��f�v�o���#�����>� !�D���K�K�O�O�����D�I�I�&� &� � 1�D��)�9K�4L� L�D�rc��|xjdzc_|\}}|r�|jr�||j||jz|dz|jz|jdk(r`|jr|j |j�|j |j=|jj�d|_ yy|s|jrd|_||_|jdk(r`|jr|j|j�|j |j=|jj�d|_ yy)NrrF)rVrGrLrUrAr�r�r>rNr|rB)r ra�success_result�successrds rrzMapResult._set)s�����Q���(�����t�}�}�CI�D�K�K��$�/�/�)�1�Q�3����*?�@�� � �A�%��>�>��N�N�4�;�;�/��K�K�� � �*������!�!�� �&��t�}�}� %�� �$���� � �A�%��'�'��(�(����5��K�K�� � �*������!�!�� � &rN)r%r&r'r!rr(rrrrs ��M�"rrc�0�eZdZd�Zd�Zdd�ZeZd�Zd�Zy)r�c�B�||_tjtj��|_tt�|_|j|_tj�|_d|_d|_ i|_||j|j<y)Nr)r|r�� Condition�Lock�_condr?r@r�r��collections�deque�_items�_index�_length� _unsorted)r r�s rr!zIMapIterator.__init__Gsp���� ��(�(����)9�:�� ���%�� ��k�k���!�'�'�)������������!%����D�I�I�rc��|Srr(r#s r�__iter__zIMapIterator.__iter__Rs���rNc���|j5 |jj�}ddd�\}}|r|S|�#t$r�|j|j k(rd|_td�|jj|� |jj�}n;#t$r/|j|j k(rd|_td�td�wxYwY��wxYw#1swY��xYwr) r`rc�popleft� IndexErrorrdrer|� StopIterationr r)r rrqr[r;s rr?zIMapIterator.nextUs��� �Z�Z� 1��{�{�*�*�,��� ������L����!� 1��;�;�$�,�,�.�!%�D�J�'�T�1�� � ����(�1��;�;�.�.�0�D��!�1��{�{�d�l�l�2�%)�� �+��5�&�D�0� 1��� 1���Z�s?�C$�<�AC!�B#�"C!�#8C�C!�C$� C!�!C$�$C-c��|j5|j|k(r�|jj|�|xjdz c_|j|jvrn|jj|j�}|jj|�|xjdz c_|j|jvr�n|jj �n||j|<|j|jk(r|j|j=d|_ ddd�y#1swYyxYw�Nr)r`rdrcr�rf�pop�notifyrer�r�r|rOs rrzIMapIterator._setms��� �Z�Z��{�{�a�����"�"�3�'����q� ���k�k�T�^�^�3��.�.�,�,�T�[�[�9�C��K�K�&�&�s�+��K�K�1�$�K��k�k�T�^�^�3�� � �!�!�#�$'����q�!��{�{�d�l�l�*��K�K�� � �*�!�� ��Z�Z�s�CD=�A!D=�=Ec��|j5||_|j|jk(r8|jj�|j|j =d|_ddd�y#1swYyxYwr)r`rerdrpr�r�r|)r rXs rr�zIMapIterator._set_length~sQ�� �Z�Z�!�D�L��{�{�d�l�l�*�� � �!�!�#��K�K�� � �*�!�� ��Z�Z�s�AA/�/A8r) r%r&r'r!rhr?�__next__rr�r(rrr�r�Es"�� &���,�H�"�""rr�c��eZdZd�Zy)r�c�H�|j5|jj|�|xjdz c_|jj �|j|j k(r|j|j=d|_ddd�y#1swYyxYwrn) r`rcr�rdrprer�r�r|rOs rrzIMapUnorderedIterator._set�sj�� �Z�Z��K�K���s�#��K�K�1��K��J�J�����{�{�d�l�l�*��K�K�� � �*�!�� � �Z�Z�s�BB�B!N)r%r&r'rr(rrr�r��s��"rr�c�Z�eZdZdZed��Zd d�Zd�Zd�Zed��Z ed��Z d �Zy)rFc��ddlm}||i|��S)Nrrt)�dummyru)rvrrcrus rruzThreadPool.Process�s��"���%��%�%rNc�4�tj||||�yr)rr!)r r�rZr[s rr!zThreadPool.__init__�s��� � �d�I�{�H�=rc���tj�|_tj�|_|jj|_|jj|_yr)r�r�r�r�rMr�rNr�r#s rrzThreadPool._setup_queues�sD���)�)�+�� ��*�*�,����-�-�+�+����.�.�,�,��rc�0�|jjgSr)r�rQr#s rr�zThreadPool._get_sentinels�s���%�%�-�-�.�.rc��gSrr()r�s rr�z ThreadPool._get_worker_sentinels�s��� rc�� |jd���#tj$rYnwxYwt|�D]}|j d��y)NF)�block)rNr��Emptyr�rM)rXr*rras rr+zThreadPool._help_stuff_finish�sM�� �����%��(����{�{� �� ���t��A��K�K���s��,�,c�.�tj|�yr)r(r))r r�rrs rrzThreadPool._wait_for_updates�s��� � �7�r)NNr()r%r&r'r�r7rur!rr�r�r+rr(rrrr�sU���O��&��&�>�-�/���������r)Nr(NF))�__all__rarr�r�r�r(r-rPr8r,rrr� connectionr r rrr �countr@rrrUrr*r3r8rgrV�dictrk�objectrr��AsyncResultrr�r�rr(rr�<module>r�s���<� ���� ��������'��������� ��i�o�o����5��i��0�0��<��<�"GK��+<�Z �$��$�.v�6�v�x)8�&�)8�V��%"��%"�V?"�6�?"�J "�L� "�$��$rPK:W�\���' ,__pycache__/popen_fork.cpython-312.opt-1.pycnu�[���� T��hI ��<�ddlZddlZddlmZdgZGd�de�Zy)�N�)�util�Popenc�`�eZdZdZd�Zd�Zejfd�Zdd�Z d�Z d�Zd �Zd �Z d�Zy) r�forkc�j�tj�d|_d|_|j |�y�N)r�_flush_std_streams� returncode� finalizer�_launch)�self�process_objs �3/usr/lib64/python3.12/multiprocessing/popen_fork.py�__init__zPopen.__init__s(�����!����������[�!�c��|Sr �)r�fds r�duplicate_for_childzPopen.duplicate_for_childs��� rc���|j�M tj|j|�\}}||jk(rtj |�|_|jS#t$rYywxYwr )r�os�waitpid�pid�OSError�waitstatus_to_exitcode)r�flagr�stss r�pollz Popen.pollsh���?�?�"� ��:�:�d�h�h��5���S� �d�h�h��"$�";�";�C�"@�������� � �� �s�#A&�& A2�1A2Nc��|j�G|�ddlm}||jg|�sy|j |dk(rt j�Sd�S|jS)Nr)�waitg)r�multiprocessing.connectionr!�sentinelrr�WNOHANG)r�timeoutr!s rr!z Popen.wait$sS���?�?�"��"�;��T�]�]�O�W�5���9�9�7�c�>�R�Z�Z�A�A�q�A�A����rc��|j�" tj|j|�yy#t$rYyt $r|j d����YywxYw)Ng�������?)r%)rr�killr�ProcessLookupErrorrr!)r�sigs r�_send_signalzPopen._send_signal.s]���?�?�"� �������#�&�#��&� ��� ��9�9�S�9�)�1��2� �s� 0� A�A�Ac�B�|jtj�yr )r*�signal�SIGTERM�rs r� terminatezPopen.terminate8������&�.�.�)rc�B�|jtj�yr )r*r,�SIGKILLr.s rr'z Popen.kill;r0rc�H�d}tj�\}}tj�\}}tj�|_|jdk(rS tj|�tj|�|j|��}tj|�ytj|�tj|�tj|tj||f�|_ ||_y#tj|�wxYw)Nrr)�parent_sentinel)r�piperr�close� _bootstrap�_exitr�Finalize� close_fdsrr#)rr�code�parent_r�child_w�child_r�parent_ws rr z Popen._launch>s������G�G�I���'��G�G�I�����7�7�9����8�8�q�=� �����"�����"�"�-�-�g�-�F��������H�H�W���H�H�W��!�]�]�4����,4�h�+@�B�D�N�$�D�M�� �����s�<D � D!c�>�|j�|j�yyr )rr.s rr6zPopen.closeQs���>�>�%��N�N��&rr )�__name__� __module__�__qualname__�methodrrrr$rr!r*r/r'r r6rrrrrs=�� �F�"��� � � ���*�*�%�&r)rr,�r�__all__�objectrrrr�<module>rHs#�� � ���)��G�F�GrPK:W�\���' ,__pycache__/popen_fork.cpython-312.opt-2.pycnu�[���� T��hI ��<�ddlZddlZddlmZdgZGd�de�Zy)�N�)�util�Popenc�`�eZdZdZd�Zd�Zejfd�Zdd�Z d�Z d�Zd �Zd �Z d�Zy) r�forkc�j�tj�d|_d|_|j |�y�N)r�_flush_std_streams� returncode� finalizer�_launch)�self�process_objs �3/usr/lib64/python3.12/multiprocessing/popen_fork.py�__init__zPopen.__init__s(�����!����������[�!�c��|Sr �)r�fds r�duplicate_for_childzPopen.duplicate_for_childs��� rc���|j�M tj|j|�\}}||jk(rtj |�|_|jS#t$rYywxYwr )r�os�waitpid�pid�OSError�waitstatus_to_exitcode)r�flagr�stss r�pollz Popen.pollsh���?�?�"� ��:�:�d�h�h��5���S� �d�h�h��"$�";�";�C�"@�������� � �� �s�#A&�& A2�1A2Nc��|j�G|�ddlm}||jg|�sy|j |dk(rt j�Sd�S|jS)Nr)�waitg)r�multiprocessing.connectionr!�sentinelrr�WNOHANG)r�timeoutr!s rr!z Popen.wait$sS���?�?�"��"�;��T�]�]�O�W�5���9�9�7�c�>�R�Z�Z�A�A�q�A�A����rc��|j�" tj|j|�yy#t$rYyt $r|j d����YywxYw)Ng�������?)r%)rr�killr�ProcessLookupErrorrr!)r�sigs r�_send_signalzPopen._send_signal.s]���?�?�"� �������#�&�#��&� ��� ��9�9�S�9�)�1��2� �s� 0� A�A�Ac�B�|jtj�yr )r*�signal�SIGTERM�rs r� terminatezPopen.terminate8������&�.�.�)rc�B�|jtj�yr )r*r,�SIGKILLr.s rr'z Popen.kill;r0rc�H�d}tj�\}}tj�\}}tj�|_|jdk(rS tj|�tj|�|j|��}tj|�ytj|�tj|�tj|tj||f�|_ ||_y#tj|�wxYw)Nrr)�parent_sentinel)r�piperr�close� _bootstrap�_exitr�Finalize� close_fdsrr#)rr�code�parent_r�child_w�child_r�parent_ws rr z Popen._launch>s������G�G�I���'��G�G�I�����7�7�9����8�8�q�=� �����"�����"�"�-�-�g�-�F��������H�H�W���H�H�W��!�]�]�4����,4�h�+@�B�D�N�$�D�M�� �����s�<D � D!c�>�|j�|j�yyr )rr.s rr6zPopen.closeQs���>�>�%��N�N��&rr )�__name__� __module__�__qualname__�methodrrrr$rr!r*r/r'r r6rrrrrs=�� �F�"��� � � ���*�*�%�&r)rr,�r�__all__�objectrrrr�<module>rHs#�� � ���)��G�F�GrPK:W�\˙.��3__pycache__/popen_spawn_win32.cpython-312.opt-2.pycnu�[���� T��h���H�ddlZddlZddlZddlZddlZddlmZmZmZddl m Z ddl mZdgZdZ ejdk(xr eed d �Zej"j%�j'd�Zd�Zeej"ej,�Zd �ZGd�de�Zy)�N�)� reduction�get_spawning_popen�set_spawning_popen)�spawn)�util�Popeni�win32�frozenFzpythonservice.exec��||k(xs?tjj|�tjj|�k(S�N)�os�path�normcase)�p1�p2s �:/usr/lib64/python3.12/multiprocessing/popen_spawn_win32.py�_path_eqrs4�� ��8�C�r�w�w�'�'��+�r�w�w�/?�/?��/C�C�C�c�<�|D]}tj|��yr )�_winapi�CloseHandle)�handles�handles r�_close_handlesrs�������F�#�rc�<�eZdZ dZd�Zd�Zd d�Zd�Zd�ZeZ d�Z y) r rc�d�tj|j�}tjdd�\}}tj|d�}tjtj�|��}tj�}trat|tj�rGtjx|d<}tj j#�}tj|d<nd}dj%d�|D��}t'|dd��5} tj(||ddd d|dd� \} }}} tj*|�||_d|_| |_t3| �|_t7j8|t:|j4t3|�f�|_t?|� tAjB|| �tAjB|| �t?d� ddd�y#tj*|��xYw#t?d�wxYw#1swYyxYw) Nr)� parent_pid�pipe_handle�__PYVENV_LAUNCHER__� c3�&K�|] }d|z���y�w)z"%s"N�)�.0�xs r� <genexpr>z!Popen.__init__.<locals>.<genexpr>Fs����/�3�a�v��z�3�s��wbT)�closefdF)"r�get_preparation_data�_namer� CreatePipe�msvcrt�open_osfhandle�get_command_liner�getpid�get_executable�WINENVr�sys� executable�_base_executable�environ�copy�join�open� CreateProcessr�pid� returncode�_handle�int�sentinelr�Finalizer� finalizerrr�dump)�self�process_obj� prep_data�rhandle�whandle�wfd�cmd� python_exe�env�to_child�hp�htr:�tids r�__init__zPopen.__init__-s����.�.�{�/@�/@�A� �#�-�-�d�A�6�����#�#�G�Q�/���$�$�� � ��18�:���)�)�+� ��h�z�3�>�>�:�"%�"6�"6�6�C��F�Z��*�*�/�/�#�C�),���C�%�&��C��h�h�/�3�/�/�� �#�t�T� *�h� �#*�#8�#8����$��q�#�t�T�$;� ��B��S��#�#�B�'��D�H�"�D�O��D�L���G�D�M�!�]�]�4��,0�M�M�3�w�<�+H�J�D�N� �t�$� )����y�(�3����{�H�5�"�4�(�3+� *�� ��#�#�G�,��� #�4�(��3+� *�s=�H&�7G;�A%H&�:,H�&H&�;H�H&� H#�#H&�&H/c�B�tj||j�Sr )r� duplicater>)rBrs r�duplicate_for_childzPopen.duplicate_for_childcs���"�"�6�4�=�=�9�9rNc��|j�|jS|�tj}ntdt |dzdz��}tj t |j�|�}|tjk(r@tj|j�}|tk(rtj}||_|jS)Nri�g�?)r;r�INFINITE�maxr=�WaitForSingleObjectr<� WAIT_OBJECT_0�GetExitCodeProcess� TERMINATE�signal�SIGTERM)rB�timeout�msecs�res�codes r�waitz Popen.waitgs����?�?�&��?�?�"��?��$�$�E���3�w��~��3�4�5�E��)�)�#�d�l�l�*;�U�C���'�'�'�'��-�-�d�l�l�;�D��y� ������"�D�O����rc�&�|jd��S)Nr)r\)r`�rBs r�pollz Popen.pollys���y�y��y�#�#rc��|j�y tjt|j�t �y#t$r?tjt|j��}|tjk(r�YywxYwr ) r;r�TerminateProcessr=r<rY�PermissionErrorrX�STILL_ACTIVE)rBr_s r� terminatezPopen.terminate|sm���?�?�&�� ��$�$�S����%6� �B��� ��-�-�c�$�,�,�.?�@�D��w�+�+�+��,� �s�-=�AB�Bc�$�|j�yr )r@rbs r�closezPopen.close�s�����rr )�__name__� __module__�__qualname__�methodrOrRr`rcrh�killrjr#rrr r 's4����F�4)�l:��$$��$�D�r)rr,rZr2r�contextrrr�rr�__all__rY�platform�getattr�WINEXEr3�lower�endswith� WINSERVICErr4r1r�objectr r#rr�<module>rzs��� � � � ��F�F����)�� � � �,�,�'� !� C�g�c�8�U�&C�� �^�^� !� !� #� ,� ,�-@� A� �D��c�n�n�c�&:�&:� ;� ;��$�j�F�jrPK:W�\PE��-__pycache__/popen_spawn_win32.cpython-312.pycnu�[���� T��h���H�ddlZddlZddlZddlZddlZddlmZmZmZddl m Z ddl mZdgZdZ ejdk(xr eed d �Zej"j%�j'd�Zd�Zeej"ej,�Zd �ZGd�de�Zy)�N�)� reduction�get_spawning_popen�set_spawning_popen)�spawn)�util�Popeni�win32�frozenFzpythonservice.exec��||k(xs?tjj|�tjj|�k(S�N)�os�path�normcase)�p1�p2s �:/usr/lib64/python3.12/multiprocessing/popen_spawn_win32.py�_path_eqrs4�� ��8�C�r�w�w�'�'��+�r�w�w�/?�/?��/C�C�C�c�<�|D]}tj|��yr )�_winapi�CloseHandle)�handles�handles r�_close_handlesrs�������F�#�rc�>�eZdZdZdZd�Zd�Zd d�Zd�Zd�Z e Z d �Zy)r z@ Start a subprocess to run the code of a process object rc�d�tj|j�}tjdd�\}}tj|d�}tjtj�|��}tj�}trat|tj�rGtjx|d<}tj j#�}tj|d<nd}dj%d�|D��}t'|dd��5} tj(||ddd d|dd� \} }}} tj*|�||_d|_| |_t3| �|_t7j8|t:|j4t3|�f�|_t?|� tAjB|| �tAjB|| �t?d� ddd�y#tj*|��xYw#t?d�wxYw#1swYyxYw) Nr)� parent_pid�pipe_handle�__PYVENV_LAUNCHER__� c3�&K�|] }d|z���y�w)z"%s"N�)�.0�xs r� <genexpr>z!Popen.__init__.<locals>.<genexpr>Fs����/�3�a�v��z�3�s��wbT)�closefdF)"r�get_preparation_data�_namer� CreatePipe�msvcrt�open_osfhandle�get_command_liner�getpid�get_executable�WINENVr�sys� executable�_base_executable�environ�copy�join�open� CreateProcessr�pid� returncode�_handle�int�sentinelr�Finalizer� finalizerrr�dump)�self�process_obj� prep_data�rhandle�whandle�wfd�cmd� python_exe�env�to_child�hp�htr:�tids r�__init__zPopen.__init__-s����.�.�{�/@�/@�A� �#�-�-�d�A�6�����#�#�G�Q�/���$�$�� � ��18�:���)�)�+� ��h�z�3�>�>�:�"%�"6�"6�6�C��F�Z��*�*�/�/�#�C�),���C�%�&��C��h�h�/�3�/�/�� �#�t�T� *�h� �#*�#8�#8����$��q�#�t�T�$;� ��B��S��#�#�B�'��D�H�"�D�O��D�L���G�D�M�!�]�]�4��,0�M�M�3�w�<�+H�J�D�N� �t�$� )����y�(�3����{�H�5�"�4�(�3+� *�� ��#�#�G�,��� #�4�(��3+� *�s=�H&�7G;�A%H&�:,H�&H&�;H�H&� H#�#H&�&H/c�^�|t�usJ�tj||j�Sr )rr� duplicater>)rBrs r�duplicate_for_childzPopen.duplicate_for_childcs+���)�+�+�+�+��"�"�6�4�=�=�9�9rNc��|j�|jS|�tj}ntdt |dzdz��}tj t |j�|�}|tjk(r@tj|j�}|tk(rtj}||_|jS)Nri�g�?)r;r�INFINITE�maxr=�WaitForSingleObjectr<� WAIT_OBJECT_0�GetExitCodeProcess� TERMINATE�signal�SIGTERM)rB�timeout�msecs�res�codes r�waitz Popen.waitgs����?�?�&��?�?�"��?��$�$�E���3�w��~��3�4�5�E��)�)�#�d�l�l�*;�U�C���'�'�'�'��-�-�d�l�l�;�D��y� ������"�D�O����rc�&�|jd��S)Nr)r\)r`�rBs r�pollz Popen.pollys���y�y��y�#�#rc��|j�y tjt|j�t �y#t$r?tjt|j��}|tjk(r�YywxYwr ) r;r�TerminateProcessr=r<rY�PermissionErrorrX�STILL_ACTIVE)rBr_s r� terminatezPopen.terminate|sm���?�?�&�� ��$�$�S����%6� �B��� ��-�-�c�$�,�,�.?�@�D��w�+�+�+��,� �s�-=�AB�Bc�$�|j�yr )r@rbs r�closezPopen.close�s�����rr )�__name__� __module__�__qualname__�__doc__�methodrOrRr`rcrh�killrjr#rrr r 's4����F�4)�l:��$$��$�D�r)rr,rZr2r�contextrrr�rr�__all__rY�platform�getattr�WINEXEr3�lower�endswith� WINSERVICErr4r1r�objectr r#rr�<module>r{s��� � � � ��F�F����)�� � � �,�,�'� !� C�g�c�8�U�&C�� �^�^� !� !� #� ,� ,�-@� A� �D��c�n�n�c�&:�&:� ;� ;��$�j�F�jrPK:W�\zc_�@�@)__pycache__/process.cpython-312.opt-1.pycnu�[���� T��hk/���gd�ZddlZddlZddlZddlZddlZddlmZ ejjej��Zd�Z d�Zd�Zd�ZGd�d e�ZGd �de�ZGd�d e�ZGd�de�Zdae�aej2d�ae�a[iZeej>jA��D]\Z!Z"e!dddk(s�de!vs�de!��ee"<�[!["e�Z#y#e$rdZY��wxYw))�BaseProcess�current_process�active_children�parent_process�N)�WeakSetc��tS)z@ Return process object representing the current process )�_current_process���0/usr/lib64/python3.12/multiprocessing/process.pyrr%s ���rc�4�t�tt�S)zN Return list of process objects corresponding to live child processes )�_cleanup�list� _childrenr rrrr+s�� �J�� �?�rc��tS)z? Return process object representing the parent process )�_parent_processr rrrr3s ���rc��tt�D]7}|jx}s�|j���#tj |��9y�N)rr�_popen�poll�discard)�p�child_popens rrr=s;�� �)�_���8�8�#�K�#��)9�)9�);�)G����a� �rc�N�eZdZdZd�Zddddifdd�d�Zd�Zd�Zd �Zd �Z d�Z dd�Zd �Zd�Z ed��Zej d��Zed��Zej d��Zed��Zej d��Zed��Zed��ZeZed��Zd�Zdd�Zed��Zy)rz� Process objects represent activity that is run in a separate process The class is analogous to `threading.Thread` c��t�r)�NotImplementedError��selfs r�_PopenzBaseProcess._PopenMs��!�!rNr )�daemonc�$�tt�}tj|fz|_tjj�|_t j�|_tj|_ d|_d|_||_ t|�|_t!|�|_|xs;t%|�j&dzdj)d�|jD��z|_|�||_t.j1|�y)NF�-�:c3�2K�|]}t|����y�wr)�str)�.0�is r� <genexpr>z'BaseProcess.__init__.<locals>.<genexpr>^s����=�n��c�!�f�n�s�)�next�_process_counterr � _identity�_config�copy�os�getpid�_parent_pid�name�_parent_namer�_closed�_target�tuple�_args�dict�_kwargs�type�__name__�join�_namer � _dangling�add)r�group�targetr1�args�kwargsr �counts r�__init__zBaseProcess.__init__Ps����%�&��)�3�3�u�h�>���'�/�/�4�4�6����9�9�;���,�1�1�������������4�[�� ��F�|����>�T�$�Z�0�0�3�6��X�X�=�d�n�n�=�=�>�� ��� �D�K�� � �d�rc�2�|jrtd��y)Nzprocess object is closed)r3� ValueErrorrs r� _check_closedzBaseProcess._check_closedcs���<�<��7�8�8�rc�j�|jr'|j|ji|j��yy)zQ Method to be run in sub-process; can be overridden in sub-class N)r4r6r8rs r�runzBaseProcess.rungs+���<�<��D�L�L�$�*�*�5����5�rc���|j�t�|j|�|_|jj|_|`|`|`tj|�y)z% Start child process N)rGrrr�sentinel� _sentinelr4r6r8rr>rs r�startzBaseProcess.startnsS�� ���� � ��k�k�$�'������-�-��� �L�$�*�d�l�� � �d�rc�X�|j�|jj�y)zT Terminate process; sends SIGTERM signal or uses TerminateProcess() N)rGr� terminaters rrOzBaseProcess.terminate�s �� ���������rc�X�|j�|jj�y)zT Terminate process; sends SIGKILL signal or uses TerminateProcess() N)rGr�killrs rrQzBaseProcess.kill�s �� ���������rc��|j�|jj|�}|�tj |�yy)z5 Wait until child process terminates N)rGr�waitrr)r�timeout�ress rr;zBaseProcess.join�s>�� �����k�k���w�'���?����d�#�rc��|j�|tury|j�y|jj�}|�ytj|�y)z1 Return whether process is alive TF)rGr rrrr)r� returncodes r�is_alivezBaseProcess.is_alive�sW�� �����#�#���;�;����[�[�%�%�'� �������d�#�rc���|j�]|jj��td��|jj�d|_|`t j |�d|_y)z� Close the Process object. This method releases resources held by the Process object. It is an error to call this method if the child process is still running. Nz^Cannot close a process while it is still running. You should first call join() or terminate().T)rrrF�closerLrrr3rs rrZzBaseProcess.close�sg���;�;�"��{�{���!�)� �"P�Q�Q��K�K�����D�K������d�#���rc��|jSr�r<rs rr1zBaseProcess.name�s���z�z�rc��||_yrr\)rr1s rr1zBaseProcess.name�s���� rc�:�|jjdd�S)z4 Return whether process is a daemon r F)r,�getrs rr zBaseProcess.daemon�s�� �|�|����%�0�0rc�"�||jd<y)z1 Set whether process is a daemon r N�r,)r�daemonics rr zBaseProcess.daemon�s��"*����X�rc� �|jdS)N�authkeyrars rrdzBaseProcess.authkey�s���|�|�I�&�&rc�4�t|�|jd<y)z2 Set authorization key of process rdN)�AuthenticationStringr,)rrds rrdzBaseProcess.authkey�s�� #7�w�"?����Y�rc��|j�|j�|jS|jj�S)zM Return exit code of process or `None` if it has yet to stop )rGrrrs r�exitcodezBaseProcess.exitcode�s7�� �����;�;���;�;���{�{���!�!rc��|j�|turtj�S|jxr|jj S)zU Return identifier (PID) of process or `None` if it has yet to start )rGr r.r/r�pidrs r�identzBaseProcess.ident�s<�� �����#�#��9�9�;���;�;�2�4�;�;�?�?�2rc�n�|j� |jS#t$r td�d�wxYw)z{ Return a file descriptor (Unix) or handle (Windows) suitable for waiting for process termination. zprocess not startedN)rGrL�AttributeErrorrFrs rrKzBaseProcess.sentinel�s<�� ���� >��>�>�!��� >��2�3��=� >�s��4c��d}|turd}nc|jrd}nT|jtj�k7rd}n0|j �d}n!|j j �}|�d}nd}t|�jd|jzg}|j �(|jd|j jz�|jd|jz�|j|�|�*tj||�}|jd |z�|jr|jd �ddj|�zS) N�started�closed�unknown�initial�stoppedzname=%rzpid=%sz parent=%szexitcode=%sr z<%s>� )r r3r0r.r/rrr9r:r<�appendrj�_exitcode_to_namer_r r;)rrh�status�infos r�__repr__zBaseProcess.__repr__s�����#�#��F� �\�\��F� � � ����� ,��F� �[�[� ��F��{�{�'�'�)�H��#�"��"���T� �#�#�Y����%;�<���;�;�"��K�K��4�;�;�?�?�2�3����K�$�"2�"2�2�3����F����(�,�,�X�x�@�H��K�K� ��0�1��;�;��K�K��!�������&�&rc��ddlm}m} |j�|j |j�tjd�at�a |j�t}|at|j|j|�at j"r"t!j$�j'� |j)�~|j+d� |j-�d}|j/� t!jF�|j+d|z�|jI�|S#~wxYw#|j/�wxYw#t0$rw}|j2�d}n^t5|j2t6�r |j2}n7t8j:j=t?|j2�dz�d}Yd}~��d}~wd}ddl }t8j:j=d|jBz�|jE�Y��xYw#t!jF�|j+dz�|jI�wxYw)N�)�util�contextz child process calling self.run()r� zProcess %s: z process exiting with exitcode %d)%�r|r}� _start_method�_force_start_method� itertoolsrCr*�setr�_close_stdinr �_ParentProcessr2r0r� threading�_HAVE_THREAD_NATIVE_ID�main_thread�_set_native_id�_after_forkrxrI�_exit_function� SystemExit�code� isinstance�int�sys�stderr�writer%� tracebackr1� print_exc� _shutdown�_flush_std_streams)r�parent_sentinelr|r}�old_processrh�er�s r� _bootstrapzBaseProcess._bootstrap"s���#�( &��!�!�-��+�+�D�,>�,>�?�(���q�1����I�����*�K�#��,��!�!�4�#3�#3�_�F�O��/�/��%�%�'�6�6�8� �� � �"� ��I�I�8�9� &���� ����#�#�%� ���!��I�I�8�8�C�D��#�#�%����3 ���#�#�%��� ��v�v�~����A�F�F�C�(��6�6��� � � � ��Q�V�V��t�!3�4����� "��H���J�J���_�t�y�y�8�9����!�����!��I�I�8�8�C�D��#�#�%�sb�B1E�<D<�E�E�1E�H�<D?�?E�E�E� H� A-G� H�AH�H�:Ic�d�ddlm}|jj�|j �y)Nr{�r|)rr|�_finalizer_registry�clear�_run_after_forkersr�s rr�zBaseProcess._after_forkRs#���� � �&�&�(����!rr)r:� __module__�__qualname__�__doc__rrDrGrIrMrOrQr;rXrZ�propertyr1�setterr rdrhrkrjrKryr��staticmethodr�r rrrrGs4��� "�"�$�T��2����&9�6��$ �� $��&�"���� �[�[�����1��1��]�]�*��*��'��'� �^�^�@��@��"��"��3��3��C� � >�� >�'�>.�`�"��"rrc��eZdZd�Zy)rfc�V�ddlm}|��td��tt |�ffS)Nr{)�get_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)r}r�� TypeErrorrf�bytes)rr�s r� __reduce__zAuthenticationString.__reduce__^s3��/���'��2�� �$�e�D�k�^�3�3rN)r:r�r�r�r rrrfrf]s��4rrfc�4�eZdZd�Zd�Zed��Zdd�ZeZy)r�c�t�d|_||_||_d|_d|_d|_||_i|_y)Nr F)r+r<�_pidr0rr3rLr,)rr1rjrKs rrDz_ParentProcess.__init__ns;������� ��� ����������!�����rc�:�ddlm}||jgd��S)Nr�rS�rT��multiprocessing.connectionrSrL)rrSs rrXz_ParentProcess.is_alivexs��3�����(�!�4�4�4rc��|jSr)r�rs rrkz_ParentProcess.ident|s���y�y�rNc�:�ddlm}||jg|��y)z6 Wait until parent process terminates rr�r�Nr�)rrTrSs rr;z_ParentProcess.join�s�� 4��d�n�n� �w�/rr) r:r�r�rDrXr�rkr;rjr rrr�r�ls,���5�����0��Crr�c��eZdZd�Zd�Zy)�_MainProcessc��d|_d|_d|_d|_d|_tt jd��dd�|_y)Nr �MainProcessF� z/mp)rd� semprefix) r+r<r0rr3rfr.�urandomr,rs rrDz_MainProcess.__init__�sB�����"�� ����������#7�� � �2��#G�%*�,��rc��yrr rs rrZz_MainProcess.close�s��rN)r:r�r�rDrZr rrr�r��s��,�$ rr�r{��SIG�_r")$�__all__r.r��signalr�r��_weakrefsetr�path�abspath�getcwd�ORIGINAL_DIR�OSErrorrrrr�objectrr�rfr�r�rr rCr*r�rrvr�__dict__�itemsr1�signumr=r rr�<module>r�s&���� � � ������7�7�?�?�9�2�9�9�;�/�L����!�O"�&�O"�l4�5�4��[��B �;� �0���>��"�9�?�?�1�%���E� ��������.�.�0�1�L�D�&��B�Q�x���3�d�?�'(���Z��6�'�"�2� �&� �I� ��s���L��s�*C0�0C:�9C:PK:W�\�rr�;�;)__pycache__/process.cpython-312.opt-2.pycnu�[���� T��hk/���gd�ZddlZddlZddlZddlZddlZddlmZ ejjej��Zd�Z d�Zd�Zd�ZGd�d e�ZGd �de�ZGd�d e�ZGd�de�Zdae�aej2d�ae�a[iZeej>jA��D]\Z!Z"e!dddk(s�de!vs�de!��ee"<�[!["e�Z#y#e$rdZY��wxYw))�BaseProcess�current_process�active_children�parent_process�N)�WeakSetc�� tS�N)�_current_process���0/usr/lib64/python3.12/multiprocessing/process.pyrr%s����rc�6� t�tt�Sr )�_cleanup�list� _childrenrrr rr+s��� �J�� �?�rc�� tSr )�_parent_processrrr rr3s����rc��tt�D]7}|jx}s�|j���#tj |��9yr )rr�_popen�poll�discard)�p�child_popens r rr=s;�� �)�_���8�8�#�K�#��)9�)9�);�)G����a� �rc�L�eZdZ d�Zddddifdd�d�Zd�Zd�Zd�Zd �Zd �Z dd�Z d�Zd �Ze d��Zejd��Ze d��Zejd��Ze d��Zejd��Ze d��Ze d��ZeZe d��Zd�Zdd�Zed��Zy)rc��t�r )�NotImplementedError��selfs r �_PopenzBaseProcess._PopenMs��!�!rNr)�daemonc�$�tt�}tj|fz|_tjj�|_t j�|_tj|_ d|_d|_||_ t|�|_t!|�|_|xs;t%|�j&dzdj)d�|jD��z|_|�||_t.j1|�y)NF�-�:c3�2K�|]}t|����y�wr )�str)�.0�is r � <genexpr>z'BaseProcess.__init__.<locals>.<genexpr>^s����=�n��c�!�f�n�s�)�next�_process_counterr � _identity�_config�copy�os�getpid�_parent_pid�name�_parent_namer�_closed�_target�tuple�_args�dict�_kwargs�type�__name__�join�_namer � _dangling�add)r�group�targetr1�args�kwargsr �counts r �__init__zBaseProcess.__init__Ps����%�&��)�3�3�u�h�>���'�/�/�4�4�6����9�9�;���,�1�1�������������4�[�� ��F�|����>�T�$�Z�0�0�3�6��X�X�=�d�n�n�=�=�>�� ��� �D�K�� � �d�rc�2�|jrtd��y)Nzprocess object is closed)r3� ValueErrorrs r � _check_closedzBaseProcess._check_closedcs���<�<��7�8�8�rc�l� |jr'|j|ji|j��yyr )r4r6r8rs r �runzBaseProcess.rungs0�� ��<�<��D�L�L�$�*�*�5����5�rc��� |j�t�|j|�|_|jj|_|`|`|`tj|�yr )rGrrr�sentinel� _sentinelr4r6r8rr>rs r �startzBaseProcess.startnsX�� � ���� � ��k�k�$�'������-�-��� �L�$�*�d�l�� � �d�rc�Z� |j�|jj�yr )rGr� terminaters r rOzBaseProcess.terminate�s%�� � ���������rc�Z� |j�|jj�yr )rGr�killrs r rQzBaseProcess.kill�s%�� � ���������rc�� |j�|jj|�}|�tj |�yyr )rGr�waitrr)r�timeout�ress r r;zBaseProcess.join�sC�� � �����k�k���w�'���?����d�#�rc�� |j�|tury|j�y|jj�}|�ytj|�y)NTF)rGr rrrr)r� returncodes r �is_alivezBaseProcess.is_alive�s\�� � �����#�#���;�;����[�[�%�%�'� �������d�#�rc��� |j�]|jj��td��|jj�d|_|`t j |�d|_y)Nz^Cannot close a process while it is still running. You should first call join() or terminate().T)rrrF�closerLrrr3rs r rZzBaseProcess.close�sl�� ��;�;�"��{�{���!�)� �"P�Q�Q��K�K�����D�K������d�#���rc��|jSr �r<rs r r1zBaseProcess.name�s���z�z�rc��||_yr r\)rr1s r r1zBaseProcess.name�s���� rc�<� |jjdd�S)Nr F)r,�getrs r r zBaseProcess.daemon�s �� ��|�|����%�0�0rc�$� ||jd<y)Nr �r,)r�daemonics r r zBaseProcess.daemon�s�� �"*����X�rc� �|jdS�N�authkeyrars r rezBaseProcess.authkey�s���|�|�I�&�&rc�6� t|�|jd<yrd)�AuthenticationStringr,)rres r rezBaseProcess.authkey�s�� �#7�w�"?����Y�rc�� |j�|j�|jS|jj�Sr )rGrrrs r �exitcodezBaseProcess.exitcode�s<�� � �����;�;���;�;���{�{���!�!rc�� |j�|turtj�S|jxr|jj Sr )rGr r.r/r�pidrs r �identzBaseProcess.ident�sA�� � �����#�#��9�9�;���;�;�2�4�;�;�?�?�2rc�p� |j� |jS#t$r td�d�wxYw)Nzprocess not started)rGrL�AttributeErrorrFrs r rKzBaseProcess.sentinel�sA�� � ���� >��>�>�!��� >��2�3��=� >�s��5c��d}|turd}nc|jrd}nT|jtj�k7rd}n0|j �d}n!|j j �}|�d}nd}t|�jd|jzg}|j �(|jd|j jz�|jd|jz�|j|�|�*tj||�}|jd |z�|jr|jd �ddj|�zS) N�started�closed�unknown�initial�stoppedzname=%rzpid=%sz parent=%szexitcode=%sr z<%s>� )r r3r0r.r/rrr9r:r<�appendrk�_exitcode_to_namer_r r;)rri�status�infos r �__repr__zBaseProcess.__repr__s�����#�#��F� �\�\��F� � � ����� ,��F� �[�[� ��F��{�{�'�'�)�H��#�"��"���T� �#�#�Y����%;�<���;�;�"��K�K��4�;�;�?�?�2�3����K�$�"2�"2�2�3����F����(�,�,�X�x�@�H��K�K� ��0�1��;�;��K�K��!�������&�&rc��ddlm}m} |j�|j |j�tjd�at�a |j�t}|at|j|j|�at j"r"t!j$�j'� |j)�~|j+d� |j-�d}|j/� t!jF�|j+d|z�|jI�|S#~wxYw#|j/�wxYw#t0$rw}|j2�d}n^t5|j2t6�r |j2}n7t8j:j=t?|j2�dz�d}Yd}~��d}~wd}ddl }t8j:j=d|jBz�|jE�Y��xYw#t!jF�|j+dz�|jI�wxYw)N�)�util�contextz child process calling self.run()r� zProcess %s: z process exiting with exitcode %d)%�r}r~� _start_method�_force_start_method� itertoolsrCr*�setr�_close_stdinr �_ParentProcessr2r0r� threading�_HAVE_THREAD_NATIVE_ID�main_thread�_set_native_id�_after_forkryrI�_exit_function� SystemExit�code� isinstance�int�sys�stderr�writer%� tracebackr1� print_exc� _shutdown�_flush_std_streams)r�parent_sentinelr}r~�old_processri�er�s r � _bootstrapzBaseProcess._bootstrap"s���#�( &��!�!�-��+�+�D�,>�,>�?�(���q�1����I�����*�K�#��,��!�!�4�#3�#3�_�F�O��/�/��%�%�'�6�6�8� �� � �"� ��I�I�8�9� &���� ����#�#�%� ���!��I�I�8�8�C�D��#�#�%����3 ���#�#�%��� ��v�v�~����A�F�F�C�(��6�6��� � � � ��Q�V�V��t�!3�4����� "��H���J�J���_�t�y�y�8�9����!�����!��I�I�8�8�C�D��#�#�%�sb�B1E�<D<�E�E�1E�H�<D?�?E�E�E� H� A-G� H�AH�H�:Ic�d�ddlm}|jj�|j �y)Nr|�r})r�r}�_finalizer_registry�clear�_run_after_forkersr�s r r�zBaseProcess._after_forkRs#���� � �&�&�(����!rr )r:� __module__�__qualname__rrDrGrIrMrOrQr;rXrZ�propertyr1�setterr rerirlrkrKrzr��staticmethodr�rrr rrGs4��� "�"�$�T��2����&9�6��$ �� $��&�"���� �[�[�����1��1��]�]�*��*��'��'� �^�^�@��@��"��"��3��3��C� � >�� >�'�>.�`�"��"rrc��eZdZd�Zy)rgc�V�ddlm}|��td��tt |�ffS)Nr|)�get_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)r~r�� TypeErrorrg�bytes)rr�s r � __reduce__zAuthenticationString.__reduce__^s3��/���'��2�� �$�e�D�k�^�3�3rN)r:r�r�r�rrr rgrg]s��4rrgc�4�eZdZd�Zd�Zed��Zdd�ZeZy)r�c�t�d|_||_||_d|_d|_d|_||_i|_y)NrF)r+r<�_pidr0rr3rLr,)rr1rkrKs r rDz_ParentProcess.__init__ns;������� ��� ����������!�����rc�:�ddlm}||jgd��S�Nr)rS)rT��multiprocessing.connectionrSrL)rrSs r rXz_ParentProcess.is_alivexs��3�����(�!�4�4�4rc��|jSr )r�rs r rlz_ParentProcess.ident|s���y�y�rNc�<� ddlm}||jg|��yr�r�)rrTrSs r r;z_ParentProcess.join�s�� � 4��d�n�n� �w�/rr ) r:r�r�rDrXr�rlr;rkrrr r�r�ls,���5�����0��Crr�c��eZdZd�Zd�Zy)�_MainProcessc��d|_d|_d|_d|_d|_tt jd��dd�|_y)Nr�MainProcessF� z/mp)re� semprefix) r+r<r0rr3rgr.�urandomr,rs r rDz_MainProcess.__init__�sB�����"�� ����������#7�� � �2��#G�%*�,��rc��yr rrs r rZz_MainProcess.close�s��rN)r:r�r�rDrZrrr r�r��s��,�$ rr�r|��SIG�_r")$�__all__r.r��signalr�r��_weakrefsetr�path�abspath�getcwd�ORIGINAL_DIR�OSErrorrrrr�objectrr�rgr�r�rr rCr*r�rrwr�__dict__�itemsr1�signumr=rrr �<module>r�s&���� � � ������7�7�?�?�9�2�9�9�;�/�L����!�O"�&�O"�l4�5�4��[��B �;� �0���>��"�9�?�?�1�%���E� ��������.�.�0�1�L�D�&��B�Q�x���3�d�?�'(���Z��6�'�"�2� �&� �I� ��s���L��s�*C0�0C:�9C:PK:W�\1`�_aEaE#__pycache__/process.cpython-312.pycnu�[���� T��hk/���gd�ZddlZddlZddlZddlZddlZddlmZ ejjej��Zd�Z d�Zd�Zd�ZGd�d e�ZGd �de�ZGd�d e�ZGd�de�Zdae�aej2d�ae�a[iZeej>jA��D]\Z!Z"e!dddk(s�de!vs�de!��ee"<�[!["e�Z#y#e$rdZY��wxYw))�BaseProcess�current_process�active_children�parent_process�N)�WeakSetc��tS)z@ Return process object representing the current process )�_current_process���0/usr/lib64/python3.12/multiprocessing/process.pyrr%s ���rc�4�t�tt�S)zN Return list of process objects corresponding to live child processes )�_cleanup�list� _childrenr rrrr+s�� �J�� �?�rc��tS)z? Return process object representing the parent process )�_parent_processr rrrr3s ���rc��tt�D]7}|jx}s�|j���#tj |��9y�N)rr�_popen�poll�discard)�p�child_popens rrr=s;�� �)�_���8�8�#�K�#��)9�)9�);�)G����a� �rc�N�eZdZdZd�Zddddifdd�d�Zd�Zd�Zd �Zd �Z d�Z dd�Zd �Zd�Z ed��Zej d��Zed��Zej d��Zed��Zej d��Zed��Zed��ZeZed��Zd�Zdd�Zed��Zy)rz� Process objects represent activity that is run in a separate process The class is analogous to `threading.Thread` c��t�r)�NotImplementedError��selfs r�_PopenzBaseProcess._PopenMs��!�!rNr )�daemonc�6�|�Jd��tt�}tj|fz|_tjj�|_t j�|_tj|_ d|_d|_||_ t|�|_t!|�|_|xs;t%|�j&dzdj)d�|jD��z|_|�||_t.j1|�y)Nz#group argument must be None for nowF�-�:c3�2K�|]}t|����y�wr)�str)�.0�is r� <genexpr>z'BaseProcess.__init__.<locals>.<genexpr>^s����=�n��c�!�f�n�s�)�next�_process_counterr � _identity�_config�copy�os�getpid�_parent_pid�name�_parent_namer�_closed�_target�tuple�_args�dict�_kwargs�type�__name__�join�_namer � _dangling�add)r�group�targetr1�args�kwargsr �counts r�__init__zBaseProcess.__init__Ps����}�C�C�C�}��%�&��)�3�3�u�h�>���'�/�/�4�4�6����9�9�;���,�1�1�������������4�[�� ��F�|����>�T�$�Z�0�0�3�6��X�X�=�d�n�n�=�=�>�� ��� �D�K�� � �d�rc�2�|jrtd��y)Nzprocess object is closed)r3� ValueErrorrs r� _check_closedzBaseProcess._check_closedcs���<�<��7�8�8�rc�j�|jr'|j|ji|j��yy)zQ Method to be run in sub-process; can be overridden in sub-class N)r4r6r8rs r�runzBaseProcess.rungs+���<�<��D�L�L�$�*�*�5����5�rc��|j�|j�Jd��|jtj�k(sJd��t jjd�rJd��t�|j|�|_|jj|_|`|` |`tj!|�y)z% Start child process Nzcannot start a process twicez:can only start a process object created by current processr z3daemonic processes are not allowed to have children)rGrr0r.r/r r,�getrr�sentinel� _sentinelr4r6r8rr>rs r�startzBaseProcess.startns��� �����{�{�"�B�$B�B�"����2�9�9�;�.� L�K� L�.�#�+�+�/�/��9� E�D� E�9�� ��k�k�$�'������-�-��� �L�$�*�d�l�� � �d�rc�X�|j�|jj�y)zT Terminate process; sends SIGTERM signal or uses TerminateProcess() N)rGr� terminaters rrPzBaseProcess.terminate�s �� ���������rc�X�|j�|jj�y)zT Terminate process; sends SIGKILL signal or uses TerminateProcess() N)rGr�killrs rrRzBaseProcess.kill�s �� ���������rc��|j�|jtj�k(sJd��|j�Jd��|jj|�}|�tj|�yy)z5 Wait until child process terminates zcan only join a child processNzcan only join a started process)rGr0r.r/r�waitrr)r�timeout�ress rr;zBaseProcess.join�sr�� �������2�9�9�;�.�O�0O�O�.��{�{�&�I�(I�I�&��k�k���w�'���?����d�#�rc��|j�|tury|jtj�k(sJd��|j �y|j j �}|�ytj|�y)z1 Return whether process is alive Tzcan only test a child processF) rGr r0r.r/rrrr)r� returncodes r�is_alivezBaseProcess.is_alive�su�� �����#�#�����2�9�9�;�.�O�0O�O�.��;�;����[�[�%�%�'� �������d�#�rc���|j�]|jj��td��|jj�d|_|`t j |�d|_y)z� Close the Process object. This method releases resources held by the Process object. It is an error to call this method if the child process is still running. Nz^Cannot close a process while it is still running. You should first call join() or terminate().T)rrrF�closerMrrr3rs rr[zBaseProcess.close�sg���;�;�"��{�{���!�)� �"P�Q�Q��K�K�����D�K������d�#���rc��|jSr)r<rs rr1zBaseProcess.name�s���z�z�rc�@�t|t�sJd��||_y)Nzname must be a string)� isinstancer%r<)rr1s rr1zBaseProcess.name�s���$��$�=�&=�=�$��� rc�:�|jjdd�S)z4 Return whether process is a daemon r F)r,rKrs rr zBaseProcess.daemon�s�� �|�|����%�0�0rc�H�|j�Jd��||jd<y)z1 Set whether process is a daemon Nzprocess has already startedr )rr,)r�daemonics rr zBaseProcess.daemon�s(�� �{�{�"�A�$A�A�"�!)����X�rc� �|jdS)N�authkey)r,rs rrczBaseProcess.authkey�s���|�|�I�&�&rc�4�t|�|jd<y)z2 Set authorization key of process rcN)�AuthenticationStringr,)rrcs rrczBaseProcess.authkey�s�� #7�w�"?����Y�rc��|j�|j�|jS|jj�S)zM Return exit code of process or `None` if it has yet to stop )rGrrrs r�exitcodezBaseProcess.exitcode�s7�� �����;�;���;�;���{�{���!�!rc��|j�|turtj�S|jxr|jj S)zU Return identifier (PID) of process or `None` if it has yet to start )rGr r.r/r�pidrs r�identzBaseProcess.ident�s<�� �����#�#��9�9�;���;�;�2�4�;�;�?�?�2rc�n�|j� |jS#t$r td�d�wxYw)z{ Return a file descriptor (Unix) or handle (Windows) suitable for waiting for process termination. zprocess not startedN)rGrM�AttributeErrorrFrs rrLzBaseProcess.sentinel�s<�� ���� >��>�>�!��� >��2�3��=� >�s��4c��d}|turd}nc|jrd}nT|jtj�k7rd}n0|j �d}n!|j j �}|�d}nd}t|�jd|jzg}|j �(|jd|j jz�|jd|jz�|j|�|�*tj||�}|jd |z�|jr|jd �ddj|�zS) N�started�closed�unknown�initial�stoppedzname=%rzpid=%sz parent=%szexitcode=%sr z<%s>� )r r3r0r.r/rrr9r:r<�appendri�_exitcode_to_namerKr r;)rrg�status�infos r�__repr__zBaseProcess.__repr__s�����#�#��F� �\�\��F� � � ����� ,��F� �[�[� ��F��{�{�'�'�)�H��#�"��"���T� �#�#�Y����%;�<���;�;�"��K�K��4�;�;�?�?�2�3����K�$�"2�"2�2�3����F����(�,�,�X�x�@�H��K�K� ��0�1��;�;��K�K��!�������&�&rc��ddlm}m} |j�|j |j�tjd�at�a |j�t}|at|j|j|�at j"r"t!j$�j'� |j)�~|j+d� |j-�d}|j/� t!jF�|j+d|z�|jI�|S#~wxYw#|j/�wxYw#t0$rw}|j2�d}n^t5|j2t6�r |j2}n7t8j:j=t?|j2�dz�d}Yd}~��d}~wd}ddl }t8j:j=d|jBz�|jE�Y��xYw#t!jF�|j+dz�|jI�wxYw)N�)�util�contextz child process calling self.run()r� zProcess %s: z process exiting with exitcode %d)%�r{r|� _start_method�_force_start_method� itertoolsrCr*�setr�_close_stdinr �_ParentProcessr2r0r� threading�_HAVE_THREAD_NATIVE_ID�main_thread�_set_native_id�_after_forkrwrI�_exit_function� SystemExit�coder^�int�sys�stderr�writer%� tracebackr1� print_exc� _shutdown�_flush_std_streams)r�parent_sentinelr{r|�old_processrg�er�s r� _bootstrapzBaseProcess._bootstrap"s���#�( &��!�!�-��+�+�D�,>�,>�?�(���q�1����I�����*�K�#��,��!�!�4�#3�#3�_�F�O��/�/��%�%�'�6�6�8� �� � �"� ��I�I�8�9� &���� ����#�#�%� ���!��I�I�8�8�C�D��#�#�%����3 ���#�#�%��� ��v�v�~����A�F�F�C�(��6�6��� � � � ��Q�V�V��t�!3�4����� "��H���J�J���_�t�y�y�8�9����!�����!��I�I�8�8�C�D��#�#�%�sb�B1E�<D<�E�E�1E�H�<D?�?E�E�E� H� A-G� H�AH�H�:Ic�d�ddlm}|jj�|j �y)Nrz�r{)r~r{�_finalizer_registry�clear�_run_after_forkersr�s rr�zBaseProcess._after_forkRs#���� � �&�&�(����!rr)r:� __module__�__qualname__�__doc__rrDrGrIrNrPrRr;rYr[�propertyr1�setterr rcrgrjrirLrxr��staticmethodr�r rrrrGs4��� "�"�$�T��2����&9�6��$ �� $��&�"���� �[�[�����1��1��]�]�*��*��'��'� �^�^�@��@��"��"��3��3��C� � >�� >�'�>.�`�"��"rrc��eZdZd�Zy)rec�V�ddlm}|��td��tt |�ffS)Nrz)�get_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)r|r�� TypeErrorre�bytes)rr�s r� __reduce__zAuthenticationString.__reduce__^s3��/���'��2�� �$�e�D�k�^�3�3rN)r:r�r�r�r rrrere]s��4rrec�4�eZdZd�Zd�Zed��Zdd�ZeZy)r�c�t�d|_||_||_d|_d|_d|_||_i|_y)Nr F)r+r<�_pidr0rr3rMr,)rr1rirLs rrDz_ParentProcess.__init__ns;������� ��� ����������!�����rc�:�ddlm}||jgd��S)Nr�rT�rU��multiprocessing.connectionrTrM)rrTs rrYz_ParentProcess.is_alivexs��3�����(�!�4�4�4rc��|jSr)r�rs rrjz_ParentProcess.ident|s���y�y�rNc�:�ddlm}||jg|��y)z6 Wait until parent process terminates rr�r�Nr�)rrUrTs rr;z_ParentProcess.join�s�� 4��d�n�n� �w�/rr) r:r�r�rDrYr�rjr;rir rrr�r�ls,���5�����0��Crr�c��eZdZd�Zd�Zy)�_MainProcessc��d|_d|_d|_d|_d|_tt jd��dd�|_y)Nr �MainProcessF� z/mp)rc� semprefix) r+r<r0rr3rer.�urandomr,rs rrDz_MainProcess.__init__�sB�����"�� ����������#7�� � �2��#G�%*�,��rc��yrr rs rr[z_MainProcess.close�s��rN)r:r�r�rDr[r rrr�r��s��,�$ rr�rz��SIG�_r")$�__all__r.r��signalr�r��_weakrefsetr�path�abspath�getcwd�ORIGINAL_DIR�OSErrorrrrr�objectrr�rer�r�rr rCr*r�rrur�__dict__�itemsr1�signumr=r rr�<module>r�s&���� � � ������7�7�?�?�9�2�9�9�;�/�L����!�O"�&�O"�l4�5�4��[��B �;� �0���>��"�9�?�?�1�%���E� ��������.�.�0�1�L�D�&��B�Q�x���3�d�?�'(���Z��6�'�"�2� �&� �I� ��s���L��s�*C0�0C:�9C:PK:W�\&l�7vGvG(__pycache__/queues.cpython-312.opt-1.pycnu�[���� T��h�1���gd�ZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z mZddlZddl mZddl mZej j"ZddlmZmZmZmZmZGd�d e�Ze�ZGd �de�ZGd�d e�Zy))�Queue�SimpleQueue� JoinableQueue�N)�Empty�Full�)� connection)�context)�debug�info�Finalize�register_after_fork� is_exitingc���eZdZdd�Zd�Zd�Zd�Zdd�Zdd�Zdd�Z d �Z d �Zd�Zd�Z d �Zd�Zd�Zd�Zd�Zd�Zed��Zed��Zed��Zed��Zeej6�Zy)rc���|dkrddlm}||_tjd��\|_|_|j�|_tj�|_tjdk(rd|_n|j�|_|j|�|_d|_|j%�tjdk7rt'|t(j*�yy)Nrr)� SEM_VALUE_MAXF��duplex�win32)�synchronizer�_maxsizer �Pipe�_reader�_writer�Lock�_rlock�os�getpid�_opid�sys�platform�_wlock�BoundedSemaphore�_sem� _ignore_epipe�_resetrr�_after_fork��self�maxsize�ctxs �//usr/lib64/python3.12/multiprocessing/queues.py�__init__zQueue.__init__%s����a�<�=��� �%/�_�_�E�%B�"���d�l��h�h�j����Y�Y�[�� ��<�<�7�"��D�K��(�(�*�D�K��(�(��1�� �"������ ��<�<�7�"���e�&7�&7�8�#�c���tj|�|j|j|j|j |j|j|j|jfS�N) r �assert_spawningr%rrrrr"r$r�r)s r,�__getstate__zQueue.__getstate__9sP������%��"�"�D�M�M�4�<�<�������T�[�[�$�)�)�T�Z�Z�A� Ar.c ��|\|_|_|_|_|_|_|_|_|j�yr0) r%rrrrr"r$rr&�r)�states r,�__setstate__zQueue.__setstate__>s5��<A� :�� �T�]�D�L�$�,� ��d�k�4�9�d�j���� r.c�>�td�|jd��y)NzQueue._after_fork()T)� after_fork)rr&r2s r,r'zQueue._after_forkCs�� �#�$����t��$r.c��|r|jj�n,tjtj��|_tj�|_d|_d|_ d|_ d|_d|_|jj|_|j j"|_|j j&|_y�NF)� _notempty�_at_fork_reinit� threading� Conditionr�collections�deque�_buffer�_thread�_jointhread�_joincancelled�_closed�_closer� send_bytes�_send_bytesr� recv_bytes�_recv_bytes�poll�_poll)r)r9s r,r&zQueue._resetGs�����N�N�*�*�,�&�0�0����1A�B�D�N�"�(�(�*���������#����������<�<�2�2����<�<�2�2����\�\�&�&�� r.Nc�b�|jrtd|�d���|jj||�st�|j 5|j�|j�|jj|�|j j�ddd�y#1swYyxYw�NzQueue z is closed)rF� ValueErrorr$�acquirerr<rC� _start_threadrB�append�notify�r)�obj�block�timeouts r,�putz Queue.putVs���<�<��v�d�X�Z�8�9�9��y�y� � ���0��J� �^�^��|�|�#��"�"�$��L�L����$��N�N�!�!�#� �^�^�s � AB%�%B.c���|jrtd|�d���|rB|�@|j5|j�}ddd�|jj�n�|rt j�|z}|jj||�st� |r.t j�z }|j|�st�|j�st�|j�}|jj�|jj�tj�S#1swY��xYw#|jj�wxYwrO) rFrPrrKr$�release�time� monotonicrQrrM�_ForkingPickler�loads)r)rWrX�res�deadlines r,�getz Queue.getbs ���<�<��v�d�X�Z�8�9�9��W�_�����&�&�(����I�I������>�>�+�g�5���;�;�&�&�u�g�6��� &��&����)9�9�G��:�:�g�.�#�������K��&�&�(��� � �!�!�#����#�#�%��$�$�S�)�)�)���$���#�#�%�s�D;�A0E�;E�E#c�d�|j|jjj�z Sr0)rr$�_semlock� _get_valuer2s r,�qsizezQueue.qsize|s$���}�}�t�y�y�1�1�<�<�>�>�>r.c�$�|j�Sr0�rMr2s r,�emptyzQueue.empty�����:�:�<��r.c�J�|jjj�Sr0)r$rd�_is_zeror2s r,�fullz Queue.full�s���y�y�!�!�*�*�,�,r.c�$�|jd�Sr;)rbr2s r,� get_nowaitzQueue.get_nowait�s���x�x���r.c�&�|j|d�Sr;)rY�r)rVs r,� put_nowaitzQueue.put_nowait�s���x�x��U�#�#r.c�L�d|_|j}|rd|_|�yy)NT)rFrG)r)�closes r,rtzQueue.close�s&�����������D�K��G�r.c�T�td�|jr|j�yy)NzQueue.join_thread())rrDr2s r,�join_threadzQueue.join_thread�s%�� �#�$��������r.c�|�td�d|_ |jj�y#t$rYywxYw)NzQueue.cancel_join_thread()T)rrErD�cancel�AttributeErrorr2s r,�cancel_join_threadzQueue.cancel_join_thread�s<�� �*�+�"��� ����#�#�%��� �� �s�/� ;�;c���|jj�tjdk(r|jj�|j�|j�y)Nr)rrtr r!rrvr2s r,�_terminate_brokenzQueue._terminate_broken�sG�� �������<�<�7�"��L�L��� �� � �����r.c�,�td�|jj�tjt j|j|j|j|j|jj|jj|j|j|jf dd��|_ td�|j j#�td�|j$sJt'|j t j(t+j,|j �gd��|_t'|t j0|j|jgd ��|_y#d|_�xYw) NzQueue._start_thread()�QueueFeederThreadT)�target�args�name�daemonzdoing self._thread.start()z... done self._thread.start()���)�exitpriority� )rrB�clearr>�Threadr�_feedr<rIr"rrtrr%�_on_queue_feeder_errorr$rC�startrEr �_finalize_join�weakref�refrD�_finalize_closerGr2s r,rRzQueue._start_thread�s2�� �%�&� ������ �'�'��;�;��,�,�����0@�0@��+�+�t�|�|�1�1�4�<�<�3E�3E��$�$�d�&A�&A��)�)��%�� ��� ��.�/��L�L��� ��1�2��"�"�'����e�2�2����T�\�\�*�+�� �D����%�'�'� �\�\�4�>�>�*������ � �D�L��s� 0F � Fc�z�td�|�}|�|j�td�ytd�y)Nzjoining queue threadz... queue thread joinedz... queue thread already dead)r�join)�twr�threads r,r�zQueue._finalize_join�s3�� �$�%�������K�K�M��+�,��1�2r.c��td�|5|jt�|j�ddd�y#1swYyxYw)Nztelling queue thread to quit)rrS� _sentinelrT)�buffer�notemptys r,r�zQueue._finalize_close�s.�� �,�-� ��M�M�)�$��O�O���X�X�s �&=�Ac ��td�|j} |j} |j}|j}t } tjdk7r|j}|j}nd} | � |s|�| � |�}|| urtd�|�|�ytj|�}|� ||�n|� ||���]#| �wxYw#�wxYw#t$rYnwxYwno#t$rc}|r#t|dd�tjk(rYd}~yt�rt!d|�Yd}~y|j�||�Yd}~nd}~wwxYw��)Nz$starting thread to feed data to piperz%feeder thread got sentinel -- exiting�errnorzerror in queue thread: %s)rrQr[�wait�popleftr�r r!r^�dumps� IndexError� Exception�getattrr��EPIPErr)r�r�rH� writelock�reader_close�writer_close�ignore_epipe�onerror� queue_sem�nacquire�nrelease�nwait�bpopleft�sentinel�wacquire�wreleaserV�es r,r�zQueue._feed�sh�� �4�5��#�#���#�#��� � ���>�>�����<�<�7�"� �(�(�H� �(�(�H��H��- $�� ��!����J���&�j���(�?�!�"I�J�(�N�(�N�"�.�3�3�C�8��#�+�&�s�O�$�J�+� *�3�� (� �#���J��&!)� ��!�������� $��G�A�w��$:�e�k�k�$I�� �<��4�a�8���%�%�'��A�s�O�O��# $��;sx�2D�: C)�D�%D�1'D�C5�!D�) C2�2D�5 C>�>D� D � D�D � D� E=� E8�?E8�E8�8E=c�,�ddl}|j�y)z� Private API hook called when feeding data in the background thread raises an exception. For overriding by concurrent.futures. rN)� traceback� print_exc)r�rVr�s r,r�zQueue._on_queue_feeder_error&s�� ����r.�r)F�TN)�__name__� __module__�__qualname__r-r3r7r'r&rYrbrfrirmrorrrtrvrzr|rR�staticmethodr�r�r�r��classmethod�types�GenericAlias�__class_getitem__�r.r,rr#s���9�(A� � %� '� $�*�4?� �-��$�����%�N�3��3������<$��<$�|����$�E�$6�$6�7�r.rc�4�eZdZdd�Zd�Zd�Zd d�Zd�Zd�Zy) rc��tj|||��|jd�|_|j �|_y)N)r+r)rr-� Semaphore�_unfinished_tasksr?�_condr(s r,r-zJoinableQueue.__init__>s2�� ���t�W�#��.�!$���q�!1����]�]�_�� r.c�^�tj|�|j|jfzSr0)rr3r�r�r2s r,r3zJoinableQueue.__getstate__Cs'���!�!�$�'�4�:�:�t�7M�7M�*N�N�Nr.c�Z�tj||dd�|dd\|_|_y)N���)rr7r�r�r5s r,r7zJoinableQueue.__setstate__Fs-�� ���4��s���,�-2�2�3�Z�*�� �D�*r.Nc���|jrtd|�d���|jj||�st�|j 5|j5|j�|j�|jj|�|jj�|j j�ddd�ddd�y#1swY�xYw#1swYyxYwrO)rFrPr$rQrr<r�rCrRrBrSr�r[rTrUs r,rYzJoinableQueue.putJs����<�<��v�d�X�Z�8�9�9��y�y� � ���0��J� �^�^�T�Z�Z��|�|�#��"�"�$��L�L����$��"�"�*�*�,��N�N�!�!�#�(�^�^�Z�Z��^�^�s%� C �A,C�C �C �C � C)c��|j5|jjd�std��|jjj�r|jj �ddd�y#1swYyxYw)NFz!task_done() called too many times)r�r�rQrPrdrl� notify_allr2s r,� task_donezJoinableQueue.task_doneWs[�� �Z�Z��)�)�1�1�%�8� �!D�E�E��%�%�.�.�7�7�9�� � �%�%�'� �Z�Z�s�A%A;�;Bc���|j5|jjj�s|jj �ddd�y#1swYyxYwr0)r�r�rdrlr�r2s r,r�zJoinableQueue.join^s9�� �Z�Z��)�)�2�2�;�;�=�� � ���!��Z�Z�s�?A�Ar�r�) r�r�r�r-r3r7rYr�r�r�r.r,rr<s!��%� O�8�$�(�"r.rc�Z�eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z e ej�Z y) rc� �tjd��\|_|_|j �|_|jj|_tjdk(rd|_ y|j �|_ y)NFrr)r rrrrrrLrMr r!r")r)r+s r,r-zSimpleQueue.__init__isW��%/�_�_�E�%B�"���d�l��h�h�j����\�\�&�&�� ��<�<�7�"��D�K��(�(�*�D�Kr.c�l�|jj�|jj�yr0)rrtrr2s r,rtzSimpleQueue.closers"�������������r.c�$�|j�Sr0rhr2s r,rizSimpleQueue.emptyvrjr.c��tj|�|j|j|j|j fSr0)r r1rrrr"r2s r,r3zSimpleQueue.__getstate__ys/������%����d�l�l�D�K�K����E�Er.c�p�|\|_|_|_|_|jj|_yr0)rrrr"rLrMr5s r,r7zSimpleQueue.__setstate__}s)��AF�>���t�|�T�[�$�+��\�\�&�&�� r.c��|j5|jj�}ddd�tj �S#1swY�xYwr0)rrrJr^r_)r)r`s r,rbzSimpleQueue.get�s;�� �[�[��,�,�)�)�+�C���$�$�S�)�)��[�s�A�Ac��tj|�}|j�|jj |�y|j5|jj |�ddd�y#1swYyxYwr0)r^r�r"rrHrqs r,rYzSimpleQueue.put�sQ���#�#�C�(���;�;���L�L�#�#�C�(�������'�'��,����s� A/�/A8N)r�r�r�r-rtrir3r7rbrYr�r�r�r�r�r.r,rrgs9��%�� �F�'�*�-�$�E�$6�$6�7�r.r)�__all__r rr>r@r\r�r�r��queuerr�_multiprocessing�r r � reduction�ForkingPicklerr^�utilrrr rr�objectrr�rrr�r.r,�<module>r�sx��4�� � ������������#�#�2�2��H�H�L8�F�L8�^ �H� �%"�E�%"�V*8�&�*8r.PK:W�\Y#��F�F(__pycache__/queues.cpython-312.opt-2.pycnu�[���� T��h�1���gd�ZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z mZddlZddl mZddl mZej j"ZddlmZmZmZmZmZGd�d e�Ze�ZGd �de�ZGd�d e�Zy))�Queue�SimpleQueue� JoinableQueue�N)�Empty�Full�)� connection)�context)�debug�info�Finalize�register_after_fork� is_exitingc���eZdZdd�Zd�Zd�Zd�Zdd�Zdd�Zdd�Z d �Z d �Zd�Zd�Z d �Zd�Zd�Zd�Zd�Zd�Zed��Zed��Zed��Zed��Zeej6�Zy)rc���|dkrddlm}||_tjd��\|_|_|j�|_tj�|_tjdk(rd|_n|j�|_|j|�|_d|_|j%�tjdk7rt'|t(j*�yy)Nrr)� SEM_VALUE_MAXF��duplex�win32)�synchronizer�_maxsizer �Pipe�_reader�_writer�Lock�_rlock�os�getpid�_opid�sys�platform�_wlock�BoundedSemaphore�_sem� _ignore_epipe�_resetrr�_after_fork��self�maxsize�ctxs �//usr/lib64/python3.12/multiprocessing/queues.py�__init__zQueue.__init__%s����a�<�=��� �%/�_�_�E�%B�"���d�l��h�h�j����Y�Y�[�� ��<�<�7�"��D�K��(�(�*�D�K��(�(��1�� �"������ ��<�<�7�"���e�&7�&7�8�#�c���tj|�|j|j|j|j |j|j|j|jfS�N) r �assert_spawningr%rrrrr"r$r�r)s r,�__getstate__zQueue.__getstate__9sP������%��"�"�D�M�M�4�<�<�������T�[�[�$�)�)�T�Z�Z�A� Ar.c ��|\|_|_|_|_|_|_|_|_|j�yr0) r%rrrrr"r$rr&�r)�states r,�__setstate__zQueue.__setstate__>s5��<A� :�� �T�]�D�L�$�,� ��d�k�4�9�d�j���� r.c�>�td�|jd��y)NzQueue._after_fork()T)� after_fork)rr&r2s r,r'zQueue._after_forkCs�� �#�$����t��$r.c��|r|jj�n,tjtj��|_tj�|_d|_d|_ d|_ d|_d|_|jj|_|j j"|_|j j&|_y�NF)� _notempty�_at_fork_reinit� threading� Conditionr�collections�deque�_buffer�_thread�_jointhread�_joincancelled�_closed�_closer� send_bytes�_send_bytesr� recv_bytes�_recv_bytes�poll�_poll)r)r9s r,r&zQueue._resetGs�����N�N�*�*�,�&�0�0����1A�B�D�N�"�(�(�*���������#����������<�<�2�2����<�<�2�2����\�\�&�&�� r.Nc�b�|jrtd|�d���|jj||�st�|j 5|j�|j�|jj|�|j j�ddd�y#1swYyxYw�NzQueue z is closed)rF� ValueErrorr$�acquirerr<rC� _start_threadrB�append�notify�r)�obj�block�timeouts r,�putz Queue.putVs���<�<��v�d�X�Z�8�9�9��y�y� � ���0��J� �^�^��|�|�#��"�"�$��L�L����$��N�N�!�!�#� �^�^�s � AB%�%B.c���|jrtd|�d���|rB|�@|j5|j�}ddd�|jj�n�|rt j�|z}|jj||�st� |r.t j�z }|j|�st�|j�st�|j�}|jj�|jj�tj�S#1swY��xYw#|jj�wxYwrO) rFrPrrKr$�release�time� monotonicrQrrM�_ForkingPickler�loads)r)rWrX�res�deadlines r,�getz Queue.getbs ���<�<��v�d�X�Z�8�9�9��W�_�����&�&�(����I�I������>�>�+�g�5���;�;�&�&�u�g�6��� &��&����)9�9�G��:�:�g�.�#�������K��&�&�(��� � �!�!�#����#�#�%��$�$�S�)�)�)���$���#�#�%�s�D;�A0E�;E�E#c�d�|j|jjj�z Sr0)rr$�_semlock� _get_valuer2s r,�qsizezQueue.qsize|s$���}�}�t�y�y�1�1�<�<�>�>�>r.c�$�|j�Sr0�rMr2s r,�emptyzQueue.empty�����:�:�<��r.c�J�|jjj�Sr0)r$rd�_is_zeror2s r,�fullz Queue.full�s���y�y�!�!�*�*�,�,r.c�$�|jd�Sr;)rbr2s r,� get_nowaitzQueue.get_nowait�s���x�x���r.c�&�|j|d�Sr;)rY�r)rVs r,� put_nowaitzQueue.put_nowait�s���x�x��U�#�#r.c�L�d|_|j}|rd|_|�yy)NT)rFrG)r)�closes r,rtzQueue.close�s&�����������D�K��G�r.c�T�td�|jr|j�yy)NzQueue.join_thread())rrDr2s r,�join_threadzQueue.join_thread�s%�� �#�$��������r.c�|�td�d|_ |jj�y#t$rYywxYw)NzQueue.cancel_join_thread()T)rrErD�cancel�AttributeErrorr2s r,�cancel_join_threadzQueue.cancel_join_thread�s<�� �*�+�"��� ����#�#�%��� �� �s�/� ;�;c���|jj�tjdk(r|jj�|j�|j�y)Nr)rrtr r!rrvr2s r,�_terminate_brokenzQueue._terminate_broken�sG�� �������<�<�7�"��L�L��� �� � �����r.c�,�td�|jj�tjt j|j|j|j|j|jj|jj|j|j|jf dd��|_ td�|j j#�td�|j$sJt'|j t j(t+j,|j �gd��|_t'|t j0|j|jgd ��|_y#d|_�xYw) NzQueue._start_thread()�QueueFeederThreadT)�target�args�name�daemonzdoing self._thread.start()z... done self._thread.start()���)�exitpriority� )rrB�clearr>�Threadr�_feedr<rIr"rrtrr%�_on_queue_feeder_errorr$rC�startrEr �_finalize_join�weakref�refrD�_finalize_closerGr2s r,rRzQueue._start_thread�s2�� �%�&� ������ �'�'��;�;��,�,�����0@�0@��+�+�t�|�|�1�1�4�<�<�3E�3E��$�$�d�&A�&A��)�)��%�� ��� ��.�/��L�L��� ��1�2��"�"�'����e�2�2����T�\�\�*�+�� �D����%�'�'� �\�\�4�>�>�*������ � �D�L��s� 0F � Fc�z�td�|�}|�|j�td�ytd�y)Nzjoining queue threadz... queue thread joinedz... queue thread already dead)r�join)�twr�threads r,r�zQueue._finalize_join�s3�� �$�%�������K�K�M��+�,��1�2r.c��td�|5|jt�|j�ddd�y#1swYyxYw)Nztelling queue thread to quit)rrS� _sentinelrT)�buffer�notemptys r,r�zQueue._finalize_close�s.�� �,�-� ��M�M�)�$��O�O���X�X�s �&=�Ac ��td�|j} |j} |j}|j}t } tjdk7r|j}|j}nd} | � |s|�| � |�}|| urtd�|�|�ytj|�}|� ||�n|� ||���]#| �wxYw#�wxYw#t$rYnwxYwno#t$rc}|r#t|dd�tjk(rYd}~yt�rt!d|�Yd}~y|j�||�Yd}~nd}~wwxYw��)Nz$starting thread to feed data to piperz%feeder thread got sentinel -- exiting�errnorzerror in queue thread: %s)rrQr[�wait�popleftr�r r!r^�dumps� IndexError� Exception�getattrr��EPIPErr)r�r�rH� writelock�reader_close�writer_close�ignore_epipe�onerror� queue_sem�nacquire�nrelease�nwait�bpopleft�sentinel�wacquire�wreleaserV�es r,r�zQueue._feed�sh�� �4�5��#�#���#�#��� � ���>�>�����<�<�7�"� �(�(�H� �(�(�H��H��- $�� ��!����J���&�j���(�?�!�"I�J�(�N�(�N�"�.�3�3�C�8��#�+�&�s�O�$�J�+� *�3�� (� �#���J��&!)� ��!�������� $��G�A�w��$:�e�k�k�$I�� �<��4�a�8���%�%�'��A�s�O�O��# $��;sx�2D�: C)�D�%D�1'D�C5�!D�) C2�2D�5 C>�>D� D � D�D � D� E=� E8�?E8�E8�8E=c�.� ddl}|j�y)Nr)� traceback� print_exc)r�rVr�s r,r�zQueue._on_queue_feeder_error&s�� � ����r.�r)F�TN)�__name__� __module__�__qualname__r-r3r7r'r&rYrbrfrirmrorrrtrvrzr|rR�staticmethodr�r�r�r��classmethod�types�GenericAlias�__class_getitem__�r.r,rr#s���9�(A� � %� '� $�*�4?� �-��$�����%�N�3��3������<$��<$�|����$�E�$6�$6�7�r.rc�4�eZdZdd�Zd�Zd�Zd d�Zd�Zd�Zy) rc��tj|||��|jd�|_|j �|_y)N)r+r)rr-� Semaphore�_unfinished_tasksr?�_condr(s r,r-zJoinableQueue.__init__>s2�� ���t�W�#��.�!$���q�!1����]�]�_�� r.c�^�tj|�|j|jfzSr0)rr3r�r�r2s r,r3zJoinableQueue.__getstate__Cs'���!�!�$�'�4�:�:�t�7M�7M�*N�N�Nr.c�Z�tj||dd�|dd\|_|_y)N���)rr7r�r�r5s r,r7zJoinableQueue.__setstate__Fs-�� ���4��s���,�-2�2�3�Z�*�� �D�*r.Nc���|jrtd|�d���|jj||�st�|j 5|j5|j�|j�|jj|�|jj�|j j�ddd�ddd�y#1swY�xYw#1swYyxYwrO)rFrPr$rQrr<r�rCrRrBrSr�r[rTrUs r,rYzJoinableQueue.putJs����<�<��v�d�X�Z�8�9�9��y�y� � ���0��J� �^�^�T�Z�Z��|�|�#��"�"�$��L�L����$��"�"�*�*�,��N�N�!�!�#�(�^�^�Z�Z��^�^�s%� C �A,C�C �C �C � C)c��|j5|jjd�std��|jjj�r|jj �ddd�y#1swYyxYw)NFz!task_done() called too many times)r�r�rQrPrdrl� notify_allr2s r,� task_donezJoinableQueue.task_doneWs[�� �Z�Z��)�)�1�1�%�8� �!D�E�E��%�%�.�.�7�7�9�� � �%�%�'� �Z�Z�s�A%A;�;Bc���|j5|jjj�s|jj �ddd�y#1swYyxYwr0)r�r�rdrlr�r2s r,r�zJoinableQueue.join^s9�� �Z�Z��)�)�2�2�;�;�=�� � ���!��Z�Z�s�?A�Ar�r�) r�r�r�r-r3r7rYr�r�r�r.r,rr<s!��%� O�8�$�(�"r.rc�Z�eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z e ej�Z y) rc� �tjd��\|_|_|j �|_|jj|_tjdk(rd|_ y|j �|_ y)NFrr)r rrrrrrLrMr r!r")r)r+s r,r-zSimpleQueue.__init__isW��%/�_�_�E�%B�"���d�l��h�h�j����\�\�&�&�� ��<�<�7�"��D�K��(�(�*�D�Kr.c�l�|jj�|jj�yr0)rrtrr2s r,rtzSimpleQueue.closers"�������������r.c�$�|j�Sr0rhr2s r,rizSimpleQueue.emptyvrjr.c��tj|�|j|j|j|j fSr0)r r1rrrr"r2s r,r3zSimpleQueue.__getstate__ys/������%����d�l�l�D�K�K����E�Er.c�p�|\|_|_|_|_|jj|_yr0)rrrr"rLrMr5s r,r7zSimpleQueue.__setstate__}s)��AF�>���t�|�T�[�$�+��\�\�&�&�� r.c��|j5|jj�}ddd�tj �S#1swY�xYwr0)rrrJr^r_)r)r`s r,rbzSimpleQueue.get�s;�� �[�[��,�,�)�)�+�C���$�$�S�)�)��[�s�A�Ac��tj|�}|j�|jj |�y|j5|jj |�ddd�y#1swYyxYwr0)r^r�r"rrHrqs r,rYzSimpleQueue.put�sQ���#�#�C�(���;�;���L�L�#�#�C�(�������'�'��,����s� A/�/A8N)r�r�r�r-rtrir3r7rbrYr�r�r�r�r�r.r,rrgs9��%�� �F�'�*�-�$�E�$6�$6�7�r.r)�__all__r rr>r@r\r�r�r��queuerr�_multiprocessing�r r � reduction�ForkingPicklerr^�utilrrr rr�objectrr�rrr�r.r,�<module>r�sx��4�� � ������������#�#�2�2��H�H�L8�F�L8�^ �H� �%"�E�%"�V*8�&�*8r.PK:W�\�y� �G�G"__pycache__/queues.cpython-312.pycnu�[���� T��h�1���gd�ZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z mZddlZddl mZddl mZej j"ZddlmZmZmZmZmZGd�d e�Ze�ZGd �de�ZGd�d e�Zy))�Queue�SimpleQueue� JoinableQueue�N)�Empty�Full�)� connection)�context)�debug�info�Finalize�register_after_fork� is_exitingc���eZdZdd�Zd�Zd�Zd�Zdd�Zdd�Zdd�Z d �Z d �Zd�Zd�Z d �Zd�Zd�Zd�Zd�Zd�Zed��Zed��Zed��Zed��Zeej6�Zy)rc���|dkrddlm}||_tjd��\|_|_|j�|_tj�|_tjdk(rd|_n|j�|_|j|�|_d|_|j%�tjdk7rt'|t(j*�yy)Nrr)� SEM_VALUE_MAXF��duplex�win32)�synchronizer�_maxsizer �Pipe�_reader�_writer�Lock�_rlock�os�getpid�_opid�sys�platform�_wlock�BoundedSemaphore�_sem� _ignore_epipe�_resetrr�_after_fork��self�maxsize�ctxs �//usr/lib64/python3.12/multiprocessing/queues.py�__init__zQueue.__init__%s����a�<�=��� �%/�_�_�E�%B�"���d�l��h�h�j����Y�Y�[�� ��<�<�7�"��D�K��(�(�*�D�K��(�(��1�� �"������ ��<�<�7�"���e�&7�&7�8�#�c���tj|�|j|j|j|j |j|j|j|jfS�N) r �assert_spawningr%rrrrr"r$r�r)s r,�__getstate__zQueue.__getstate__9sP������%��"�"�D�M�M�4�<�<�������T�[�[�$�)�)�T�Z�Z�A� Ar.c ��|\|_|_|_|_|_|_|_|_|j�yr0) r%rrrrr"r$rr&�r)�states r,�__setstate__zQueue.__setstate__>s5��<A� :�� �T�]�D�L�$�,� ��d�k�4�9�d�j���� r.c�>�td�|jd��y)NzQueue._after_fork()T)� after_fork)rr&r2s r,r'zQueue._after_forkCs�� �#�$����t��$r.c��|r|jj�n,tjtj��|_tj�|_d|_d|_ d|_ d|_d|_|jj|_|j j"|_|j j&|_y�NF)� _notempty�_at_fork_reinit� threading� Conditionr�collections�deque�_buffer�_thread�_jointhread�_joincancelled�_closed�_closer� send_bytes�_send_bytesr� recv_bytes�_recv_bytes�poll�_poll)r)r9s r,r&zQueue._resetGs�����N�N�*�*�,�&�0�0����1A�B�D�N�"�(�(�*���������#����������<�<�2�2����<�<�2�2����\�\�&�&�� r.Nc�b�|jrtd|�d���|jj||�st�|j 5|j�|j�|jj|�|j j�ddd�y#1swYyxYw�NzQueue z is closed)rF� ValueErrorr$�acquirerr<rC� _start_threadrB�append�notify�r)�obj�block�timeouts r,�putz Queue.putVs���<�<��v�d�X�Z�8�9�9��y�y� � ���0��J� �^�^��|�|�#��"�"�$��L�L����$��N�N�!�!�#� �^�^�s � AB%�%B.c���|jrtd|�d���|rB|�@|j5|j�}ddd�|jj�n�|rt j�|z}|jj||�st� |r.t j�z }|j|�st�|j�st�|j�}|jj�|jj�tj�S#1swY��xYw#|jj�wxYwrO) rFrPrrKr$�release�time� monotonicrQrrM�_ForkingPickler�loads)r)rWrX�res�deadlines r,�getz Queue.getbs ���<�<��v�d�X�Z�8�9�9��W�_�����&�&�(����I�I������>�>�+�g�5���;�;�&�&�u�g�6��� &��&����)9�9�G��:�:�g�.�#�������K��&�&�(��� � �!�!�#����#�#�%��$�$�S�)�)�)���$���#�#�%�s�D;�A0E�;E�E#c�d�|j|jjj�z Sr0)rr$�_semlock� _get_valuer2s r,�qsizezQueue.qsize|s$���}�}�t�y�y�1�1�<�<�>�>�>r.c�$�|j�Sr0�rMr2s r,�emptyzQueue.empty�����:�:�<��r.c�J�|jjj�Sr0)r$rd�_is_zeror2s r,�fullz Queue.full�s���y�y�!�!�*�*�,�,r.c�$�|jd�Sr;)rbr2s r,� get_nowaitzQueue.get_nowait�s���x�x���r.c�&�|j|d�Sr;)rY�r)rVs r,� put_nowaitzQueue.put_nowait�s���x�x��U�#�#r.c�L�d|_|j}|rd|_|�yy)NT)rFrG)r)�closes r,rtzQueue.close�s&�����������D�K��G�r.c��td�|jsJdj|���|jr|j�yy)NzQueue.join_thread()zQueue {0!r} not closed)rrF�formatrDr2s r,�join_threadzQueue.join_thread�sB�� �#�$��|�|�B�5�<�<�T�B�B�|��������r.c�|�td�d|_ |jj�y#t$rYywxYw)NzQueue.cancel_join_thread()T)rrErD�cancel�AttributeErrorr2s r,�cancel_join_threadzQueue.cancel_join_thread�s<�� �*�+�"��� ����#�#�%��� �� �s�/� ;�;c���|jj�tjdk(r|jj�|j�|j�y)Nr)rrtr r!rrwr2s r,�_terminate_brokenzQueue._terminate_broken�sG�� �������<�<�7�"��L�L��� �� � �����r.c�,�td�|jj�tjt j|j|j|j|j|jj|jj|j|j|jf dd��|_ td�|j j#�td�|j$sJt'|j t j(t+j,|j �gd��|_t'|t j0|j|jgd ��|_y#d|_�xYw) NzQueue._start_thread()�QueueFeederThreadT)�target�args�name�daemonzdoing self._thread.start()z... done self._thread.start()���)�exitpriority� )rrB�clearr>�Threadr�_feedr<rIr"rrtrr%�_on_queue_feeder_errorr$rC�startrEr �_finalize_join�weakref�refrD�_finalize_closerGr2s r,rRzQueue._start_thread�s2�� �%�&� ������ �'�'��;�;��,�,�����0@�0@��+�+�t�|�|�1�1�4�<�<�3E�3E��$�$�d�&A�&A��)�)��%�� ��� ��.�/��L�L��� ��1�2��"�"�'����e�2�2����T�\�\�*�+�� �D����%�'�'� �\�\�4�>�>�*������ � �D�L��s� 0F � Fc�z�td�|�}|�|j�td�ytd�y)Nzjoining queue threadz... queue thread joinedz... queue thread already dead)r�join)�twr�threads r,r�zQueue._finalize_join�s3�� �$�%�������K�K�M��+�,��1�2r.c��td�|5|jt�|j�ddd�y#1swYyxYw)Nztelling queue thread to quit)rrS� _sentinelrT)�buffer�notemptys r,r�zQueue._finalize_close�s.�� �,�-� ��M�M�)�$��O�O���X�X�s �&=�Ac ��td�|j} |j} |j}|j}t } tjdk7r|j}|j}nd} | � |s|�| � |�}|| urtd�|�|�ytj|�}|� ||�n|� ||���]#| �wxYw#�wxYw#t$rYnwxYwno#t$rc}|r#t|dd�tjk(rYd}~yt�rt!d|�Yd}~y|j�||�Yd}~nd}~wwxYw��)Nz$starting thread to feed data to piperz%feeder thread got sentinel -- exiting�errnorzerror in queue thread: %s)rrQr[�wait�popleftr�r r!r^�dumps� IndexError� Exception�getattrr��EPIPErr)r�r�rH� writelock�reader_close�writer_close�ignore_epipe�onerror� queue_sem�nacquire�nrelease�nwait�bpopleft�sentinel�wacquire�wreleaserV�es r,r�zQueue._feed�sh�� �4�5��#�#���#�#��� � ���>�>�����<�<�7�"� �(�(�H� �(�(�H��H��- $�� ��!����J���&�j���(�?�!�"I�J�(�N�(�N�"�.�3�3�C�8��#�+�&�s�O�$�J�+� *�3�� (� �#���J��&!)� ��!�������� $��G�A�w��$:�e�k�k�$I�� �<��4�a�8���%�%�'��A�s�O�O��# $��;sx�2D�: C)�D�%D�1'D�C5�!D�) C2�2D�5 C>�>D� D � D�D � D� E=� E8�?E8�E8�8E=c�,�ddl}|j�y)z� Private API hook called when feeding data in the background thread raises an exception. For overriding by concurrent.futures. rN)� traceback� print_exc)r�rVr�s r,r�zQueue._on_queue_feeder_error&s�� ����r.�r)F�TN)�__name__� __module__�__qualname__r-r3r7r'r&rYrbrfrirmrorrrtrwr{r}rR�staticmethodr�r�r�r��classmethod�types�GenericAlias�__class_getitem__�r.r,rr#s���9�(A� � %� '� $�*�4?� �-��$�����%�N�3��3������<$��<$�|����$�E�$6�$6�7�r.rc�4�eZdZdd�Zd�Zd�Zd d�Zd�Zd�Zy) rc��tj|||��|jd�|_|j �|_y)N)r+r)rr-� Semaphore�_unfinished_tasksr?�_condr(s r,r-zJoinableQueue.__init__>s2�� ���t�W�#��.�!$���q�!1����]�]�_�� r.c�^�tj|�|j|jfzSr0)rr3r�r�r2s r,r3zJoinableQueue.__getstate__Cs'���!�!�$�'�4�:�:�t�7M�7M�*N�N�Nr.c�Z�tj||dd�|dd\|_|_y)N���)rr7r�r�r5s r,r7zJoinableQueue.__setstate__Fs-�� ���4��s���,�-2�2�3�Z�*�� �D�*r.Nc���|jrtd|�d���|jj||�st�|j 5|j5|j�|j�|jj|�|jj�|j j�ddd�ddd�y#1swY�xYw#1swYyxYwrO)rFrPr$rQrr<r�rCrRrBrSr�r[rTrUs r,rYzJoinableQueue.putJs����<�<��v�d�X�Z�8�9�9��y�y� � ���0��J� �^�^�T�Z�Z��|�|�#��"�"�$��L�L����$��"�"�*�*�,��N�N�!�!�#�(�^�^�Z�Z��^�^�s%� C �A,C�C �C �C � C)c��|j5|jjd�std��|jjj�r|jj �ddd�y#1swYyxYw)NFz!task_done() called too many times)r�r�rQrPrdrl� notify_allr2s r,� task_donezJoinableQueue.task_doneWs[�� �Z�Z��)�)�1�1�%�8� �!D�E�E��%�%�.�.�7�7�9�� � �%�%�'� �Z�Z�s�A%A;�;Bc���|j5|jjj�s|jj �ddd�y#1swYyxYwr0)r�r�rdrlr�r2s r,r�zJoinableQueue.join^s9�� �Z�Z��)�)�2�2�;�;�=�� � ���!��Z�Z�s�?A�Ar�r�) r�r�r�r-r3r7rYr�r�r�r.r,rr<s!��%� O�8�$�(�"r.rc�Z�eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z e ej�Z y) rc� �tjd��\|_|_|j �|_|jj|_tjdk(rd|_ y|j �|_ y)NFrr)r rrrrrrLrMr r!r")r)r+s r,r-zSimpleQueue.__init__isW��%/�_�_�E�%B�"���d�l��h�h�j����\�\�&�&�� ��<�<�7�"��D�K��(�(�*�D�Kr.c�l�|jj�|jj�yr0)rrtrr2s r,rtzSimpleQueue.closers"�������������r.c�$�|j�Sr0rhr2s r,rizSimpleQueue.emptyvrjr.c��tj|�|j|j|j|j fSr0)r r1rrrr"r2s r,r3zSimpleQueue.__getstate__ys/������%����d�l�l�D�K�K����E�Er.c�p�|\|_|_|_|_|jj|_yr0)rrrr"rLrMr5s r,r7zSimpleQueue.__setstate__}s)��AF�>���t�|�T�[�$�+��\�\�&�&�� r.c��|j5|jj�}ddd�tj �S#1swY�xYwr0)rrrJr^r_)r)r`s r,rbzSimpleQueue.get�s;�� �[�[��,�,�)�)�+�C���$�$�S�)�)��[�s�A�Ac��tj|�}|j�|jj |�y|j5|jj |�ddd�y#1swYyxYwr0)r^r�r"rrHrqs r,rYzSimpleQueue.put�sQ���#�#�C�(���;�;���L�L�#�#�C�(�������'�'��,����s� A/�/A8N)r�r�r�r-rtrir3r7rbrYr�r�r�r�r�r.r,rrgs9��%�� �F�'�*�-�$�E�$6�$6�7�r.r)�__all__r rr>r@r\r�r�r��queuerr�_multiprocessing�r r � reduction�ForkingPicklerr^�utilrrr rr�objectrr�rrr�r.r,�<module>r�sx��4�� � ������������#�#�2�2��H�H�L8�F�L8�^ �H� �%"�E�%"�V*8�&�*8r.PK:W�\�2D=6=6+__pycache__/reduction.cpython-312.opt-1.pycnu�[���� T��h(%��f�ddlmZddlZddlZddlZddlZddlZddlZddlZddl m Z gd�Zejdk(xs)e ed�xre ed�xre ejd �ZGd �dej�Zej"Zd)d�Zejdk(r'egd �z ZddlZd*dd�d�Zd�Zd�Zd�ZGd�de�Zn)egd�z ZddlZejdk(Zd�Zd�Zd�Zd�Zd�Zd�ZGd�d�Z ee!e �jD�e�d�Z#ee!e$jJ�e#�ee!e&jN�e#�d �Z(d!�Z)eejTe(�ejdk(rd"�Z+d#�Z,eeje+�nd$�Z+d%�Z,eeje+�Gd&�d'e�(�Z-y)+�)�ABCMetaN�)�context)�send_handle�recv_handle�ForkingPickler�register�dump�win32�CMSG_LEN� SCM_RIGHTS�sendmsgc�x��eZdZdZiZejZ�fd�Ze d��Z e dd��ZejZ �xZS)rz)Pickler subclass used by multiprocessing.c���t�|�|�|jj�|_|jj|j�y�N)�super�__init__�_copyreg_dispatch_table�copy�dispatch_table�update�_extra_reducers)�self�args� __class__s ��2/usr/lib64/python3.12/multiprocessing/reduction.pyrzForkingPickler.__init__&sA��� ���$��"�:�:�?�?�A������"�"�4�#7�#7�8�c�"�||j|<y)z&Register a reduce function for a type.N)r)�cls�type�reduces rr zForkingPickler.register+s��%+����D�!rc�z�tj�}|||�j|�|j�Sr)�io�BytesIOr � getbuffer)r�obj�protocol�bufs r�dumpszForkingPickler.dumps0s.���j�j�l���C������$��}�}��rr)�__name__� __module__�__qualname__�__doc__r�copyregrrr�classmethodr r)�pickle�loads� __classcell__)rs@rrr!sO���3��O�%�4�4��9� �+��+����� �L�L�Errc�:�t||�j|�y)z3Replacement for pickle.dump() using ForkingPickler.N)rr )r&�filer's rr r :s���4��"�'�'��,r)� DupHandle� duplicate�steal_handle)�source_processc��tj�}|�|}|�|}tj|||d|tj�S)z<Duplicate a handle. (target_process is a handle not a pid!)r)�_winapi�GetCurrentProcess�DuplicateHandle�DUPLICATE_SAME_ACCESS)�handle�target_process�inheritabler8�current_processs rr6r6GsO��"�3�3�5���!�,�N��!�,�N��&�&��F�N� �{�G�9�9�;� ;rc �B�tjtjd|�} tj||tj�ddtj tjz�tj|�S#tj|�wxYw)z5Steal a handle from process identified by source_pid.Fr)r:�OpenProcess�PROCESS_DUP_HANDLEr<r;r=�DUPLICATE_CLOSE_SOURCE�CloseHandle)� source_pidr>�source_process_handles rr7r7Ss~�� '� 3� 3��&�&��z�!;�� 7��*�*�%�v��)�)�+�Q���-�-��0N�0N�N�P� ��� 5�6��G��� 5�6�s�A B�Bc�\�t|tj|�}|j|�y�z&Send a handle over a local connection.N)r5r:r=�send)�connr>�destination_pid�dhs rrr_s!�� �v�w�<�<�o� N��� � �"� rc�>�|j�j�S)�)Receive a handle over a local connection.)�recv�detach)rLs rrrds���y�y�{�!�!�#�#rc��eZdZdZdd�Zd�Zy)r5zPicklable wrapper for a handle.Nc�X�|�tj�}tjtjd|�} tj tj�|||dd�|_tj|�||_ ||_ y#tj|�wxYw)NFr)�os�getpidr:rCrDr<r;�_handlerF�_access�_pid)rr>�access�pid�procs rrzDupHandle.__init__js����{��i�i�k���&�&�w�'A�'A�5�#�N�D� *�&�6�6��-�-�/��D�&�%�� 4����#�#�D�)�!�D�L��D�I���#�#�D�)�s�1B�B)c��|jtj�k(r|jSt j tjd|j�} t j||jt j�|jdtj�t j|�S#t j|�wxYw)z1Get the handle. This should only be called once.F)rYrUrVrWr:rCrDr<r;rXrErF)rr\s rrRzDupHandle.detachys����y�y�B�I�I�K�'��|�|�#��&�&�w�'A�'A�5�'+�y�y�2�D� *��.�.��$�,�,��(A�(A�(C��L�L�%��)G�)G�I��#�#�D�)���#�#�D�)�s �A C�Cr)r*r+r,r-rrR�rrr5r5hs��-� � *rr5)�DupFd�sendfds�recvfds�darwinc��tjd|�}tt|�dzg�}|j|gtj tj|fg�tr |jd�dk7rtd��yy)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 �ACKNOWLEDGErQ�RuntimeError)�sock�fds�msgs rr`r`�sr���k�k�#�s�#���S��X��^�$�%�����c�U�f�/�/��1B�1B�C�H�I�J��4�9�9�Q�<�4�/��F�G�G�0�;rc���tjd�}|j|z}|jdtj|��\}}}}|s|st � tr|jd�t|�dk7rtdt|�z��|d\}} } |tjk(r�| tjk(rxt| �|jzdk7rt�|j| �t|�dz|dk7r'tdjt|�|d���t!|�Std��#tt"f$r Ytd��wxYw) z/Receive an array of fds over an AF_UNIX socket.rdrrfzreceived %d items of ancdatarrez Len is {0:n} but msg[0] is {1!r}zInvalid data received)rg�itemsize�recvmsgrj� CMSG_SPACE�EOFErrorrlrKrirmrkr � ValueError� frombytes�AssertionError�format�list� IndexError)rn�size�a� bytes_sizerp�ancdata�flags�addr� cmsg_level� cmsg_type� cmsg_datas rrara�sT���K�K�����Z�Z�$�&� �$(�L�L��F�4E�4E�j�4Q�$R�!��W�e�T��7��N� ��� � �$���7�|�q� �"�#A�#&�w�<�$0�1�1�/6�q�z�,�J� �9��f�/�/�/��V�.�.�.��y�>�A�J�J�.�!�3�$�$����I�&��q�6�C�<�3�q�6�)�(�:�A�A���F�C��F�,�-�-��A�w���2�3�3���J�'� ���2�3�3� �s�C"E�E$�#E$c���tj|j�tjtj�5}t||g�ddd�y#1swYyxYwrJ)rj�fromfd�fileno�AF_UNIX�SOCK_STREAMr`)rLr>rM�ss rrr�s>�� �]�]�4�;�;�=�&�.�.�&�:L�:L� M�QR��A��x� �N� M� M�s�A�A"c���tj|j�tjtj�5}t|d�dcddd�S#1swYyxYw)rPrrN)rjr�r�r�r�ra)rLr�s rrr�s@�� �]�]�4�;�;�=�&�.�.�&�:L�:L� M�QR��1�a�=��#�N� M� M�s�A�A$c��tj�}|� |j|j|��Strddlm}|j|�Std��)zReturn a wrapper for an fd.r)�resource_sharerz&SCM_RIGHTS appears not to be available)r�get_spawning_popenr_�duplicate_for_child�HAVE_SEND_HANDLE�r�rv)�fd� popen_objr�s rr_r_�sS���.�.�0� �� ��?�?�9�#@�#@��#D�E�E� �)�"�(�(��,�,��E�F�Frc��|j�(t|j|jjffSt|j|jjffSr)�__self__�getattrr�__func__r*��ms r�_reduce_methodr��sH���z�z������a�j�j�&9�&9�:�:�:�����Q�Z�Z�%8�%8�9�9�9rc��eZdZd�Zy)�_Cc��yrr^)rs r�fz_C.f�s��rN)r*r+r,r�r^rrr�r��s�� rr�c�>�t|j|jffSr)r��__objclass__r*r�s r�_reduce_method_descriptorr��s���Q�^�^�Q�Z�Z�0�0�0rc�\�t|j|j|jxsiffSr)�_rebuild_partial�funcr�keywords)�ps r�_reduce_partialr��s%���a�f�f�a�f�f�a�j�j�.>�B�?�?�?rc�4�tj|g|��i|��Sr)� functools�partial)r�rr�s rr�r��s�����T�5�D�5�H�5�5rc�,�ddlm}t||�ffS)Nr)� DupSocket)r�r��_rebuild_socket)r�r�s r�_reduce_socketr��s��.���1���/�/rc�"�|j�Sr)rR)�dss rr�r��s���y�y�{�rc��t|j��}t||j|j|j ffSr)r_r�r��familyr �proto)r��dfs rr�r��s2�� �1�8�8�:� ����Q�X�X�q�v�v�q�w�w� ?�?�?rc�T�|j�}tj||||��S)N)r�)rRrj)r�r�r r�r�s rr�r��s"�� �Y�Y�[���}�}�V�T�5��<�<rc�v�eZdZdZeZeZeZeZeZe jdk(reZeZe Z neZeZeZeZeZeZeZeZd�Zy)�AbstractReducerz�Abstract base class for use in implementing a Reduction class suitable for use in replacing the standard reduction mechanism used in multiprocessing.rc�n�ttt�j�t�ttt j�t�tttj�t�ttjt�ttjt�yr)r r r�r�r�rz�appendr��int�__add__r�r�r�rjr�)rrs rrzAbstractReducer.__init__s\����b�d�f�f��~�.���d�k�k�"�$=�>���c�k�k�"�$=�>���"�"�O�4������/rN)r*r+r,r-rr r rr�sys�platformr7r6r5r`rar_r�r�r�r�r�rr^rrr�r��sl�� �$�N��H��D��K��K� �|�|�w��#��� �� �������#�N� 9��'��#�N�%�O�0rr�)� metaclassr)NF).�abcrr.r�r#rUr0rjr�r�r�__all__r��hasattrr��Picklerrr r r:r6r7rr�objectr5rgrlr`rar_r�r�r r�r�rzr�r�r�r�r�r�r�r�r�r^rr�<module>r�s������ � � � � �� N���L�L�G�+�8��V�Z�0�7��V�\�2�7��V�]�]�I�6���V�^�^��.�"�"��-��<�<�7���9�9�G�� ;�$(� ;� 7�� $�*�F�*�F�.�.�G���,�,�(�*�K�H�4�8!� $� G�:� � � ��b�d�f�f��~�&�1���d�k�k� �5�6���c�k�k� �5�6�@�6��� � �O�,��<�<�7��0���V�]�]�N�+�@�=� �V�]�]�N�+�0��0rPK:W�\T�+ġ3�3+__pycache__/reduction.cpython-312.opt-2.pycnu�[���� T��h(%��f�ddlmZddlZddlZddlZddlZddlZddlZddlZddl m Z gd�Zejdk(xs)e ed�xre ed�xre ejd �ZGd �dej�Zej"Zd)d�Zejdk(r'egd �z ZddlZd*dd�d�Zd�Zd�Zd�ZGd�de�Zn)egd�z ZddlZejdk(Zd�Zd�Zd�Zd�Zd�Zd�ZGd�d�Z ee!e �jD�e�d�Z#ee!e$jJ�e#�ee!e&jN�e#�d �Z(d!�Z)eejTe(�ejdk(rd"�Z+d#�Z,eeje+�nd$�Z+d%�Z,eeje+�Gd&�d'e�(�Z-y)+�)�ABCMetaN�)�context)�send_handle�recv_handle�ForkingPickler�register�dump�win32�CMSG_LEN� SCM_RIGHTS�sendmsgc�v��eZdZ iZej Z�fd�Zed��Z edd��Z ejZ�xZ S)rc���t�|�|�|jj�|_|jj|j�y�N)�super�__init__�_copyreg_dispatch_table�copy�dispatch_table�update�_extra_reducers)�self�args� __class__s ��2/usr/lib64/python3.12/multiprocessing/reduction.pyrzForkingPickler.__init__&sA��� ���$��"�:�:�?�?�A������"�"�4�#7�#7�8�c�$� ||j|<yr)r)�cls�type�reduces rr zForkingPickler.register+s��4�$*����D�!rc�z�tj�}|||�j|�|j�Sr)�io�BytesIOr � getbuffer)r�obj�protocol�bufs r�dumpszForkingPickler.dumps0s.���j�j�l���C������$��}�}��rr)�__name__� __module__�__qualname__r�copyregrrr�classmethodr r)�pickle�loads� __classcell__)rs@rrr!sO���3��O�%�4�4��9� �+��+����� �L�L�Errc�<� t||�j|�yr)rr )r&�filer's rr r :s��=��4��"�'�'��,r)� DupHandle� duplicate�steal_handle)�source_processc�� tj�}|�|}|�|}tj|||d|tj�S)Nr)�_winapi�GetCurrentProcess�DuplicateHandle�DUPLICATE_SAME_ACCESS)�handle�target_process�inheritabler7�current_processs rr5r5GsP��J�!�3�3�5���!�,�N��!�,�N��&�&��F�N� �{�G�9�9�;� ;rc �D� tjtjd|�} tj||tj�ddtj tjz�tj|�S#tj|�wxYw�NFr)r9�OpenProcess�PROCESS_DUP_HANDLEr;r:r<�DUPLICATE_CLOSE_SOURCE�CloseHandle)� source_pidr=�source_process_handles rr6r6Ss���C� '� 3� 3��&�&��z�!;�� 7��*�*�%�v��)�)�+�Q���-�-��0N�0N�N�P� ��� 5�6��G��� 5�6�s�A B�Bc�^� t|tj|�}|j|�yr)r4r9r<�send)�connr=�destination_pid�dhs rrr_s$��4� �v�w�<�<�o� N��� � �"� rc�@� |j�j�Sr)�recv�detach)rKs rrrds��7��y�y�{�!�!�#�#rc��eZdZ dd�Zd�Zy)r4Nc�X�|�tj�}tjtjd|�} tj tj�|||dd�|_tj|�||_ ||_ y#tj|�wxYwrB)�os�getpidr9rCrDr;r:�_handlerF�_access�_pid)rr=�access�pid�procs rrzDupHandle.__init__js����{��i�i�k���&�&�w�'A�'A�5�#�N�D� *�&�6�6��-�-�/��D�&�%�� 4����#�#�D�)�!�D�L��D�I���#�#�D�)�s�1B�B)c�� |jtj�k(r|jSt j tjd|j�} t j||jt j�|jdtj�t j|�S#t j|�wxYw�NF)rWrSrTrUr9rCrDr;r:rVrErF)rrZs rrPzDupHandle.detachys���C��y�y�B�I�I�K�'��|�|�#��&�&�w�'A�'A�5�'+�y�y�2�D� *��.�.��$�,�,��(A�(A�(C��L�L�%��)G�)G�I��#�#�D�)���#�#�D�)�s �A C�Cr)r*r+r,rrP�rrr4r4hs��-� � *rr4)�DupFd�sendfds�recvfds�darwinc�� tjd|�}tt|�dzg�}|j|gtj tj|fg�tr |jd�dk7rtd��yy)N�i�r�Az%did not receive acknowledgement of fd) �array�bytes�lenr�socket� SOL_SOCKETr �ACKNOWLEDGErO�RuntimeError)�sock�fds�msgs rr_r_�su��:��k�k�#�s�#���S��X��^�$�%�����c�U�f�/�/��1B�1B�C�H�I�J��4�9�9�Q�<�4�/��F�G�G�0�;rc��� tjd�}|j|z}|jdtj|��\}}}}|s|st � tr|jd�t|�dk7rtdt|�z��|d\}} } |tjk(r�| tjk(rxt| �|jzdk7rt�|j| �t|�dz|dk7r'tdjt|�|d���t!|�Std��#tt"f$r Ytd��wxYw) Nrcrrezreceived %d items of ancdatarrdz Len is {0:n} but msg[0] is {1!r}zInvalid data received)rf�itemsize�recvmsgri� CMSG_SPACE�EOFErrorrkrJrhrlrjr � ValueError� frombytes�AssertionError�format�list� IndexError)rm�size�a� bytes_sizero�ancdata�flags�addr� cmsg_level� cmsg_type� cmsg_datas rr`r`�sW��=��K�K�����Z�Z�$�&� �$(�L�L��F�4E�4E�j�4Q�$R�!��W�e�T��7��N� ��� � �$���7�|�q� �"�#A�#&�w�<�$0�1�1�/6�q�z�,�J� �9��f�/�/�/��V�.�.�.��y�>�A�J�J�.�!�3�$�$����I�&��q�6�C�<�3�q�6�)�(�:�A�A���F�C��F�,�-�-��A�w���2�3�3���J�'� ���2�3�3� �s�C"E � E%�$E%c��� tj|j�tjtj�5}t||g�ddd�y#1swYyxYwr)ri�fromfd�fileno�AF_UNIX�SOCK_STREAMr_)rKr=rL�ss rrr�sA��4� �]�]�4�;�;�=�&�.�.�&�:L�:L� M�QR��A��x� �N� M� M�s�A�A#c��� tj|j�tjtj�5}t|d�dcddd�S#1swYyxYw)Nrr)rir�r�r�r�r`)rKr�s rrr�sC��7� �]�]�4�;�;�=�&�.�.�&�:L�:L� M�QR��1�a�=��#�N� M� M�s�A�A%c�� tj�}|� |j|j|��Strddlm}|j|�Std��)Nr)�resource_sharerz&SCM_RIGHTS appears not to be available)r�get_spawning_popenr^�duplicate_for_child�HAVE_SEND_HANDLE�r�ru)�fd� popen_objr�s rr^r^�sV��)��.�.�0� �� ��?�?�9�#@�#@��#D�E�E� �)�"�(�(��,�,��E�F�Frc��|j�(t|j|jjffSt|j|jjffSr)�__self__�getattrr�__func__r*��ms r�_reduce_methodr��sH���z�z������a�j�j�&9�&9�:�:�:�����Q�Z�Z�%8�%8�9�9�9rc��eZdZd�Zy)�_Cc��yrr])rs r�fz_C.f�s��rN)r*r+r,r�r]rrr�r��s�� rr�c�>�t|j|jffSr)r��__objclass__r*r�s r�_reduce_method_descriptorr��s���Q�^�^�Q�Z�Z�0�0�0rc�\�t|j|j|jxsiffSr)�_rebuild_partial�funcr�keywords)�ps r�_reduce_partialr��s%���a�f�f�a�f�f�a�j�j�.>�B�?�?�?rc�4�tj|g|��i|��Sr)� functools�partial)r�rr�s rr�r��s�����T�5�D�5�H�5�5rc�,�ddlm}t||�ffS)Nr)� DupSocket)r�r��_rebuild_socket)r�r�s r�_reduce_socketr��s��.���1���/�/rc�"�|j�Sr)rP)�dss rr�r��s���y�y�{�rc��t|j��}t||j|j|j ffSr)r^r�r��familyr �proto)r��dfs rr�r��s2�� �1�8�8�:� ����Q�X�X�q�v�v�q�w�w� ?�?�?rc�T�|j�}tj||||��S)N)r�)rPri)r�r�r r�r�s rr�r��s"�� �Y�Y�[���}�}�V�T�5��<�<rc�t�eZdZ eZeZeZeZeZejdk(re Z eZeZne Z eZeZeZeZeZeZeZd�Zy)�AbstractReducerrc�n�ttt�j�t�ttt j�t�tttj�t�ttjt�ttjt�yr)r r r�r�r�ry�appendr��int�__add__r�r�r�rir�)rrs rrzAbstractReducer.__init__s\����b�d�f�f��~�.���d�k�k�"�$=�>���c�k�k�"�$=�>���"�"�O�4������/rN)r*r+r,rr r rr�sys�platformr6r5r4r_r`r^r�r�r�r�r�rr]rrr�r��sl�� �$�N��H��D��K��K� �|�|�w��#��� �� �������#�N� 9��'��#�N�%�O�0rr�)� metaclassrr\).�abcrr-r�r#rSr/rir�r�r�__all__r��hasattrr��Picklerrr r r9r5r6rr�objectr4rfrkr_r`r^r�r�r r�r�ryr�r�r�r�r�r�r�r�r�r]rr�<module>r�s������ � � � � �� N���L�L�G�+�8��V�Z�0�7��V�\�2�7��V�]�]�I�6���V�^�^��.�"�"��-��<�<�7���9�9�G�� ;�$(� ;� 7�� $�*�F�*�F�.�.�G���,�,�(�*�K�H�4�8!� $� G�:� � � ��b�d�f�f��~�&�1���d�k�k� �5�6���c�k�k� �5�6�@�6��� � �O�,��<�<�7��0���V�]�]�N�+�@�=� �V�]�]�N�+�0��0rPK:W�\�2D=6=6%__pycache__/reduction.cpython-312.pycnu�[���� T��h(%��f�ddlmZddlZddlZddlZddlZddlZddlZddlZddl m Z gd�Zejdk(xs)e ed�xre ed�xre ejd �ZGd �dej�Zej"Zd)d�Zejdk(r'egd �z ZddlZd*dd�d�Zd�Zd�Zd�ZGd�de�Zn)egd�z ZddlZejdk(Zd�Zd�Zd�Zd�Zd�Zd�ZGd�d�Z ee!e �jD�e�d�Z#ee!e$jJ�e#�ee!e&jN�e#�d �Z(d!�Z)eejTe(�ejdk(rd"�Z+d#�Z,eeje+�nd$�Z+d%�Z,eeje+�Gd&�d'e�(�Z-y)+�)�ABCMetaN�)�context)�send_handle�recv_handle�ForkingPickler�register�dump�win32�CMSG_LEN� SCM_RIGHTS�sendmsgc�x��eZdZdZiZejZ�fd�Ze d��Z e dd��ZejZ �xZS)rz)Pickler subclass used by multiprocessing.c���t�|�|�|jj�|_|jj|j�y�N)�super�__init__�_copyreg_dispatch_table�copy�dispatch_table�update�_extra_reducers)�self�args� __class__s ��2/usr/lib64/python3.12/multiprocessing/reduction.pyrzForkingPickler.__init__&sA��� ���$��"�:�:�?�?�A������"�"�4�#7�#7�8�c�"�||j|<y)z&Register a reduce function for a type.N)r)�cls�type�reduces rr zForkingPickler.register+s��%+����D�!rc�z�tj�}|||�j|�|j�Sr)�io�BytesIOr � getbuffer)r�obj�protocol�bufs r�dumpszForkingPickler.dumps0s.���j�j�l���C������$��}�}��rr)�__name__� __module__�__qualname__�__doc__r�copyregrrr�classmethodr r)�pickle�loads� __classcell__)rs@rrr!sO���3��O�%�4�4��9� �+��+����� �L�L�Errc�:�t||�j|�y)z3Replacement for pickle.dump() using ForkingPickler.N)rr )r&�filer's rr r :s���4��"�'�'��,r)� DupHandle� duplicate�steal_handle)�source_processc��tj�}|�|}|�|}tj|||d|tj�S)z<Duplicate a handle. (target_process is a handle not a pid!)r)�_winapi�GetCurrentProcess�DuplicateHandle�DUPLICATE_SAME_ACCESS)�handle�target_process�inheritabler8�current_processs rr6r6GsO��"�3�3�5���!�,�N��!�,�N��&�&��F�N� �{�G�9�9�;� ;rc �B�tjtjd|�} tj||tj�ddtj tjz�tj|�S#tj|�wxYw)z5Steal a handle from process identified by source_pid.Fr)r:�OpenProcess�PROCESS_DUP_HANDLEr<r;r=�DUPLICATE_CLOSE_SOURCE�CloseHandle)� source_pidr>�source_process_handles rr7r7Ss~�� '� 3� 3��&�&��z�!;�� 7��*�*�%�v��)�)�+�Q���-�-��0N�0N�N�P� ��� 5�6��G��� 5�6�s�A B�Bc�\�t|tj|�}|j|�y�z&Send a handle over a local connection.N)r5r:r=�send)�connr>�destination_pid�dhs rrr_s!�� �v�w�<�<�o� N��� � �"� rc�>�|j�j�S)�)Receive a handle over a local connection.)�recv�detach)rLs rrrds���y�y�{�!�!�#�#rc��eZdZdZdd�Zd�Zy)r5zPicklable wrapper for a handle.Nc�X�|�tj�}tjtjd|�} tj tj�|||dd�|_tj|�||_ ||_ y#tj|�wxYw)NFr)�os�getpidr:rCrDr<r;�_handlerF�_access�_pid)rr>�access�pid�procs rrzDupHandle.__init__js����{��i�i�k���&�&�w�'A�'A�5�#�N�D� *�&�6�6��-�-�/��D�&�%�� 4����#�#�D�)�!�D�L��D�I���#�#�D�)�s�1B�B)c��|jtj�k(r|jSt j tjd|j�} t j||jt j�|jdtj�t j|�S#t j|�wxYw)z1Get the handle. This should only be called once.F)rYrUrVrWr:rCrDr<r;rXrErF)rr\s rrRzDupHandle.detachys����y�y�B�I�I�K�'��|�|�#��&�&�w�'A�'A�5�'+�y�y�2�D� *��.�.��$�,�,��(A�(A�(C��L�L�%��)G�)G�I��#�#�D�)���#�#�D�)�s �A C�Cr)r*r+r,r-rrR�rrr5r5hs��-� � *rr5)�DupFd�sendfds�recvfds�darwinc��tjd|�}tt|�dzg�}|j|gtj tj|fg�tr |jd�dk7rtd��yy)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 �ACKNOWLEDGErQ�RuntimeError)�sock�fds�msgs rr`r`�sr���k�k�#�s�#���S��X��^�$�%�����c�U�f�/�/��1B�1B�C�H�I�J��4�9�9�Q�<�4�/��F�G�G�0�;rc���tjd�}|j|z}|jdtj|��\}}}}|s|st � tr|jd�t|�dk7rtdt|�z��|d\}} } |tjk(r�| tjk(rxt| �|jzdk7rt�|j| �t|�dz|dk7r'tdjt|�|d���t!|�Std��#tt"f$r Ytd��wxYw) z/Receive an array of fds over an AF_UNIX socket.rdrrfzreceived %d items of ancdatarrez Len is {0:n} but msg[0] is {1!r}zInvalid data received)rg�itemsize�recvmsgrj� CMSG_SPACE�EOFErrorrlrKrirmrkr � ValueError� frombytes�AssertionError�format�list� IndexError)rn�size�a� bytes_sizerp�ancdata�flags�addr� cmsg_level� cmsg_type� cmsg_datas rrara�sT���K�K�����Z�Z�$�&� �$(�L�L��F�4E�4E�j�4Q�$R�!��W�e�T��7��N� ��� � �$���7�|�q� �"�#A�#&�w�<�$0�1�1�/6�q�z�,�J� �9��f�/�/�/��V�.�.�.��y�>�A�J�J�.�!�3�$�$����I�&��q�6�C�<�3�q�6�)�(�:�A�A���F�C��F�,�-�-��A�w���2�3�3���J�'� ���2�3�3� �s�C"E�E$�#E$c���tj|j�tjtj�5}t||g�ddd�y#1swYyxYwrJ)rj�fromfd�fileno�AF_UNIX�SOCK_STREAMr`)rLr>rM�ss rrr�s>�� �]�]�4�;�;�=�&�.�.�&�:L�:L� M�QR��A��x� �N� M� M�s�A�A"c���tj|j�tjtj�5}t|d�dcddd�S#1swYyxYw)rPrrN)rjr�r�r�r�ra)rLr�s rrr�s@�� �]�]�4�;�;�=�&�.�.�&�:L�:L� M�QR��1�a�=��#�N� M� M�s�A�A$c��tj�}|� |j|j|��Strddlm}|j|�Std��)zReturn a wrapper for an fd.r)�resource_sharerz&SCM_RIGHTS appears not to be available)r�get_spawning_popenr_�duplicate_for_child�HAVE_SEND_HANDLE�r�rv)�fd� popen_objr�s rr_r_�sS���.�.�0� �� ��?�?�9�#@�#@��#D�E�E� �)�"�(�(��,�,��E�F�Frc��|j�(t|j|jjffSt|j|jjffSr)�__self__�getattrr�__func__r*��ms r�_reduce_methodr��sH���z�z������a�j�j�&9�&9�:�:�:�����Q�Z�Z�%8�%8�9�9�9rc��eZdZd�Zy)�_Cc��yrr^)rs r�fz_C.f�s��rN)r*r+r,r�r^rrr�r��s�� rr�c�>�t|j|jffSr)r��__objclass__r*r�s r�_reduce_method_descriptorr��s���Q�^�^�Q�Z�Z�0�0�0rc�\�t|j|j|jxsiffSr)�_rebuild_partial�funcr�keywords)�ps r�_reduce_partialr��s%���a�f�f�a�f�f�a�j�j�.>�B�?�?�?rc�4�tj|g|��i|��Sr)� functools�partial)r�rr�s rr�r��s�����T�5�D�5�H�5�5rc�,�ddlm}t||�ffS)Nr)� DupSocket)r�r��_rebuild_socket)r�r�s r�_reduce_socketr��s��.���1���/�/rc�"�|j�Sr)rR)�dss rr�r��s���y�y�{�rc��t|j��}t||j|j|j ffSr)r_r�r��familyr �proto)r��dfs rr�r��s2�� �1�8�8�:� ����Q�X�X�q�v�v�q�w�w� ?�?�?rc�T�|j�}tj||||��S)N)r�)rRrj)r�r�r r�r�s rr�r��s"�� �Y�Y�[���}�}�V�T�5��<�<rc�v�eZdZdZeZeZeZeZeZe jdk(reZeZe Z neZeZeZeZeZeZeZeZd�Zy)�AbstractReducerz�Abstract base class for use in implementing a Reduction class suitable for use in replacing the standard reduction mechanism used in multiprocessing.rc�n�ttt�j�t�ttt j�t�tttj�t�ttjt�ttjt�yr)r r r�r�r�rz�appendr��int�__add__r�r�r�rjr�)rrs rrzAbstractReducer.__init__s\����b�d�f�f��~�.���d�k�k�"�$=�>���c�k�k�"�$=�>���"�"�O�4������/rN)r*r+r,r-rr r rr�sys�platformr7r6r5r`rar_r�r�r�r�r�rr^rrr�r��sl�� �$�N��H��D��K��K� �|�|�w��#��� �� �������#�N� 9��'��#�N�%�O�0rr�)� metaclassr)NF).�abcrr.r�r#rUr0rjr�r�r�__all__r��hasattrr��Picklerrr r r:r6r7rr�objectr5rgrlr`rar_r�r�r r�r�rzr�r�r�r�r�r�r�r�r�r^rr�<module>r�s������ � � � � �� N���L�L�G�+�8��V�Z�0�7��V�\�2�7��V�]�]�I�6���V�^�^��.�"�"��-��<�<�7���9�9�G�� ;�$(� ;� 7�� $�*�F�*�F�.�.�G���,�,�(�*�K�H�4�8!� $� G�:� � � ��b�d�f�f��~�&�1���d�k�k� �5�6���c�k�k� �5�6�@�6��� � �O�,��<�<�7��0���V�]�]�N�+�@�=� �V�]�]�N�+�0��0rPK:W�\���Q� � 1__pycache__/resource_sharer.cpython-312.opt-2.pycnu�[���� T��h���ddlZddlZddlZddlZddlZddlmZddlmZddlm Z dgZ ejdk(re dgz Z Gd �de�Z ne d gz Z Gd�d e�ZGd�d e�Ze�Zej"Zy)�N�)�process)� reduction)�util�stop�win32� DupSocketc��eZdZ d�Zd�Zy)r c�z��|j���fd�}tj|�j�|_y)Nc�J���j|�}|j|�y�N)�share� send_bytes)�conn�pidr�new_socks ��8/usr/lib64/python3.12/multiprocessing/resource_sharer.py�sendz DupSocket.__init__.<locals>.sends��� ���s�+������&�)�dup�_resource_sharer�register�close�_id)�self�sockrrs @r�__init__zDupSocket.__init__s-����x�x�z�H� '�(�0�0��x�~�~�F�D�Hrc�� tj|j�5}|j�}t j |�cddd�S#1swYyxYwr )r�get_connectionr� recv_bytes�socket� fromshare)rrrs r�detachzDupSocket.detach$s?��C�!�0�0����:�d����)���'�'��.�;�:�:�s�%A�AN��__name__� __module__�__qualname__rr#�rrr r s��-� G� /r�DupFdc��eZdZ d�Zd�Zy)r)c�z��tj|���fd�}�fd�}tj||�|_y)Nc�4��tj|�|�yr )r�send_handle)rr�new_fds �rrzDupFd.__init__.<locals>.send1s����%�%�d�F�C�8rc�0��tj��yr )�osr)r.s�rrzDupFd.__init__.<locals>.close3s������� r)r0rrrr)r�fdrrr.s @rrzDupFd.__init__/s.����V�V�B�Z�F� 9� !�'�0�0��u�=�D�Hrc�� tj|j�5}tj|�cddd�S#1swYyxYwr )rrrr�recv_handle)rrs rr#zDupFd.detach7s3��?�!�0�0����:�d� �,�,�T�2�;�:�:�s�A�A Nr$r(rrr)r)-s��;� >� 3rc�D�eZdZ d�Zd�Zed��Zd d�Zd�Zd�Z d�Z y) �_ResourceSharerc���d|_i|_tj�|_d|_d|_d|_tj|tj�y)Nr)�_key�_cache� threading�Lock�_lock� _listener�_address�_threadr�register_after_forkr5� _afterfork)rs rrz_ResourceSharer.__init__?sI���� �����^�^�%�� ������ ����� � ���'A�'A�Brc�� |j5|j�|j�|xjdz c_||f|j|j<|j|jfcddd�S#1swYyxYw)Nr)r;r=�_startr7r8)rrrs rrz_ResourceSharer.registerHs\��9� �Z�Z��}�}�$���� ��I�I��N�I�&*�E�]�D�K�K�� � �"��M�M�4�9�9�-��Z�Z�s�A$A<�<Bc�� ddlm}|\}}||tj�j��}|j|t j�f�|S)Nr��Client��authkey)� connectionrEr�current_processrGrr0�getpid)�identrE�address�key�cs rrz_ResourceSharer.get_connectionQsH��J�&������7�G�$;�$;�$=�$E�$E�F�� ����R�Y�Y�[�!�"��rNc�� ddlm}|j5|j��||jt j �j��}|jd�|j�|jj|�|jj�rtjd�|jj�d|_ d|_d|_|jj!�D]\}\}}|��|jj#�ddd�y#1swYyxYw)NrrDrFz._ResourceSharer thread did not stop when asked)rHrEr;r=rrIrGrrr>�join�is_aliver�sub_warningr<r8�items�clear)r�timeoutrErNrMrrs rrz_ResourceSharer.stopZs���H�&� �Z�Z��}�}�(��4�=�=�#*�#:�#:�#<�#D�#D�F�����t����� ����!�!�'�*��<�<�(�(�*��$�$�&;�<����$�$�&�#��� $�� �!%���*.�+�+�*;�*;�*=�&�C��$���G�+>����!�!�#�!�Z�Z�s�DD;�;Ec�:�|jj�D]\}\}}|��|jj�|jj �|j �|j j �d|_d|_d|_yr ) r8rSrTr;�_at_fork_reinitr<rr=r>)rrMrrs rr@z_ResourceSharer._afterforkosv��"&�+�+�"3�"3�"5��C��$���G�#6�������� � �"�"�$��>�>�%��N�N� � �"������ ���rc�B�ddlm}tjd�|t j �jd��|_|jj|_ tj|j��}d|_ |j�||_y)Nr)�Listenerz0starting listener and thread for sending handles�)rG�backlog)�targetT)rHrYr�debugrrIrGr<rLr=r9�Thread�_serve�daemon�startr>)rrY�ts rrBz_ResourceSharer._startzsl��(�� � �E�F�!�'�*A�*A�*C�*K�*K�UX�Y������.�.�� ����D�K�K�0����� ��� ���rc�*�ttd�r6tjtjtj�� |j j �5}|j�}|� ddd�y|\}}|jj|�\}} |||�|� ddd��v#|�wxYw#1swY�xYw#tj�s$tjtj��Y�UxYw)N�pthread_sigmask)�hasattr�signalrd� SIG_BLOCK� valid_signalsr<�accept�recvr8�popr� is_exiting�sys� excepthook�exc_info)rr�msgrM�destination_pidrrs rr_z_ResourceSharer._serve�s����6�,�-��"�"�6�#3�#3�V�5I�5I�5K�L�� 4��^�^�*�*�,���)�)�+�C��{��-�,�,/�(�C��"&�+�+�/�/�#�"6�K�D�%� ��T�?�3���-������-�,�� 4����(��N�N�C�L�L�N�3�sH� C�#C �7C�#C �$ B>�-C �5C�> C�C � C�C�:Dr )r%r&r'rr�staticmethodrrr@rBr_r(rrr5r5=s8��8�C�.�����$�* � �4rr5)r0rfr!rmr9�r�contextrr�__all__�platform�objectr r)r5rrr(rr�<module>rxs��� � � � ������(���<�<�7����}��G� /�F� /� ��y��G� 3�� 3� Y4�f�Y4�x#�$�����rPK:W�\�n���"�"+__pycache__/resource_sharer.cpython-312.pycnu�[���� T��h���ddlZddlZddlZddlZddlZddlmZddlmZddlm Z dgZ ejdk(re dgz Z Gd �de�Z ne d gz Z Gd�d e�ZGd�d e�Ze�Zej"Zy)�N�)�process)� reduction)�util�stop�win32� DupSocketc��eZdZdZd�Zd�Zy)r zPicklable wrapper for a socket.c�z��|j���fd�}tj|�j�|_y)Nc�J���j|�}|j|�y�N)�share� send_bytes)�conn�pidr�new_socks ��8/usr/lib64/python3.12/multiprocessing/resource_sharer.py�sendz DupSocket.__init__.<locals>.sends��� ���s�+������&�)�dup�_resource_sharer�register�close�_id)�self�sockrrs @r�__init__zDupSocket.__init__s-����x�x�z�H� '�(�0�0��x�~�~�F�D�Hrc��tj|j�5}|j�}t j |�cddd�S#1swYyxYw)z1Get the socket. This should only be called once.N)r�get_connectionr� recv_bytes�socket� fromshare)rrrs r�detachzDupSocket.detach$s<��!�0�0����:�d����)���'�'��.�;�:�:�s�%A�AN��__name__� __module__�__qualname__�__doc__rr#�rrr r s��-� G� /r�DupFdc��eZdZdZd�Zd�Zy)r*z-Wrapper for fd which can be used at any time.c�z��tj|���fd�}�fd�}tj||�|_y)Nc�4��tj|�|�yr )r�send_handle)rr�new_fds �rrzDupFd.__init__.<locals>.send1s����%�%�d�F�C�8rc�0��tj��yr )�osr)r/s�rrzDupFd.__init__.<locals>.close3s������� r)r1rrrr)r�fdrrr/s @rrzDupFd.__init__/s.����V�V�B�Z�F� 9� !�'�0�0��u�=�D�Hrc��tj|j�5}tj|�cddd�S#1swYyxYw)z-Get the fd. This should only be called once.N)rrrr�recv_handle)rrs rr#zDupFd.detach7s0��!�0�0����:�d� �,�,�T�2�;�:�:�s �?�ANr$r)rrr*r*-s��;� >� 3rc�F�eZdZdZd�Zd�Zed��Zd d�Zd�Z d�Z d �Zy)�_ResourceSharerz.Manager for resources using background thread.c���d|_i|_tj�|_d|_d|_d|_tj|tj�y)Nr)�_key�_cache� threading�Lock�_lock� _listener�_address�_threadr�register_after_forkr6� _afterfork)rs rrz_ResourceSharer.__init__?sI���� �����^�^�%�� ������ ����� � ���'A�'A�Brc��|j5|j�|j�|xjdz c_||f|j|j<|j|jfcddd�S#1swYyxYw)z+Register resource, returning an identifier.Nr)r<r>�_startr8r9)rrrs rrz_ResourceSharer.registerHsY�� �Z�Z��}�}�$���� ��I�I��N�I�&*�E�]�D�K�K�� � �"��M�M�4�9�9�-��Z�Z�s�A$A;�;Bc��ddlm}|\}}||tj�j��}|j|t j�f�|S)z<Return connection from which to receive identified resource.r��Client��authkey)� connectionrFr�current_processrHrr1�getpid)�identrF�address�key�cs rrz_ResourceSharer.get_connectionQsG�� '������7�G�$;�$;�$=�$E�$E�F�� ����R�Y�Y�[�!�"��rNc��ddlm}|j5|j��||jt j �j��}|jd�|j�|jj|�|jj�rtjd�|jj�d|_ d|_d|_|jj!�D]\}\}}|��|jj#�ddd�y#1swYyxYw)z:Stop the background thread and clear registered resources.rrENrGz._ResourceSharer thread did not stop when asked)rIrFr<r>rrJrHrrr?�join�is_aliver�sub_warningr=r9�items�clear)r�timeoutrFrOrNrrs rrz_ResourceSharer.stopZs���&� �Z�Z��}�}�(��4�=�=�#*�#:�#:�#<�#D�#D�F�����t����� ����!�!�'�*��<�<�(�(�*��$�$�&;�<����$�$�&�#��� $�� �!%���*.�+�+�*;�*;�*=�&�C��$���G�+>����!�!�#�!�Z�Z�s�DD:�:Ec�:�|jj�D]\}\}}|��|jj�|jj �|j �|j j �d|_d|_d|_yr ) r9rTrUr<�_at_fork_reinitr=rr>r?)rrNrrs rrAz_ResourceSharer._afterforkosv��"&�+�+�"3�"3�"5��C��$���G�#6�������� � �"�"�$��>�>�%��N�N� � �"������ ���rc�h�ddlm}|j�Jd��tjd�|tj�jd��|_|jj|_ tj|j��}d|_ |j�||_y) Nr)�ListenerzAlready have Listenerz0starting listener and thread for sending handles�)rH�backlog)�targetT)rIrZr=r�debugrrJrHrMr>r:�Thread�_serve�daemon�startr?)rrZ�ts rrCz_ResourceSharer._startzs���(��~�~�%�>�'>�>�%�� � �E�F�!�'�*A�*A�*C�*K�*K�UX�Y������.�.�� ����D�K�K�0����� ��� ���rc�*�ttd�r6tjtjtj�� |j j �5}|j�}|� ddd�y|\}}|jj|�\}} |||�|� ddd��v#|�wxYw#1swY�xYw#tj�s$tjtj��Y�UxYw)N�pthread_sigmask)�hasattr�signalre� SIG_BLOCK� valid_signalsr=�accept�recvr9�popr� is_exiting�sys� excepthook�exc_info)rr�msgrN�destination_pidrrs rr`z_ResourceSharer._serve�s����6�,�-��"�"�6�#3�#3�V�5I�5I�5K�L�� 4��^�^�*�*�,���)�)�+�C��{��-�,�,/�(�C��"&�+�+�/�/�#�"6�K�D�%� ��T�?�3���-������-�,�� 4����(��N�N�C�L�L�N�3�sH� C�#C �7C�#C �$ B>�-C �5C�> C�C � C�C�:Dr )r%r&r'r(rr�staticmethodrrrArCr`r)rrr6r6=s8��8�C�.�����$�* � �4rr6)r1rgr!rnr:�r�contextrr�__all__�platform�objectr r*r6rrr)rr�<module>rys��� � � � ������(���<�<�7����}��G� /�F� /� ��y��G� 3�� 3� Y4�f�Y4�x#�$�����rPK:W�\��-�-2__pycache__/resource_tracker.cpython-312.opt-1.pycnu�[���� T��hE+����ddlZddlZddlZddlZddlZddlmZddlmZgd�Ze ed�Z ejejfZ dd�iZejd k(rKddlZddlZe ed �rej%dej&i�ej%dej(i�Gd �de�ZGd�de�Ze�Zej4Zej6Zej8Zej:Zd�Zy)�N�)�spawn)�util)�ensure_running�register� unregister�pthread_sigmask�noopc��y�N�r ��9/usr/lib64/python3.12/multiprocessing/resource_tracker.py�<lambda>r!s��Dr�posix� sem_unlink� semaphore� shared_memoryc��eZdZy)�ReentrantCallErrorN)�__name__� __module__�__qualname__r rrrr6s��rrc��eZdZd�Zd�Zd�Zd d�Zejejejfd�Zd�Zd�Z d�Zd �Zd �Zd�Zy)�ResourceTrackerc�R�tj�|_d|_d|_yr)� threading�RLock�_lock�_fd�_pid��selfs r�__init__zResourceTracker.__init__<s���_�_�&�� ������ rc��td��)Nz8Reentrant call into the multiprocessing resource tracker)rr"s r�_reentrant_call_errorz%ResourceTracker._reentrant_call_errorAs�� !�F�H� Hrc�(�|jd��y)NF)�use_blocking_lock)�_stopr"s r�__del__zResourceTracker.__del__Is�� � � �U� �+rc�D�|r&|j5|j�ddd�y|jjd��} |j�|r|jj�yy#1swYyxYw#|r|jj�wwxYw)NF)�blocking)r�_stop_locked�acquire�release)r#r(�acquireds rr)zResourceTracker._stopOs��������!�!�#����z�z�)�)�5�)�9�H� )��!�!�#���J�J�&�&�(�������J�J�&�&�(��s�A4�B�4A=�Bc��|jj�dkDr|j�S|j�y|j�y||j�d|_||jd�d|_y)Nrr)r�_recursion_countr&r r!)r#�close�waitpid�waitstatus_to_exitcodes rr-zResourceTracker._stop_locked[sk���:�:�&�&�(�1�,��-�-�/�/��8�8����9�9��� �d�h�h������� � �1���� rc�:�|j�|jSr)rr r"s r�getfdzResourceTracker.getfdrs�������x�x�rc�(�|j5|jj�dkDr|j�cddd�S|j��|j �r ddd�ytj|j� |j� tj|jd�d|_d|_tjd�g} |jtjj��d}tj"�\}} |j|�t%j&�}|gt)j*�z}|d||zgz }d} t,r(t/j0t.j2t4�}t)j6|||�}|�%t/j0t.j8|� ||_||_ tj|� ddd�y#t$rY��]wxYw#t $rY��wxYw#|�%t/j0t.j8|�wwxYw#tj|��xYw#tj|�wxYw#1swYyxYw)z�Make 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.rNrzUresource_tracker: process died unexpectedly, relaunching. Some resources might leak.z:from multiprocessing.resource_tracker import main;main(%d)z-c)rr2r&r �_check_alive�osr3r!r4�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_SETMASK) r#�fds_to_pass�cmd�r�w�exe�args�prev_sigmask�pids rrzResourceTracker.ensure_runningvs%�� �Z�Z��z�z�*�*�,�q�0��1�1�3��Z��x�x�#��$�$�&���Z�������"���y�y�,�� � �4�9�9�a�0� ��� �� �� � �I�J��K� ��"�"�3�:�:�#4�#4�#6�7�O�C��7�7�9�D�A�q� ��"�"�1�%��*�*�,���u�t�@�@�B�B����s�Q�w��'�� $��Q�$�'-�'=�'=�f�>N�>N�P`�'a���-�-�c�4��E�C�#�/��.�.�v�/A�/A�<�P� ����� ������{�Z��$)������ �� ��,$�/��.�.�v�/A�/A�<�P�0�� �������� ������{�Z�s��-J�J�*J� ,H�6%J�-H� J�#A I�-AH'�2'I�I.�(J� H�J�H�J� H$� J�#H$�$J�')I�I�I+�+I.�.J�J�Jc�d� tj|jd�y#t$rYywxYw)z;Check that the pipe has not been closed by sending a probe.s PROBE:0:noop TF)r:�writer �OSErrorr"s rr9zResourceTracker._check_alive�s5�� � �H�H�T�X�X�0�1���� �� �s� #� /�/c�*�|jd||�y)z0Register name of resource with resource tracker.�REGISTERN��_send�r#�name�rtypes rrzResourceTracker.register�s��� � �:�t�U�+rc�*�|jd||�y)z2Unregister name of resource with resource tracker.� UNREGISTERNrYr[s rrzResourceTracker.unregister�s��� � �<��u�-rc�2� |j�dj |||�jd�}t |�dkDrtd��tj|j|�}y#t$rtjd|�d|�d��Y��wxYw)NzSResourceTracker called reentrantly for resource cleanup, which is unsupported. The z object z might leak.z{0}:{1}:{2} �asciiizmsg too long)rrr<r=�format�encode�len� ValueErrorr:rUr )r#rMr\r]�msg�nbytess rrZzResourceTracker._send�s��� <����!��$�$�S�$��6�=�=�g�F���s�8�c�>��^�,�,����$�(�(�C�(���"� <� �M�M���g�X�d�X�\�;� <� <�s�A.�.%B�BN)T)rrrr$r&r*r)r:r3r4r5r-r7rr9rrrZr rrrr:sU��� H�,� )��h�h�� � �!�8�8� �.�B�H �,�.�rrc��tjtjtj�tjtjtj�tr(tj tjt�tjtjfD]} |j��tj�D�cic] }|t���}} t!|d�5}|D]�} |j#�j%d�j'd�\}}}tj)|d�}|�t+d|�d|����|dk(r||j-|�n.|dk(r||j/|�n|d k(rnt1d |z���� ddd�|j7�D]B\}}|r$ t9j:dt=|�|fz�|D]} t||���Dy#t$rY��dwxYwcc}w#t$r1 tj2tj4��n#YnxYwY��VwxYw#1swY��xYw#t$rY��wxYw#t$r%} t9j:d|�d | ���Yd} ~ ��d} ~ wwxYw#wxYw#|j7�D]�\}}|r4 t9j:dt=|�|fz�n#t$rYnwxYw|D]I} t||�n1#t$r%} t9j:d|�d | ���Yd} ~ nd} ~ wwxYw�F#wxYw��wxYw)zRun resource tracker.�rbra�:NzCannot register z. for automatic cleanup: unknown resource type rXr_�PROBEzunrecognized command %rzQresource_tracker: There appear to be %d leaked %s objects to clean up at shutdownzresource_tracker: z: )rG�SIGINT�SIG_IGN�SIGTERMrFr �SIG_UNBLOCKrIr?�stdin�stdoutr3rB�_CLEANUP_FUNCS�keys�set�open�strip�decode�split�getre�add�remove�RuntimeError� excepthook�exc_info�itemsr<r=rd) �fd�fr]�cache�linerMr\�cleanup_func�rtype_cache�es r�mainr��s���M�M�&�-�-����0� �M�M�&�.�.�&�.�.�1�����v�1�1�3C�D��i�i���� $�� � �G�G�I�%�(6�':�':�'<�=�'<�e�U�C�E�\�'<�E�=�-� �"�d�^�q����'+�z�z�|�':�':�7�'C�'I�'I�#�'N�$�C��u�#1�#5�#5�e�T�#B�L�#�+�(�.�t�f�55�5:�G�=�>�>��j�(��e��(�(��.���,��e��+�+�D�1�����*�+D�s�+J�K�K��!��2#(�+�+�-��E�;����M�M�#N�#&�{�#3�U�";�#<�=� $���N�&�u�-�d�3��$�#0��?� �� �� >��*!����������7����� ��%�^��>!�����%�N� � � �D�!�&L�M�M��N����%#(�+�+�-��E�;����M�M�#N�#&�{�#3�U�";�#<�=��!�����#���N�&�u�-�d�3��$�N� � � �D�!�&L�M�M��N����D��$�#0�s�7H�H�4J.�I�B#H �*I�-J.�#I)�8I8� H�H� I�*$I�I�I �I�I�I�I�I&�"J.�) I5�4I5�8 J&�J!�J)�!J&�&J)�)J+�.M�#K,�+M�, K8 �5M�7K8 �8M�L�M� L?�L:�5M�:L?�?M�M�M�M)r:rGr?rr<�rr�__all__�hasattrrFrlrnrIrrr\�_multiprocessing�_posixshmem�updater� shm_unlinkr|r�objectr�_resource_trackerrrrr7r�r rr�<module>r�s��$ � � ����� 6���� 1�2� ��M�M�6�>�>�2���L����7�7�g�������.�����)�4�4� � ������/�/��� �� �f�f�f�R$�%��"�1�1���%�%�� � )� )� �����<rPK:W�\��,�,2__pycache__/resource_tracker.cpython-312.opt-2.pycnu�[���� T��hE+����ddlZddlZddlZddlZddlZddlmZddlmZgd�Ze ed�Z ejejfZ dd�iZejd k(rKddlZddlZe ed �rej%dej&i�ej%dej(i�Gd �de�ZGd�de�Ze�Zej4Zej6Zej8Zej:Zd�Zy)�N�)�spawn)�util)�ensure_running�register� unregister�pthread_sigmask�noopc��y�N�r ��9/usr/lib64/python3.12/multiprocessing/resource_tracker.py�<lambda>r!s��Dr�posix� sem_unlink� semaphore� shared_memoryc��eZdZy)�ReentrantCallErrorN)�__name__� __module__�__qualname__r rrrr6s��rrc��eZdZd�Zd�Zd�Zd d�Zejejejfd�Zd�Zd�Z d�Zd �Zd �Zd�Zy)�ResourceTrackerc�R�tj�|_d|_d|_yr)� threading�RLock�_lock�_fd�_pid��selfs r�__init__zResourceTracker.__init__<s���_�_�&�� ������ rc��td��)Nz8Reentrant call into the multiprocessing resource tracker)rr"s r�_reentrant_call_errorz%ResourceTracker._reentrant_call_errorAs�� !�F�H� Hrc�(�|jd��y)NF)�use_blocking_lock)�_stopr"s r�__del__zResourceTracker.__del__Is�� � � �U� �+rc�D�|r&|j5|j�ddd�y|jjd��} |j�|r|jj�yy#1swYyxYw#|r|jj�wwxYw)NF)�blocking)r�_stop_locked�acquire�release)r#r(�acquireds rr)zResourceTracker._stopOs��������!�!�#����z�z�)�)�5�)�9�H� )��!�!�#���J�J�&�&�(�������J�J�&�&�(��s�A4�B�4A=�Bc��|jj�dkDr|j�S|j�y|j�y||j�d|_||jd�d|_y)Nrr)r�_recursion_countr&r r!)r#�close�waitpid�waitstatus_to_exitcodes rr-zResourceTracker._stop_locked[sk���:�:�&�&�(�1�,��-�-�/�/��8�8����9�9��� �d�h�h������� � �1���� rc�:�|j�|jSr)rr r"s r�getfdzResourceTracker.getfdrs�������x�x�rc�*� |j5|jj�dkDr|j�cddd�S|j��|j �r ddd�ytj|j� |j� tj|jd�d|_d|_tjd�g} |jtjj��d}tj"�\}} |j|�t%j&�}|gt)j*�z}|d||zgz }d} t,r(t/j0t.j2t4�}t)j6|||�}|�%t/j0t.j8|� ||_||_ tj|� ddd�y#t$rY��]wxYw#t $rY��wxYw#|�%t/j0t.j8|�wwxYw#tj|��xYw#tj|�wxYw#1swYyxYw)NrrzUresource_tracker: process died unexpectedly, relaunching. Some resources might leak.z:from multiprocessing.resource_tracker import main;main(%d)z-c)rr2r&r �_check_alive�osr3r!r4�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_SETMASK) r#�fds_to_pass�cmd�r�w�exe�args�prev_sigmask�pids rrzResourceTracker.ensure_runningvs*�� /��Z�Z��z�z�*�*�,�q�0��1�1�3��Z��x�x�#��$�$�&���Z�������"���y�y�,�� � �4�9�9�a�0� ��� �� �� � �I�J��K� ��"�"�3�:�:�#4�#4�#6�7�O�C��7�7�9�D�A�q� ��"�"�1�%��*�*�,���u�t�@�@�B�B����s�Q�w��'�� $��Q�$�'-�'=�'=�f�>N�>N�P`�'a���-�-�c�4��E�C�#�/��.�.�v�/A�/A�<�P� ����� ������{�Z��$)������ �� ��,$�/��.�.�v�/A�/A�<�P�0�� �������� ������{�Z�s��-J �J �+J �,H�7%J �-H� J �$A I�.AH(�3'I�I/�)J � H�J �H�J � H%�!J �$H%�%J �()I�I�I,�,I/�/J�J � Jc�f� tj|jd�y#t$rYywxYw)Ns PROBE:0:noop TF)r:�writer �OSErrorr"s rr9zResourceTracker._check_alive�s8��I� � �H�H�T�X�X�0�1���� �� �s� $� 0�0c�,� |jd||�y)N�REGISTER��_send�r#�name�rtypes rrzResourceTracker.register�s��>�� � �:�t�U�+rc�,� |jd||�y)N� UNREGISTERrYr[s rrzResourceTracker.unregister�s��@�� � �<��u�-rc�2� |j�dj |||�jd�}t |�dkDrtd��tj|j|�}y#t$rtjd|�d|�d��Y��wxYw)NzSResourceTracker called reentrantly for resource cleanup, which is unsupported. The z object z might leak.z{0}:{1}:{2} �asciiizmsg too long)rrr<r=�format�encode�len� ValueErrorr:rUr )r#rMr\r]�msg�nbytess rrZzResourceTracker._send�s��� <����!��$�$�S�$��6�=�=�g�F���s�8�c�>��^�,�,����$�(�(�C�(���"� <� �M�M���g�X�d�X�\�;� <� <�s�A.�.%B�BN)T)rrrr$r&r*r)r:r3r4r5r-r7rr9rrrZr rrrr:sU��� H�,� )��h�h�� � �!�8�8� �.�B�H �,�.�rrc�� tjtjtj�tjtjtj�tr(tj tjt�tjtjfD]} |j��tj�D�cic] }|t���}} t!|d�5}|D]�} |j#�j%d�j'd�\}}}tj)|d�}|�t+d|�d|����|dk(r||j-|�n.|dk(r||j/|�n|dk(rnt1d |z���� ddd�|j7�D]B\}}|r$ t9j:d t=|�|fz�|D]} t||���Dy#t$rY��dwxYwcc}w#t$r1 tj2tj4��n#YnxYwY��VwxYw#1swY��xYw#t$rY��wxYw#t$r%} t9j:d|�d| ���Yd} ~ ��d} ~ wwxYw#wxYw#|j7�D]�\}}|r4 t9j:d t=|�|fz�n#t$rYnwxYw|D]I} t||�n1#t$r%} t9j:d|�d| ���Yd} ~ nd} ~ wwxYw�F#wxYw��wxYw) N�rbra�:zCannot register z. for automatic cleanup: unknown resource type rXr_�PROBEzunrecognized command %rzQresource_tracker: There appear to be %d leaked %s objects to clean up at shutdownzresource_tracker: z: )rG�SIGINT�SIG_IGN�SIGTERMrFr �SIG_UNBLOCKrIr?�stdin�stdoutr3rB�_CLEANUP_FUNCS�keys�set�open�strip�decode�split�getre�add�remove�RuntimeError� excepthook�exc_info�itemsr<r=rd) �fd�fr]�cache�linerMr\�cleanup_func�rtype_cache�es r�mainr��s��� �M�M�&�-�-����0� �M�M�&�.�.�&�.�.�1�����v�1�1�3C�D��i�i���� $�� � �G�G�I�%�(6�':�':�'<�=�'<�e�U�C�E�\�'<�E�=�-� �"�d�^�q����'+�z�z�|�':�':�7�'C�'I�'I�#�'N�$�C��u�#1�#5�#5�e�T�#B�L�#�+�(�.�t�f�55�5:�G�=�>�>��j�(��e��(�(��.���,��e��+�+�D�1�����*�+D�s�+J�K�K��!��2#(�+�+�-��E�;����M�M�#N�#&�{�#3�U�";�#<�=� $���N�&�u�-�d�3��$�#0��?� �� �� >��*!����������7����� ��%�^��>!�����%�N� � � �D�!�&L�M�M��N����%#(�+�+�-��E�;����M�M�#N�#&�{�#3�U�";�#<�=��!�����#���N�&�u�-�d�3��$�N� � � �D�!�&L�M�M��N����D��$�#0�s�8H� H�5J/�I�B#H!�+I�.J/�#I*�9I9� H�H�! I�+$I�I�I �I�I�I�I�I'�#J/�* I6�5I6�9 J'�J"�J*�"J'�'J*�*J,�/M � #K-�,M �- K9 �6M �8K9 �9M �L�M� M�L;�6M�;M�M�M �M�M )r:rGr?rr<�rr�__all__�hasattrrFrlrnrIrrr\�_multiprocessing�_posixshmem�updater� shm_unlinkr|r�objectr�_resource_trackerrrrr7r�r rr�<module>r�s��$ � � ����� 6���� 1�2� ��M�M�6�>�>�2���L����7�7�g�������.�����)�4�4� � ������/�/��� �� �f�f�f�R$�%��"�1�1���%�%�� � )� )� �����<rPK:W�\`9��.�.,__pycache__/resource_tracker.cpython-312.pycnu�[���� T��hE+����ddlZddlZddlZddlZddlZddlmZddlmZgd�Ze ed�Z ejejfZ dd�iZejd k(rKddlZddlZe ed �rej%dej&i�ej%dej(i�Gd �de�ZGd�de�Ze�Zej4Zej6Zej8Zej:Zd�Zy)�N�)�spawn)�util)�ensure_running�register� unregister�pthread_sigmask�noopc��y�N�r ��9/usr/lib64/python3.12/multiprocessing/resource_tracker.py�<lambda>r!s��Dr�posix� sem_unlink� semaphore� shared_memoryc��eZdZy)�ReentrantCallErrorN)�__name__� __module__�__qualname__r rrrr6s��rrc��eZdZd�Zd�Zd�Zd d�Zejejejfd�Zd�Zd�Z d�Zd �Zd �Zd�Zy)�ResourceTrackerc�R�tj�|_d|_d|_yr)� threading�RLock�_lock�_fd�_pid��selfs r�__init__zResourceTracker.__init__<s���_�_�&�� ������ rc��td��)Nz8Reentrant call into the multiprocessing resource tracker)rr"s r�_reentrant_call_errorz%ResourceTracker._reentrant_call_errorAs�� !�F�H� Hrc�(�|jd��y)NF)�use_blocking_lock)�_stopr"s r�__del__zResourceTracker.__del__Is�� � � �U� �+rc�D�|r&|j5|j�ddd�y|jjd��} |j�|r|jj�yy#1swYyxYw#|r|jj�wwxYw)NF)�blocking)r�_stop_locked�acquire�release)r#r(�acquireds rr)zResourceTracker._stopOs��������!�!�#����z�z�)�)�5�)�9�H� )��!�!�#���J�J�&�&�(�������J�J�&�&�(��s�A4�B�4A=�Bc��|jj�dkDr|j�S|j�y|j�y||j�d|_||jd�d|_y)Nrr)r�_recursion_countr&r r!)r#�close�waitpid�waitstatus_to_exitcodes rr-zResourceTracker._stop_locked[sk���:�:�&�&�(�1�,��-�-�/�/��8�8����9�9��� �d�h�h������� � �1���� rc�:�|j�|jSr)rr r"s r�getfdzResourceTracker.getfdrs�������x�x�rc�(�|j5|jj�dkDr|j�cddd�S|j��|j �r ddd�ytj|j� |j� tj|jd�d|_d|_tjd�g} |jtjj��d}tj"�\}} |j|�t%j&�}|gt)j*�z}|d||zgz }d} t,r(t/j0t.j2t4�}t)j6|||�}|�%t/j0t.j8|� ||_||_ tj|� ddd�y#t$rY��]wxYw#t $rY��wxYw#|�%t/j0t.j8|�wwxYw#tj|��xYw#tj|�wxYw#1swYyxYw)z�Make 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.rNrzUresource_tracker: process died unexpectedly, relaunching. Some resources might leak.z:from multiprocessing.resource_tracker import main;main(%d)z-c)rr2r&r �_check_alive�osr3r!r4�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_SETMASK) r#�fds_to_pass�cmd�r�w�exe�args�prev_sigmask�pids rrzResourceTracker.ensure_runningvs%�� �Z�Z��z�z�*�*�,�q�0��1�1�3��Z��x�x�#��$�$�&���Z�������"���y�y�,�� � �4�9�9�a�0� ��� �� �� � �I�J��K� ��"�"�3�:�:�#4�#4�#6�7�O�C��7�7�9�D�A�q� ��"�"�1�%��*�*�,���u�t�@�@�B�B����s�Q�w��'�� $��Q�$�'-�'=�'=�f�>N�>N�P`�'a���-�-�c�4��E�C�#�/��.�.�v�/A�/A�<�P� ����� ������{�Z��$)������ �� ��,$�/��.�.�v�/A�/A�<�P�0�� �������� ������{�Z�s��-J�J�*J� ,H�6%J�-H� J�#A I�-AH'�2'I�I.�(J� H�J�H�J� H$� J�#H$�$J�')I�I�I+�+I.�.J�J�Jc�d� tj|jd�y#t$rYywxYw)z;Check that the pipe has not been closed by sending a probe.s PROBE:0:noop TF)r:�writer �OSErrorr"s rr9zResourceTracker._check_alive�s5�� � �H�H�T�X�X�0�1���� �� �s� #� /�/c�*�|jd||�y)z0Register name of resource with resource tracker.�REGISTERN��_send�r#�name�rtypes rrzResourceTracker.register�s��� � �:�t�U�+rc�*�|jd||�y)z2Unregister name of resource with resource tracker.� UNREGISTERNrYr[s rrzResourceTracker.unregister�s��� � �<��u�-rc�� |j�dj |||�jd�}t |�dkDrtd��tj|j|�}|t |�k(s Jdj |t |����y#t$rtjd|�d|�d��Y��wxYw) NzSResourceTracker called reentrantly for resource cleanup, which is unsupported. The z object z might leak.z{0}:{1}:{2} �asciiizmsg too longznbytes {0:n} but len(msg) {1:n})rrr<r=�format�encode�len� ValueErrorr:rUr )r#rMr\r]�msg�nbytess rrZzResourceTracker._send�s��� <����!��$�$�S�$��6�=�=�g�F���s�8�c�>��^�,�,����$�(�(�C�(����S��!� �#D�#K�#K��C��H�$� �!��"� <� �M�M���g�X�d�X�\�;� <� <�s�B�%C�CN)T)rrrr$r&r*r)r:r3r4r5r-r7rr9rrrZr rrrr:sU��� H�,� )��h�h�� � �!�8�8� �.�B�H �,�.�rrc��tjtjtj�tjtjtj�tr(tj tjt�tjtjfD]} |j��tj�D�cic] }|t���}} t!|d�5}|D]�} |j#�j%d�j'd�\}}}tj)|d�}|�t+d|�d|����|dk(r||j-|�n.|dk(r||j/|�n|d k(rnt1d |z���� ddd�|j7�D]B\}}|r$ t9j:dt=|�|fz�|D]} t||���Dy#t$rY��dwxYwcc}w#t$r1 tj2tj4��n#YnxYwY��VwxYw#1swY��xYw#t$rY��wxYw#t$r%} t9j:d|�d | ���Yd} ~ ��d} ~ wwxYw#wxYw#|j7�D]�\}}|r4 t9j:dt=|�|fz�n#t$rYnwxYw|D]I} t||�n1#t$r%} t9j:d|�d | ���Yd} ~ nd} ~ wwxYw�F#wxYw��wxYw)zRun resource tracker.�rbra�:NzCannot register z. for automatic cleanup: unknown resource type rXr_�PROBEzunrecognized command %rzQresource_tracker: There appear to be %d leaked %s objects to clean up at shutdownzresource_tracker: z: )rG�SIGINT�SIG_IGN�SIGTERMrFr �SIG_UNBLOCKrIr?�stdin�stdoutr3rB�_CLEANUP_FUNCS�keys�set�open�strip�decode�split�getre�add�remove�RuntimeError� excepthook�exc_info�itemsr<r=rd) �fd�fr]�cache�linerMr\�cleanup_func�rtype_cache�es r�mainr��s���M�M�&�-�-����0� �M�M�&�.�.�&�.�.�1�����v�1�1�3C�D��i�i���� $�� � �G�G�I�%�(6�':�':�'<�=�'<�e�U�C�E�\�'<�E�=�-� �"�d�^�q����'+�z�z�|�':�':�7�'C�'I�'I�#�'N�$�C��u�#1�#5�#5�e�T�#B�L�#�+�(�.�t�f�55�5:�G�=�>�>��j�(��e��(�(��.���,��e��+�+�D�1�����*�+D�s�+J�K�K��!��2#(�+�+�-��E�;����M�M�#N�#&�{�#3�U�";�#<�=� $���N�&�u�-�d�3��$�#0��?� �� �� >��*!����������7����� ��%�^��>!�����%�N� � � �D�!�&L�M�M��N����%#(�+�+�-��E�;����M�M�#N�#&�{�#3�U�";�#<�=��!�����#���N�&�u�-�d�3��$�N� � � �D�!�&L�M�M��N����D��$�#0�s�7H�H�4J.�I�B#H �*I�-J.�#I)�8I8� H�H� I�*$I�I�I �I�I�I�I�I&�"J.�) I5�4I5�8 J&�J!�J)�!J&�&J)�)J+�.M�#K,�+M�, K8 �5M�7K8 �8M�L�M� L?�L:�5M�:L?�?M�M�M�M)r:rGr?rr<�rr�__all__�hasattrrFrlrnrIrrr\�_multiprocessing�_posixshmem�updater� shm_unlinkr|r�objectr�_resource_trackerrrrr7r�r rr�<module>r�s��$ � � ����� 6���� 1�2� ��M�M�6�>�>�2���L����7�7�g�������.�����)�4�4� � ������/�/��� �� �f�f�f�R$�%��"�1�1���%�%�� � )� )� �����<rPK:W�\���TZTZ/__pycache__/shared_memory.cpython-312.opt-1.pycnu�[���� T��hH���dZddgZddlmZddlZddlZddlZddlZddlZddl Z ejdk(rddlZdZnddl Z dZd d lmZej ej"zZdZerdZnd Zd�ZGd�d�ZdZGd�d�Zy)z�Provides shared memory for direct access across processes. The API of this package is currently provisional. Refer to the documentation for details. �SharedMemory� ShareableList�)�partialN�ntFT�)�resource_tracker�z/psm_�wnsm_c�p�ttt�z dz}ttj|�z}|S)z6Create a random filename for the shared memory object.�)�_SHM_SAFE_NAME_LENGTH�len�_SHM_NAME_PREFIX�secrets� token_hex)�nbytes�names �6/usr/lib64/python3.12/multiprocessing/shared_memory.py�_make_filenamer(s3��$�c�*:�&;�;�� A�F��g�/�/��7�7�D��K�c��eZdZdZdZdZdZdZejZ dZerdndZ dd�Zd�Zd �Zd �Zed��Zed��Zed ��Zd�Zd�Zy)ra�Creates a new shared memory block or attaches to an existing shared memory block. Every shared memory block is assigned a unique name. This enables one process to create a shared memory block with a particular name so that a different process can attach to that same shared memory block using that same name. As a resource for sharing data across processes, shared memory blocks may outlive the original process that created them. When one process no longer needs access to a shared memory block that might still be needed by other processes, the close() method should be called. When a shared memory block is no longer needed by any process, the unlink() method should be called to ensure proper cleanup.N���i�TFc��|dk\std��|r,ttjz|_|dk(rtd��|�(|jtj zstd��t�r)|�E t�} tj||j|j��|_||_ nK|jrd|zn|}tj||j|j��|_||_ |r"|r tj|j|�tj |j�}|j"}t%j$|j|�|_t-j.|jd��n�|�r" |� t�n|}t1j2t0j4t0j6t0j8|dz d z|d z|�} t1j:�}|t0j<k(rd|�Ktt>j@tjBt>j@�|t0j<�� t1jD|���t%j$d ||��|_t1jD|�||_ n�||_ t1jFt0jHd|�} t1jJ|t0jHddd�}t1jD|� t1jL|�}t1jN|�t%j$d ||��|_||_(tS|j&�|_*y#t$rY��+wxYw#t($r|j+��wxYw#t1jD|�wxYw#t1jD|�wxYw#t1jN|�wxYw) Nrz!'size' must be a positive integerz4'size' must be a positive number different from zeroz&'name' can only be None if create=True)�mode�/� shared_memory� l��r)�tagnameF)+� ValueError�_O_CREX�os�O_RDWR�_flags�O_EXCL� _USE_POSIXr�_posixshmem�shm_open�_mode�_fd�FileExistsError�_name�_prepend_leading_slash� ftruncate�fstat�st_size�mmap�_mmap�OSError�unlinkr�register�_winapi�CreateFileMapping�INVALID_HANDLE_VALUE�NULL�PAGE_READWRITE�GetLastError�ERROR_ALREADY_EXISTS�errno�EEXIST�strerror�CloseHandle�OpenFileMapping� FILE_MAP_READ� MapViewOfFile�VirtualQuerySize�UnmapViewOfFile�_size� memoryview�_buf) �selfr�create�size�stats� temp_name�h_map�last_error_code�p_bufs r�__init__zSharedMemory.__init__KsO���q�y��@�A�A��!�B�I�I�-�D�K��q�y� �!W�X�X��<����b�i�i� 7��E�F�F���|��)�+�D�!�#.�#7�#7� � �K�K�!%���$���"&�D�J��%)�%@�%@�s�T�z�d��&�/�/���K�K������� "�� � ��d��L�L����4�0�������*���}�}��!�Y�Y�t�x�x��6�� � �%�%�d�j�j�/�B���48�L�� 0�d�I�$�5�5��4�4�����.�.����z�1��z�)�!� �E�3�*1�*>�*>�*@��*�g�.J�.J�J�#�/�&5�$)�L�L�$&�K�K����$=�$(�$+�$@�$@� '"�!"�!)� �+�+�E�2�&*�Y�Y�r�4��%K�� ��+�+�E�2�!*�D�J��"�� � �/�/��)�)����� /�#�1�1���-�-�����E��'�'��.�3�"�3�3�E�:�D��+�+�E�2�!�Y�Y�r�4��>�� ��� ��t�z�z�*�� ��k+�!� �!��$� ���� �� ��J �+�+�E�2��,�'�'��.���+�+�E�2�sJ�>1N�A4N!�9A4N?�N?�+'O�(O3� N�N�!N<�?O�O0�3P c�D� |j�y#t$rYywxYw�N)�closer2�rHs r�__del__zSharedMemory.__del__�s"�� ��J�J�L��� �� �s�� �c�L�|j|jd|jffS)NF)� __class__rrJrTs r� __reduce__zSharedMemory.__reduce__�s)���N�N�� � ��� � � � � rc�h�|jj�d|j�d|j�d�S)N�(z, size=�))rW�__name__rrJrTs r�__repr__zSharedMemory.__repr__�s.���.�.�)�)�*�!�D�I�I�=��� � �{�!�L�Lrc��|jS)z4A memoryview of contents of the shared memory block.)rGrTs r�bufzSharedMemory.buf�s���y�y�rc��|j}tr6|jr*|jjd�r|jdd}|S)z4Unique name that identifies the shared memory block.rrN)r+r%r,� startswith)rH� reported_names rrzSharedMemory.name�s?��� � � ��$�5�5��z�z�$�$�S�)� $� � �1�2�� ��rc��|jS)zSize in bytes.)rErTs rrJzSharedMemory.size�s���z�z�rc�2�|j�!|jj�d|_|j�!|jj�d|_tr7|j dk\r't j|j �d|_yyy)zkCloses access to the shared memory from this instance but does not destroy the shared memory block.Nrr)rG�releaser1rSr%r)r!rTs rrSzSharedMemory.close�sq���9�9� ��I�I�����D�I��:�:�!��J�J�����D�J��$�(�(�a�-��H�H�T�X�X���D�H�(�:rc��trM|jr@tj|j�t j |jd�yyy)z�Requests that the underlying shared memory block be destroyed. In order to ensure proper cleanup of resources, unlink should be called once (and only once) across all processes which have access to the shared memory block.rN)r%r+r&� shm_unlinkr� unregisterrTs rr3zSharedMemory.unlink�s:���$�*�*��"�"�4�:�:�.��'�'�� � �O�D�%�:r)NFr)r\� __module__�__qualname__�__doc__r+r)r1rGr!r"r#r(r%r,rPrUrXr]�propertyr_rrJrSr3�rrrr2s��� B� �E� �C��E��D� �Y�Y�F��E�%/�T�U��l+�\� �M��������������Er�utf8c�H�eZdZdZedededededdjdiZ dZd �d �d�d�d �Ze d��Zd"dd�d�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zd �Z d!�Z!e"e#jH�Z%y)#ra�Pattern for a mutable list-like object shareable via a shared memory block. It differs from the built-in list type in that these lists can not change their overall length (i.e. no append, insert, etc.) Because values are packed into a memoryview as bytes, the struct packing format for any storable value must require no more than 8 characters to describe its format.�q�dzxxxxxxx?z%dsNzxxxxxx?x�c��|SrRrm��values r�<lambda>zShareableList.<lambda>s��rc�J�|jd�jt�S�N�)�rstrip�decode� _encodingrts rrvzShareableList.<lambda>s�����g�.�5�5�i�@rc�$�|jd�Srx)rzrts rrvzShareableList.<lambda>s �����g�.rc��yrRrm)�_values rrvzShareableList.<lambda>s��$r)rrr�c��t|ttdjf�syt|t�ryt|t�ryy)z�Used in concert with _back_transforms_mapping to convert values into the appropriate Python objects when retrieving them from the list as well as when storing them.Nrrrr�)� isinstance�str�bytesrWrts r�_extract_recreation_codez&ShareableList._extract_recreation_codes9�� �%�#�u�d�n�n�!=�>�� ��s� #�� ��u� %��r�rc�� �|�|��d|xsd}|D�cgc]r}t|ttf�s|jt |�nA|jt |�|j t |�|j zdzzfz��t}}t |�|_d}dg|_|D]B}||ddk7r|j n t|dd�z }|jj|��D|D�cgc]}|j|���}}tjd|jzdj|�z|j z|j"z�}t%|d|� �|_nt%|�|_|��,t(� tj*d|jz|j&j,d|jg|j���tj*dj�|j&j,|j.g� fd �|D����tj*|j |j&j,|j0g� fd�|D����tj*|j"|j&j,|j2g���yt |�|_t5tj6|j|j&j,d��|_ycc}wcc}w) Nrmrrr�srp�T)rIrJc3�d�K�|]'}t|t�r|j��n|���)y�wrR)r�r��encode��.0�v�_encs �r� <genexpr>z)ShareableList.__init__.<locals>.<genexpr>Zs(�����P�x�!�J�q�#�$6�!�(�(�4�.�A�=�x�s�-0c3�@�K�|]}|j�����y�wrR)r�r�s �rr�z)ShareableList.__init__.<locals>.<genexpr>`s�����3�(�Q�!�(�(�4�.�(���rr)r�r�r��_types_mapping�type� _alignmentr� _list_len�_allocated_offsets�int�appendr��struct�calcsize�_format_size_metainfo�join�_format_packing_metainfo�_format_back_transform_codesr�shmr|� pack_intor_�_offset_data_start�_offset_packing_formats�_offset_back_transform_codes�list�unpack_from) rH�sequencer�item�_formats�offset�fmt�_recreation_codes�requested_sizer�s @rrPzShareableList.__init__*s�����<�8�/��~�2�H�%� �%�D� &�d�S�%�L�9��#�#�D��J�/��,�,�T�$�Z�8����3�t�9����+G�!�+K�L�<��� %� ��!��]�D�N��F�()�c�D�#����S��W��^�$�/�/��S��"�X��N���'�'�.�.�v�6� �AI�!�@H���-�-�d�3�� �!�$�_�_��d�0�0�0�����!�"��-�-�.��1�1�2��N�$�D��N�K�D�H�#�D�)�D�H����D�����d�0�0�0���������� � �)�)� � �������!�������'�'� �Q�x�P� � ����-�-�������,�,� �4�(�3� � ����1�1�������1�1� �$� �!��Y�D�N�&*��"�"��.�.��H�H�L�L���'�D�#��}��$!s�A7K>�/Lc�L�|dk\r|n||jz}||jk\s|jdkrtd��tjd|jj |j|dzz�d}|jd�}|jt�}|S)z>Gets the packing format for a single value stored in the list.r� Requested position out of range.�8srrry) r�� IndexErrorr�r�r�r_r�rzr{r|)rH�positionr�r�� fmt_as_strs r�_get_packing_formatz!ShareableList._get_packing_formatss���'�1�}�8�(�T�^�^�2K������&�D�N�N�Q�,>��?�@�@������H�H�L�L��(�(�8�a�<�7� �� �� �h�h�w����Z�Z� �*� ��rc���||jk\s|jdkrtd��tjd|jj |j|z�d}|j|}|S)z9Gets the back transformation function for a single value.rr��b)r�r�r�r�r�r_r��_back_transforms_mapping)rHr��transform_code�transform_functions r�_get_back_transformz!ShareableList._get_back_transform�sv�� ����&�D�N�N�Q�,>��?�@�@��+�+���H�H�L�L��-�-��8� �� �� "�:�:�>�J��!�!rc��||jk\s|jdkrtd��tjd|jj |j|dzz|jt��|j|�}tjd|jj |j|z|�y)zvSets the packing format and back transformation code for a single value in the list at the specified position.rr�r�rrr�N)r�r�r�r�r�r_r�r�r|r�r�)rHr�r�rur�s r�!_set_packing_format_and_transformz/ShareableList._set_packing_format_and_transform�s��� ����&�D�N�N�Q�,>��?�@�@������H�H�L�L��(�(�8�a�<�7����i�(� ��6�6�u�=�������H�H�L�L��-�-��8�� rc�F�|dk\r|n||jz} |j|j|z}tj|j|�|jj|�\}|j|�}||�}|S#t$rtd��wxYw)Nrzindex out of range) r�r�r�r�r�r�r�r_r�r�)rHr�r�r��back_transforms r�__getitem__zShareableList.__getitem__�s���'�1�}�8�(�T�^�^�2K�� 3��,�,�t�/F�/F�x�/P�P�F��%�%��(�(��2��������D�Q��1�1�(�;���1������ � 3��1�2�2� 3�s�AB�B c��|dk\r|n||jz} |j|}|j|z}|j|�}t|ttf�s|jt|�}|}nw|j|dz|z }t|t�r|jt�n|}t|�|kDrtd��|ddk(r|}n|jt|fz}|j|||�tj ||j"j$||�y#t$rt d��wxYw)Nrzassignment index out of rangerz(bytes/str item exceeds available storagerr�)r�r�r�r�r�r�r�r�r�r�r�r|rrr�r�r�r�r_) rHr�ru�item_offsetr��current_format� new_format� encoded_value�allocated_lengths r�__setitem__zShareableList.__setitem__�sO��'�1�}�8�(�T�^�^�2K�� >��1�1�(�;�K��,�,�{�:�F�!�5�5�h�?�N��%�#�u��.��,�,�T�%�[�9�J�!�M�#�6�6�x�!�|�D�{�R��!+�5�#� 6�#�\�\�)�4�<A� ��=�!�$4�4� �!K�L�L��b�!�S�(�+� �!�0�0��5�$�9�� � �.�.���� � ����T�X�X�\�\�6�=�I��3� >��<�=�=� >�s�/D/�/Ec�\�t|j|jj��dfS)Nr�rm)rrWr�rrTs rrXzShareableList.__reduce__�s ���t�~�~�D�H�H�M�M�:�B�>�>rc�^�tjd|jjd�dS)Nrpr)r�r�r�r_rTs r�__len__zShareableList.__len__�s$���!�!�#�t�x�x�|�|�Q�7��:�:rc�z�|jj�dt|��d|jj�d�S)NrZz, name=r[)rWr\r�r�rrTs rr]zShareableList.__repr__�s3���.�.�)�)�*�!�D��J�<�w�t�x�x�}�}�>O�q�Q�Qrc�^��dj�fd�t�j�D��S)z=The struct packing format used by all currently stored items.r�c3�@�K�|]}�j|����y�wrR)r�)r��irHs �rr�z'ShareableList.format.<locals>.<genexpr>�s!����� �1F�A�D�$�$�Q�'�1F�r�)r��ranger�rTs`r�formatzShareableList.format�s,����w�w� �16�t�~�~�1F� � � rc�&�d|jdzzS)z>The struct packing format used for the items' storage offsets.rpr�r�rTs rr�z#ShareableList._format_size_metainfo�s���d�n�n�q�(�)�)rc� �d|jzS)z>The struct packing format used for the items' packing formats.r�r�rTs rr�z&ShareableList._format_packing_metainfo�s���d�n�n�$�$rc� �d|jzS)z>The struct packing format used for the items' back transforms.r�r�rTs rr�z*ShareableList._format_back_transform_codes�s���T�^�^�#�#rc�&�|jdzdzS)Nrrrr�rTs rr�z ShareableList._offset_data_start�s������"�a�'�'rc�:�|j|jdzS)Nr)r�r�rTs rr�z%ShareableList._offset_packing_formats�s���&�&��)@�)@��)D�D�Drc�:�|j|jdzzS)Nrr)r�r�rTs rr�z*ShareableList._offset_back_transform_codess���+�+�d�n�n�q�.@�@�@rc�,��t�fd�|D��S)zCL.count(value) -> integer -- return number of occurrences of value.c3�(�K�|] }�|k(���y�wrRrm)r��entryrus �rr�z&ShareableList.count.<locals>.<genexpr> s�����4�t�e�5�E�>�t�s�)�sum)rHrus `r�countzShareableList.counts����4�t�4�4�4rc�V�t|�D]\}}||k(s�|cSt|�d���)zpL.index(value) -> integer -- return first index of value. Raises ValueError if the value is not present.z not in this container)� enumerater)rHrur�r�s r�indexzShareableList.indexs7�� )���O�H�e���~��� /���y�(>�?�@�@rrR)&r\rirjrkr��float�boolr�r�rWr�r�r��staticmethodr�rPr�r�r�r�r�rXr�r]rlr�r�r�r�r�r�r�r�r��classmethod�types�GenericAlias�__class_getitem__rmrrrr�sI��*�& �S� �s��j��U� �u���� � �N��J��@�.�� ������G�d�G�R� "� �,�"J�B?�;�R�� �� ��*��*��%��%��$��$��(��(� �E��E��A��A�5� A�$�E�$6�$6�7�r)rk�__all__� functoolsrr0r!r<r�rr�rr5r%r&r�r�O_CREATr$r r rrrr|rrmrr�<module>r�s���� �O� -���� �� ����7�7�d�?���J���J�� �*�*�r�y�y� ����������BE�BE�J � �]8�]8rPK:W�\0>��O�O/__pycache__/shared_memory.cpython-312.opt-2.pycnu�[���� T��hH��� ddgZddlmZddlZddlZddlZddlZddlZddlZejdk(rddl Z dZnddlZdZdd l mZejej zZd ZerdZndZd �ZGd�d�ZdZGd�d�Zy)�SharedMemory� ShareableList�)�partialN�ntFT�)�resource_tracker�z/psm_�wnsm_c�r� ttt�z dz}ttj|�z}|S)N�)�_SHM_SAFE_NAME_LENGTH�len�_SHM_NAME_PREFIX�secrets� token_hex)�nbytes�names �6/usr/lib64/python3.12/multiprocessing/shared_memory.py�_make_filenamer(s4��<�#�c�*:�&;�;�� A�F��g�/�/��7�7�D��K�c��eZdZ dZdZdZdZejZ dZ erdndZdd�Z d�Zd�Zd �Zed ��Zed��Zed��Zd �Zd�Zy)rN���i�TFc��|dk\std��|r,ttjz|_|dk(rtd��|�(|jtj zstd��t�r)|�E t�} tj||j|j��|_||_ nK|jrd|zn|}tj||j|j��|_||_ |r"|r tj|j|�tj |j�}|j"}t%j$|j|�|_t-j.|jd��n�|�r" |� t�n|}t1j2t0j4t0j6t0j8|dz d z|d z|�} t1j:�}|t0j<k(rd|�Ktt>j@tjBt>j@�|t0j<�� t1jD|���t%j$d ||��|_t1jD|�||_ n�||_ t1jFt0jHd|�} t1jJ|t0jHddd�}t1jD|� t1jL|�}t1jN|�t%j$d ||��|_||_(tS|j&�|_*y#t$rY��+wxYw#t($r|j+��wxYw#t1jD|�wxYw#t1jD|�wxYw#t1jN|�wxYw) Nrz!'size' must be a positive integerz4'size' must be a positive number different from zeroz&'name' can only be None if create=True)�mode�/� shared_memory� l��r)�tagnameF)+� ValueError�_O_CREX�os�O_RDWR�_flags�O_EXCL� _USE_POSIXr�_posixshmem�shm_open�_mode�_fd�FileExistsError�_name�_prepend_leading_slash� ftruncate�fstat�st_size�mmap�_mmap�OSError�unlinkr�register�_winapi�CreateFileMapping�INVALID_HANDLE_VALUE�NULL�PAGE_READWRITE�GetLastError�ERROR_ALREADY_EXISTS�errno�EEXIST�strerror�CloseHandle�OpenFileMapping� FILE_MAP_READ� MapViewOfFile�VirtualQuerySize�UnmapViewOfFile�_size� memoryview�_buf) �selfr�create�size�stats� temp_name�h_map�last_error_code�p_bufs r�__init__zSharedMemory.__init__KsO���q�y��@�A�A��!�B�I�I�-�D�K��q�y� �!W�X�X��<����b�i�i� 7��E�F�F���|��)�+�D�!�#.�#7�#7� � �K�K�!%���$���"&�D�J��%)�%@�%@�s�T�z�d��&�/�/���K�K������� "�� � ��d��L�L����4�0�������*���}�}��!�Y�Y�t�x�x��6�� � �%�%�d�j�j�/�B���48�L�� 0�d�I�$�5�5��4�4�����.�.����z�1��z�)�!� �E�3�*1�*>�*>�*@��*�g�.J�.J�J�#�/�&5�$)�L�L�$&�K�K����$=�$(�$+�$@�$@� '"�!"�!)� �+�+�E�2�&*�Y�Y�r�4��%K�� ��+�+�E�2�!*�D�J��"�� � �/�/��)�)����� /�#�1�1���-�-�����E��'�'��.�3�"�3�3�E�:�D��+�+�E�2�!�Y�Y�r�4��>�� ��� ��t�z�z�*�� ��k+�!� �!��$� ���� �� ��J �+�+�E�2��,�'�'��.���+�+�E�2�sJ�>1N�A4N!�9A4N?�N?�+'O�(O3� N�N�!N<�?O�O0�3P c�D� |j�y#t$rYywxYw�N)�closer2�rHs r�__del__zSharedMemory.__del__�s"�� ��J�J�L��� �� �s�� �c�L�|j|jd|jffS)NF)� __class__rrJrTs r� __reduce__zSharedMemory.__reduce__�s)���N�N�� � ��� � � � � rc�h�|jj�d|j�d|j�d�S)N�(z, size=�))rW�__name__rrJrTs r�__repr__zSharedMemory.__repr__�s.���.�.�)�)�*�!�D�I�I�=��� � �{�!�L�Lrc�� |jSrR)rGrTs r�bufzSharedMemory.buf�s��>��y�y�rc�� |j}tr6|jr*|jjd�r|jdd}|S)Nrr)r+r%r,� startswith)rH� reported_names rrzSharedMemory.name�s@��>�� � � ��$�5�5��z�z�$�$�S�)� $� � �1�2�� ��rc�� |jSrR)rErTs rrJzSharedMemory.size�s����z�z�rc�4� |j�!|jj�d|_|j�!|jj�d|_tr7|j dk\r't j|j �d|_yyy)Nrr)rG�releaser1rSr%r)r!rTs rrSzSharedMemory.close�st�� 0��9�9� ��I�I�����D�I��:�:�!��J�J�����D�J��$�(�(�a�-��H�H�T�X�X���D�H�(�:rc�� trM|jr@tj|j�t j |jd�yyy)Nr)r%r+r&� shm_unlinkr� unregisterrTs rr3zSharedMemory.unlink�s?�� '� �$�*�*��"�"�4�:�:�.��'�'�� � �O�D�%�:r)NFr)r\� __module__�__qualname__r+r)r1rGr!r"r#r(r%r,rPrUrXr]�propertyr_rrJrSr3�rrrr2s��� B� �E� �C��E��D� �Y�Y�F��E�%/�T�U��l+�\� �M��������������Er�utf8c�F�eZdZ edededededdjdiZ dZ d�d �d �d�d�Zed ��Z d!dd�d�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zd�Zd �Z e!e"jF�Z$y)"r�q�dzxxxxxxx?z%dsNzxxxxxx?x�c��|SrRrl��values r�<lambda>zShareableList.<lambda>s��rc�J�|jd�jt�S�N�)�rstrip�decode� _encodingrss rruzShareableList.<lambda>s�����g�.�5�5�i�@rc�$�|jd�Srw)ryrss rruzShareableList.<lambda>s �����g�.rc��yrRrl)�_values rruzShareableList.<lambda>s��$r)rrr�c�� t|ttdjf�syt|t�ryt|t�ryy)Nrrrr)� isinstance�str�bytesrWrss r�_extract_recreation_codez&ShareableList._extract_recreation_codes>�� 2��%�#�u�d�n�n�!=�>�� ��s� #�� ��u� %��r�rc�� �|�|��d|xsd}|D�cgc]r}t|ttf�s|jt |�nA|jt |�|j t |�|j zdzzfz��t}}t |�|_d}dg|_|D]B}||ddk7r|j n t|dd�z }|jj|��D|D�cgc]}|j|���}}tjd|jzdj|�z|j z|j"z�}t%|d|� �|_nt%|�|_|��,t(� tj*d|jz|j&j,d|jg|j���tj*dj�|j&j,|j.g� fd �|D����tj*|j |j&j,|j0g� fd�|D����tj*|j"|j&j,|j2g���yt |�|_t5tj6|j|j&j,d��|_ycc}wcc}w) Nrlrrr�sro�T)rIrJc3�d�K�|]'}t|t�r|j��n|���)y�wrR)r�r��encode��.0�v�_encs �r� <genexpr>z)ShareableList.__init__.<locals>.<genexpr>Zs(�����P�x�!�J�q�#�$6�!�(�(�4�.�A�=�x�s�-0c3�@�K�|]}|j�����y�wrR)r�r�s �rr�z)ShareableList.__init__.<locals>.<genexpr>`s�����3�(�Q�!�(�(�4�.�(���rq)r�r�r��_types_mapping�type� _alignmentr� _list_len�_allocated_offsets�int�appendr��struct�calcsize�_format_size_metainfo�join�_format_packing_metainfo�_format_back_transform_codesr�shmr{� pack_intor_�_offset_data_start�_offset_packing_formats�_offset_back_transform_codes�list�unpack_from) rH�sequencer�item�_formats�offset�fmt�_recreation_codes�requested_sizer�s @rrPzShareableList.__init__*s�����<�8�/��~�2�H�%� �%�D� &�d�S�%�L�9��#�#�D��J�/��,�,�T�$�Z�8����3�t�9����+G�!�+K�L�<��� %� ��!��]�D�N��F�()�c�D�#����S��W��^�$�/�/��S��"�X��N���'�'�.�.�v�6� �AI�!�@H���-�-�d�3�� �!�$�_�_��d�0�0�0�����!�"��-�-�.��1�1�2��N�$�D��N�K�D�H�#�D�)�D�H����D�����d�0�0�0���������� � �)�)� � �������!�������'�'� �Q�x�P� � ����-�-�������,�,� �4�(�3� � ����1�1�������1�1� �$� �!��Y�D�N�&*��"�"��.�.��H�H�L�L���'�D�#��}��$!s�A7K>�/Lc�N� |dk\r|n||jz}||jk\s|jdkrtd��tjd|jj |j|dzz�d}|jd�}|jt�}|S)Nr� Requested position out of range.�8srqrx) r�� IndexErrorr�r�r�r_r�ryrzr{)rH�positionr�r�� fmt_as_strs r�_get_packing_formatz!ShareableList._get_packing_formatss���H�'�1�}�8�(�T�^�^�2K������&�D�N�N�Q�,>��?�@�@������H�H�L�L��(�(�8�a�<�7� �� �� �h�h�w����Z�Z� �*� ��rc��� ||jk\s|jdkrtd��tjd|jj |j|z�d}|j|}|S)Nrr��b)r�r�r�r�r�r_r��_back_transforms_mapping)rHr��transform_code�transform_functions r�_get_back_transformz!ShareableList._get_back_transform�sw��C�����&�D�N�N�Q�,>��?�@�@��+�+���H�H�L�L��-�-��8� �� �� "�:�:�>�J��!�!rc�� ||jk\s|jdkrtd��tjd|jj |j|dzz|jt��|j|�}tjd|jj |j|z|�y)Nrr�r�rqr�)r�r�r�r�r�r_r�r�r{r�r�)rHr�r�rtr�s r�!_set_packing_format_and_transformz/ShareableList._set_packing_format_and_transform�s��� ?� ����&�D�N�N�Q�,>��?�@�@������H�H�L�L��(�(�8�a�<�7����i�(� ��6�6�u�=�������H�H�L�L��-�-��8�� rc�F�|dk\r|n||jz} |j|j|z}tj|j|�|jj|�\}|j|�}||�}|S#t$rtd��wxYw)Nrzindex out of range) r�r�r�r�r�r�r�r_r�r�)rHr�r�r��back_transforms r�__getitem__zShareableList.__getitem__�s���'�1�}�8�(�T�^�^�2K�� 3��,�,�t�/F�/F�x�/P�P�F��%�%��(�(��2��������D�Q��1�1�(�;���1������ � 3��1�2�2� 3�s�AB�B c��|dk\r|n||jz} |j|}|j|z}|j|�}t|ttf�s|jt|�}|}nw|j|dz|z }t|t�r|jt�n|}t|�|kDrtd��|ddk(r|}n|jt|fz}|j|||�tj ||j"j$||�y#t$rt d��wxYw)Nrzassignment index out of rangerz(bytes/str item exceeds available storagerr�)r�r�r�r�r�r�r�r�r�r�r�r{rrr�r�r�r�r_) rHr�rt�item_offsetr��current_format� new_format� encoded_value�allocated_lengths r�__setitem__zShareableList.__setitem__�sO��'�1�}�8�(�T�^�^�2K�� >��1�1�(�;�K��,�,�{�:�F�!�5�5�h�?�N��%�#�u��.��,�,�T�%�[�9�J�!�M�#�6�6�x�!�|�D�{�R��!+�5�#� 6�#�\�\�)�4�<A� ��=�!�$4�4� �!K�L�L��b�!�S�(�+� �!�0�0��5�$�9�� � �.�.���� � ����T�X�X�\�\�6�=�I��3� >��<�=�=� >�s�/D/�/Ec�\�t|j|jj��dfS)Nr�rl)rrWr�rrTs rrXzShareableList.__reduce__�s ���t�~�~�D�H�H�M�M�:�B�>�>rc�^�tjd|jjd�dS)Nror)r�r�r�r_rTs r�__len__zShareableList.__len__�s$���!�!�#�t�x�x�|�|�Q�7��:�:rc�z�|jj�dt|��d|jj�d�S)NrZz, name=r[)rWr\r�r�rrTs rr]zShareableList.__repr__�s3���.�.�)�)�*�!�D��J�<�w�t�x�x�}�}�>O�q�Q�Qrc�`�� dj�fd�t�j�D��S)Nr�c3�@�K�|]}�j|����y�wrR)r�)r��irHs �rr�z'ShareableList.format.<locals>.<genexpr>�s!����� �1F�A�D�$�$�Q�'�1F�r�)r��ranger�rTs`r�formatzShareableList.format�s-���G��w�w� �16�t�~�~�1F� � � rc�(� d|jdzzS)Nror�r�rTs rr�z#ShareableList._format_size_metainfo�s��H��d�n�n�q�(�)�)rc�"� d|jzS)Nr�r�rTs rr�z&ShareableList._format_packing_metainfo�s��H��d�n�n�$�$rc�"� d|jzS)Nr�r�rTs rr�z*ShareableList._format_back_transform_codes�s��H��T�^�^�#�#rc�&�|jdzdzS)Nrrqr�rTs rr�z ShareableList._offset_data_start�s������"�a�'�'rc�:�|j|jdzS)Nr)r�r�rTs rr�z%ShareableList._offset_packing_formats�s���&�&��)@�)@��)D�D�Drc�:�|j|jdzzS)Nrq)r�r�rTs rr�z*ShareableList._offset_back_transform_codess���+�+�d�n�n�q�.@�@�@rc�.�� t�fd�|D��S)Nc3�(�K�|] }�|k(���y�wrRrl)r��entryrts �rr�z&ShareableList.count.<locals>.<genexpr> s�����4�t�e�5�E�>�t�s�)�sum)rHrts `r�countzShareableList.counts���M��4�t�4�4�4rc�X� t|�D]\}}||k(s�|cSt|�d���)Nz not in this container)� enumerater)rHrtr�r�s r�indexzShareableList.indexs<�� :� )���O�H�e���~��� /���y�(>�?�@�@rrR)%r\rirjr��float�boolr�r�rWr�r�r��staticmethodr�rPr�r�r�r�r�rXr�r]rkr�r�r�r�r�r�r�r�r��classmethod�types�GenericAlias�__class_getitem__rlrrrr�sI��*�& �S� �s��j��U� �u���� � �N��J��@�.�� ������G�d�G�R� "� �,�"J�B?�;�R�� �� ��*��*��%��%��$��$��(��(� �E��E��A��A�5� A�$�E�$6�$6�7�r)�__all__� functoolsrr0r!r<r�rr�rr5r%r&r�r�O_CREATr$r r rrrr{rrlrr�<module>r�s���� �O� -���� �� ����7�7�d�?���J���J�� �*�*�r�y�y� ����������BE�BE�J � �]8�]8rPK:W�\#~Hg\\)__pycache__/shared_memory.cpython-312.pycnu�[���� T��hH���dZddgZddlmZddlZddlZddlZddlZddlZddl Z ejdk(rddlZdZnddl Z dZd d lmZej ej"zZdZerdZnd Zd�ZGd�d�ZdZGd�d�Zy)z�Provides shared memory for direct access across processes. The API of this package is currently provisional. Refer to the documentation for details. �SharedMemory� ShareableList�)�partialN�ntFT�)�resource_tracker�z/psm_�wnsm_c��ttt�z dz}|dk\sJd��ttj|�z}t|�tksJ�|S)z6Create a random filename for the shared memory object.�z_SHM_NAME_PREFIX too long)�_SHM_SAFE_NAME_LENGTH�len�_SHM_NAME_PREFIX�secrets� token_hex)�nbytes�names �6/usr/lib64/python3.12/multiprocessing/shared_memory.py�_make_filenamer(sX��$�c�*:�&;�;�� A�F��Q�;�3�3�3�;��g�/�/��7�7�D��t�9�-�-�-�-��K�c��eZdZdZdZdZdZdZejZ dZerdndZ dd�Zd�Zd �Zd �Zed��Zed��Zed ��Zd�Zd�Zy)ra�Creates a new shared memory block or attaches to an existing shared memory block. Every shared memory block is assigned a unique name. This enables one process to create a shared memory block with a particular name so that a different process can attach to that same shared memory block using that same name. As a resource for sharing data across processes, shared memory blocks may outlive the original process that created them. When one process no longer needs access to a shared memory block that might still be needed by other processes, the close() method should be called. When a shared memory block is no longer needed by any process, the unlink() method should be called to ensure proper cleanup.N���i�TFc��|dk\std��|r,ttjz|_|dk(rtd��|�(|jtj zstd��t�r)|�E t�} tj||j|j��|_||_ nK|jrd|zn|}tj||j|j��|_||_ |r"|r tj|j|�tj |j�}|j"}t%j$|j|�|_t-j.|jd��n�|�r" |� t�n|}t1j2t0j4t0j6t0j8|dz d z|d z|�} t1j:�}|t0j<k(rd|�Ktt>j@tjBt>j@�|t0j<�� t1jD|���t%j$d ||��|_t1jD|�||_ n�||_ t1jFt0jHd|�} t1jJ|t0jHddd�}t1jD|� t1jL|�}t1jN|�t%j$d ||��|_||_(tS|j&�|_*y#t$rY��+wxYw#t($r|j+��wxYw#t1jD|�wxYw#t1jD|�wxYw#t1jN|�wxYw) Nrz!'size' must be a positive integerz4'size' must be a positive number different from zeroz&'name' can only be None if create=True)�mode�/� shared_memory� l��r)�tagnameF)+� ValueError�_O_CREX�os�O_RDWR�_flags�O_EXCL� _USE_POSIXr�_posixshmem�shm_open�_mode�_fd�FileExistsError�_name�_prepend_leading_slash� ftruncate�fstat�st_size�mmap�_mmap�OSError�unlinkr�register�_winapi�CreateFileMapping�INVALID_HANDLE_VALUE�NULL�PAGE_READWRITE�GetLastError�ERROR_ALREADY_EXISTS�errno�EEXIST�strerror�CloseHandle�OpenFileMapping� FILE_MAP_READ� MapViewOfFile�VirtualQuerySize�UnmapViewOfFile�_size� memoryview�_buf) �selfr�create�size�stats� temp_name�h_map�last_error_code�p_bufs r�__init__zSharedMemory.__init__KsO���q�y��@�A�A��!�B�I�I�-�D�K��q�y� �!W�X�X��<����b�i�i� 7��E�F�F���|��)�+�D�!�#.�#7�#7� � �K�K�!%���$���"&�D�J��%)�%@�%@�s�T�z�d��&�/�/���K�K������� "�� � ��d��L�L����4�0�������*���}�}��!�Y�Y�t�x�x��6�� � �%�%�d�j�j�/�B���48�L�� 0�d�I�$�5�5��4�4�����.�.����z�1��z�)�!� �E�3�*1�*>�*>�*@��*�g�.J�.J�J�#�/�&5�$)�L�L�$&�K�K����$=�$(�$+�$@�$@� '"�!"�!)� �+�+�E�2�&*�Y�Y�r�4��%K�� ��+�+�E�2�!*�D�J��"�� � �/�/��)�)����� /�#�1�1���-�-�����E��'�'��.�3�"�3�3�E�:�D��+�+�E�2�!�Y�Y�r�4��>�� ��� ��t�z�z�*�� ��k+�!� �!��$� ���� �� ��J �+�+�E�2��,�'�'��.���+�+�E�2�sJ�>1N�A4N!�9A4N?�N?�+'O�(O3� N�N�!N<�?O�O0�3P c�D� |j�y#t$rYywxYw�N)�closer2�rHs r�__del__zSharedMemory.__del__�s"�� ��J�J�L��� �� �s�� �c�L�|j|jd|jffS)NF)� __class__rrJrTs r� __reduce__zSharedMemory.__reduce__�s)���N�N�� � ��� � � � � rc�h�|jj�d|j�d|j�d�S)N�(z, size=�))rW�__name__rrJrTs r�__repr__zSharedMemory.__repr__�s.���.�.�)�)�*�!�D�I�I�=��� � �{�!�L�Lrc��|jS)z4A memoryview of contents of the shared memory block.)rGrTs r�bufzSharedMemory.buf�s���y�y�rc��|j}tr6|jr*|jjd�r|jdd}|S)z4Unique name that identifies the shared memory block.rrN)r+r%r,� startswith)rH� reported_names rrzSharedMemory.name�s?��� � � ��$�5�5��z�z�$�$�S�)� $� � �1�2�� ��rc��|jS)zSize in bytes.)rErTs rrJzSharedMemory.size�s���z�z�rc�2�|j�!|jj�d|_|j�!|jj�d|_tr7|j dk\r't j|j �d|_yyy)zkCloses access to the shared memory from this instance but does not destroy the shared memory block.Nrr)rG�releaser1rSr%r)r!rTs rrSzSharedMemory.close�sq���9�9� ��I�I�����D�I��:�:�!��J�J�����D�J��$�(�(�a�-��H�H�T�X�X���D�H�(�:rc��trM|jr@tj|j�t j |jd�yyy)z�Requests that the underlying shared memory block be destroyed. In order to ensure proper cleanup of resources, unlink should be called once (and only once) across all processes which have access to the shared memory block.rN)r%r+r&� shm_unlinkr� unregisterrTs rr3zSharedMemory.unlink�s:���$�*�*��"�"�4�:�:�.��'�'�� � �O�D�%�:r)NFr)r\� __module__�__qualname__�__doc__r+r)r1rGr!r"r#r(r%r,rPrUrXr]�propertyr_rrJrSr3�rrrr2s��� B� �E� �C��E��D� �Y�Y�F��E�%/�T�U��l+�\� �M��������������Er�utf8c�H�eZdZdZedededededdjdiZ dZd �d �d�d�d �Ze d��Zd"dd�d�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zd �Z d!�Z!e"e#jH�Z%y)#ra�Pattern for a mutable list-like object shareable via a shared memory block. It differs from the built-in list type in that these lists can not change their overall length (i.e. no append, insert, etc.) Because values are packed into a memoryview as bytes, the struct packing format for any storable value must require no more than 8 characters to describe its format.�q�dzxxxxxxx?z%dsNzxxxxxx?x�c��|SrRrm��values r�<lambda>zShareableList.<lambda>s��rc�J�|jd�jt�S�N�)�rstrip�decode� _encodingrts rrvzShareableList.<lambda>s�����g�.�5�5�i�@rc�$�|jd�Srx)rzrts rrvzShareableList.<lambda>s �����g�.rc��yrRrm)�_values rrvzShareableList.<lambda>s��$r)rrr�c��t|ttdjf�syt|t�ryt|t�ryy)z�Used in concert with _back_transforms_mapping to convert values into the appropriate Python objects when retrieving them from the list as well as when storing them.Nrrrr�)� isinstance�str�bytesrWrts r�_extract_recreation_codez&ShareableList._extract_recreation_codes9�� �%�#�u�d�n�n�!=�>�� ��s� #�� ��u� %��r�rc�R� �|�|���|xsd}|D�cgc]r}t|ttf�s|jt |�nA|jt |�|j t |�|j zdzzfz��t}}t |�|_td�|D��|jk(sJ�d}dg|_ |D]B}||ddk7r|j n t|dd�z }|jj|��D|D�cgc]}|j|���}}tjd|jzdj!|�z|j"z|j$z�}t'|d |� �|_nt'|�|_|��,t*� tj,d|jz|j(j.d|jg|j���tj,dj!�|j(j.|j0g� fd�|D����tj,|j"|j(j.|j2g� fd�|D����tj,|j$|j(j.|j4g���yt |�|_t7tj8|j|j(j.d ��|_ ycc}wcc}w)Nrmrc3�8K�|]}t|�dk���y�w)rrN)r)�.0�fmts r� <genexpr>z)ShareableList.__init__.<locals>.<genexpr>6s����9���s�3�x�1�}��s�rr�srp�T)rIrJc3�d�K�|]'}t|t�r|j��n|���)y�wrR)r�r��encode�r��v�_encs �rr�z)ShareableList.__init__.<locals>.<genexpr>Zs(�����P�x�!�J�q�#�$6�!�(�(�4�.�A�=�x�s�-0c3�@�K�|]}|j�����y�wrR)r�r�s �rr�z)ShareableList.__init__.<locals>.<genexpr>`s�����3�(�Q�!�(�(�4�.�(���rr)r�r�r��_types_mapping�type� _alignmentr� _list_len�sum�_allocated_offsets�int�appendr��struct�calcsize�_format_size_metainfo�join�_format_packing_metainfo�_format_back_transform_codesr�shmr|� pack_intor_�_offset_data_start�_offset_packing_formats�_offset_back_transform_codes�list�unpack_from) rH�sequencer�item�_formats�offsetr��_recreation_codes�requested_sizer�s @rrPzShareableList.__init__*s�����<�8�/��~�2�H�%� �%�D� &�d�S�%�L�9��#�#�D��J�/��,�,�T�$�Z�8����3�t�9����+G�!�+K�L�<��� %� ��!��]�D�N��9��9�9�T�^�^�K�K�K��F�()�c�D�#����S��W��^�$�/�/��S��"�X��N���'�'�.�.�v�6� �AI�!�@H���-�-�d�3�� �!�$�_�_��d�0�0�0�����!�"��-�-�.��1�1�2��N�$�D��N�K�D�H�#�D�)�D�H����D�����d�0�0�0���������� � �)�)� � �������!�������'�'� �Q�x�P� � ����-�-�������,�,� �4�(�3� � ����1�1�������1�1� �$� �!��Y�D�N�&*��"�"��.�.��H�H�L�L���'�D�#��}��$!s�A7L�L$c�L�|dk\r|n||jz}||jk\s|jdkrtd��tjd|jj |j|dzz�d}|jd�}|jt�}|S)z>Gets the packing format for a single value stored in the list.r� Requested position out of range.�8srrry) r�� IndexErrorr�r�r�r_r�rzr{r|)rH�positionr�r�� fmt_as_strs r�_get_packing_formatz!ShareableList._get_packing_formatss���'�1�}�8�(�T�^�^�2K������&�D�N�N�Q�,>��?�@�@������H�H�L�L��(�(�8�a�<�7� �� �� �h�h�w����Z�Z� �*� ��rc���||jk\s|jdkrtd��tjd|jj |j|z�d}|j|}|S)z9Gets the back transformation function for a single value.rr��b)r�r�r�r�r�r_r��_back_transforms_mapping)rHr��transform_code�transform_functions r�_get_back_transformz!ShareableList._get_back_transform�sv�� ����&�D�N�N�Q�,>��?�@�@��+�+���H�H�L�L��-�-��8� �� �� "�:�:�>�J��!�!rc��||jk\s|jdkrtd��tjd|jj |j|dzz|jt��|j|�}tjd|jj |j|z|�y)zvSets the packing format and back transformation code for a single value in the list at the specified position.rr�r�rrr�N)r�r�r�r�r�r_r�r�r|r�r�)rHr�r�rur�s r�!_set_packing_format_and_transformz/ShareableList._set_packing_format_and_transform�s��� ����&�D�N�N�Q�,>��?�@�@������H�H�L�L��(�(�8�a�<�7����i�(� ��6�6�u�=�������H�H�L�L��-�-��8�� rc�F�|dk\r|n||jz} |j|j|z}tj|j|�|jj|�\}|j|�}||�}|S#t$rtd��wxYw)Nrzindex out of range) r�r�r�r�r�r�r�r_r�r�)rHr�r�r��back_transforms r�__getitem__zShareableList.__getitem__�s���'�1�}�8�(�T�^�^�2K�� 3��,�,�t�/F�/F�x�/P�P�F��%�%��(�(��2��������D�Q��1�1�(�;���1������ � 3��1�2�2� 3�s�AB�B c��|dk\r|n||jz} |j|}|j|z}|j|�}t|ttf�s|jt|�}|}nw|j|dz|z }t|t�r|jt�n|}t|�|kDrtd��|ddk(r|}n|jt|fz}|j|||�tj ||j"j$||�y#t$rt d��wxYw)Nrzassignment index out of rangerz(bytes/str item exceeds available storagerr�)r�r�r�r�r�r�r�r�r�r�r�r|rrr�r�r�r�r_) rHr�ru�item_offsetr��current_format� new_format� encoded_value�allocated_lengths r�__setitem__zShareableList.__setitem__�sO��'�1�}�8�(�T�^�^�2K�� >��1�1�(�;�K��,�,�{�:�F�!�5�5�h�?�N��%�#�u��.��,�,�T�%�[�9�J�!�M�#�6�6�x�!�|�D�{�R��!+�5�#� 6�#�\�\�)�4�<A� ��=�!�$4�4� �!K�L�L��b�!�S�(�+� �!�0�0��5�$�9�� � �.�.���� � ����T�X�X�\�\�6�=�I��3� >��<�=�=� >�s�/D/�/Ec�\�t|j|jj��dfS)Nr�rm)rrWr�rrTs rrXzShareableList.__reduce__�s ���t�~�~�D�H�H�M�M�:�B�>�>rc�^�tjd|jjd�dS)Nrpr)r�r�r�r_rTs r�__len__zShareableList.__len__�s$���!�!�#�t�x�x�|�|�Q�7��:�:rc�z�|jj�dt|��d|jj�d�S)NrZz, name=r[)rWr\r�r�rrTs rr]zShareableList.__repr__�s3���.�.�)�)�*�!�D��J�<�w�t�x�x�}�}�>O�q�Q�Qrc�^��dj�fd�t�j�D��S)z=The struct packing format used by all currently stored items.r�c3�@�K�|]}�j|����y�wrR)r�)r��irHs �rr�z'ShareableList.format.<locals>.<genexpr>�s!����� �1F�A�D�$�$�Q�'�1F�r�)r��ranger�rTs`r�formatzShareableList.format�s,����w�w� �16�t�~�~�1F� � � rc�&�d|jdzzS)z>The struct packing format used for the items' storage offsets.rpr�r�rTs rr�z#ShareableList._format_size_metainfo�s���d�n�n�q�(�)�)rc� �d|jzS)z>The struct packing format used for the items' packing formats.r�r�rTs rr�z&ShareableList._format_packing_metainfo�s���d�n�n�$�$rc� �d|jzS)z>The struct packing format used for the items' back transforms.r�r�rTs rr�z*ShareableList._format_back_transform_codes�s���T�^�^�#�#rc�&�|jdzdzS)Nrrrr�rTs rr�z ShareableList._offset_data_start�s������"�a�'�'rc�:�|j|jdzS)Nr)r�r�rTs rr�z%ShareableList._offset_packing_formats�s���&�&��)@�)@��)D�D�Drc�:�|j|jdzzS)Nrr)r�r�rTs rr�z*ShareableList._offset_back_transform_codess���+�+�d�n�n�q�.@�@�@rc�,��t�fd�|D��S)zCL.count(value) -> integer -- return number of occurrences of value.c3�(�K�|] }�|k(���y�wrRrm)r��entryrus �rr�z&ShareableList.count.<locals>.<genexpr> s�����4�t�e�5�E�>�t�s�)r�)rHrus `r�countzShareableList.counts����4�t�4�4�4rc�V�t|�D]\}}||k(s�|cSt|�d���)zpL.index(value) -> integer -- return first index of value. Raises ValueError if the value is not present.z not in this container)� enumerater)rHrur�r�s r�indexzShareableList.indexs7�� )���O�H�e���~��� /���y�(>�?�@�@rrR)&r\rirjrkr��float�boolr�r�rWr�r�r��staticmethodr�rPr�r�r�r�r�rXr�r]rlr�r�r�r�r�r�r�r�r��classmethod�types�GenericAlias�__class_getitem__rmrrrr�sI��*�& �S� �s��j��U� �u���� � �N��J��@�.�� ������G�d�G�R� "� �,�"J�B?�;�R�� �� ��*��*��%��%��$��$��(��(� �E��E��A��A�5� A�$�E�$6�$6�7�r)rk�__all__� functoolsrr0r!r<r�rr�rr5r%r&r�r�O_CREATr$r r rrrr|rrmrr�<module>r�s���� �O� -���� �� ����7�7�d�?���J���J�� �*�*�r�y�y� ����������BE�BE�J � �]8�]8rPK:W�\T;�D)D).__pycache__/sharedctypes.cpython-312.opt-1.pycnu�[���� T��h���f�ddlZddlZddlmZddlmZddlmZmZejZ gd�Z ejejejejejej ej"ej$ej&ej(ej*ej,ej.ej0d�Zd�Zd �Zd �Zddd�d �Zddd�d�Zd�Zdd�Z d�Z!d�Z"d�Z#dZ$iZ%ejL�Z'Gd�de(�Z)Gd�de)�Z*Gd�de)�Z+Gd�de+�Z,y)�N�)�heap)�get_context)� reduction�assert_spawning)�RawValue�RawArray�Value�Array�copy�synchronized)�c�u�b�B�h�H�i�I�l�L�q�Q�f�dc�p�tj|�}tj|�}t ||d�S�N)�ctypes�sizeofr� BufferWrapper� rebuild_ctype)�type_�size�wrappers �5/usr/lib64/python3.12/multiprocessing/sharedctypes.py� _new_valuer&'s/���=�=���D�� � ��&�G�����.�.�c���tj||�}t|�}tjtj |�dtj|��|j|�|S)z> Returns a ctypes object allocated from shared memory r)�typecode_to_type�getr&r�memset� addressofr�__init__)�typecode_or_type�argsr"�objs r%rr,sY�� � � �!1�3C�D�E� �U� �C� �M�M�&�"�"�3�'��F�M�M�#�,>�?��C�L�L�$���Jr'c�@�tj||�}t|t�rO||z}t |�}tjtj|�dtj|��|S|t|�z}t |�}|j|�|S)z= Returns a ctypes array allocated from shared memory r)r)r*� isinstance�intr&rr+r,r�lenr-)r.�size_or_initializerr"r0�results r%r r 6s��� � � �!1�3C�D�E��%�s�+��+�+������� � �f�&�&�s�+�Q�� � �c�0B�C�� ���/�0�0���E�"������,�-�� r'T)�lock�ctxc��t|g|���}|dur|S|dvr|xs t�}|j�}t|d�st d|z��t|||��S)z6 Return a synchronization wrapper for a Value F�TN�acquire�%r has no method 'acquire'�r8)rr�RLock�hasattr�AttributeErrorr )r.r7r8r/r0s r%r r Fsi���#� +�d� +�C��u�}�� ��|���"�[�]���y�y�{���4��#��9�D�@�A�A���T�s�+�+r'c��t||�}|dur|S|dvr|xs t�}|j�}t|d�st d|z��t|||��S)z9 Return a synchronization wrapper for a RawArray Fr:r;r<r=)r rr>r?r@r )r.r5r7r8r0s r%rrTsg���#�%8� 9�C��u�}�� ��|���"�[�]���y�y�{���4��#��9�D�@�A�A���T�s�+�+r'c�^�tt|��}|tj|�d<|S)Nr)r&�typer�pointer)r0�new_objs r%rrbs(����c��#�G�!$�F�N�N�7��A���Nr'c�>�|xs t�}t|tj�r t |||�St|tj �r6|jtjur t|||�St|||�St|�} t|}||||�S#t$rn|jD�cgc]}|d�� ncc}w}}|D�cic]}|t|���ncc}w}}d|jz} t| t f|�x}t|<Y��wxYw)Nr�Synchronized)rr2r�_SimpleCDatarGr�_type_�c_char�SynchronizedString�SynchronizedArrayrC�class_cache�KeyError�_fields_� make_property�__name__�SynchronizedBase) r0r7r8�cls�scls�field�names�namer� classnames r%r r gs�� � ���C��#�v�*�*�+��C��s�+�+� �C���� &��:�:����&�%�c�4��5�5� ��d�C�0�0��3�i�� N��s�#�D��C��s�#�#��� N�+.�<�<�8�<�%�U�1�X�<��8�E�8�7<�=�u�t��}�T�*�*�u��=�A�=�&����5�I�&*�9�7G�6I�1�&M�M�D�;�s�#� N�s*� B%�%D�<C �D�C(�'2D�Dc���t|�t|tj�r)t|j |j|jffStt|�|jdffSr) rr2rrr!rI�_wrapper�_length_rC)r0s r%�reduce_ctyper\�sP���C���#�v�|�|�$��s�z�z�3�<�<����F�F�F��t�C�y�#�,�,��=�=�=r'c��|�||z}tj|t�|j�}|j |�}||_|Sr)�_ForkingPickler�registerr\�create_memoryview�from_bufferrZ)r"r$�length�bufr0s r%r!r!�sK�� ���������U�L�1� � #� #� %�C� � � �C� �C��C�L��Jr'c�� t|S#t$r-i}tt|fdzz|�||t|<||cYSwxYw)N�)� prop_cacherN�exec�template)rWrs r%rPrP�sR����$���������X�$���� #�Q�'��T�7� �4����w�� �s��3A�Az� def get%s(self): self.acquire() try: return self._obj.%s finally: self.release() def set%s(self, value): self.acquire() try: self._obj.%s = value finally: self.release() %s = property(get%s, set%s) c�8�eZdZd d�Zd�Zd�Zd�Zd�Zd�Zd�Z y) rRNc���||_|r||_n%|xstd��}|j�|_|jj|_|jj |_y)NT)�force)�_obj�_lockrr>r;�release)�selfr0r7r8s r%r-zSynchronizedBase.__init__�sQ���� ���D�J��0��4�0�C�����D�J��z�z�)�)����z�z�)�)��r'c�6�|jj�Sr)rm� __enter__�ros r%rqzSynchronizedBase.__enter__�s���z�z�#�#�%�%r'c�4�|jj|�Sr)rm�__exit__)ror/s r%rtzSynchronizedBase.__exit__�s��"�t�z�z�"�"�D�)�)r'c�T�t|�t|j|jffSr)rr rlrmrrs r%� __reduce__zSynchronizedBase.__reduce__�s"������d�i�i����4�4�4r'c��|jSr�rlrrs r%�get_objzSynchronizedBase.get_obj�s���y�y�r'c��|jSr)rmrrs r%�get_lockzSynchronizedBase.get_lock�s���z�z�r'c�N�dt|�j�d|j�d�S)N�<z wrapper for �>)rCrQrlrrs r%�__repr__zSynchronizedBase.__repr__�s��(,�T� �(;�(;�T�Y�Y�G�Gr'�NN) rQ� __module__�__qualname__r-rqrtrvryr{r�r'r%rRrR�s&��*�&�*�5���Hr'rRc��eZdZed�Zy)rG�valueN)rQr�r�rPr�r�r'r%rGrG�s���'�"�Er'rGc�*�eZdZd�Zd�Zd�Zd�Zd�Zy)rLc�,�t|j�Sr)r4rlrrs r%�__len__zSynchronizedArray.__len__�s���4�9�9�~�r'c�P�|5|j|cddd�S#1swYyxYwrrx)rors r%�__getitem__zSynchronizedArray.__getitem__�s�� ��9�9�Q�<��T�T����%c�P�|5||j|<ddd�y#1swYyxYwrrx)rorr�s r%�__setitem__zSynchronizedArray.__setitem__�s�� � �D�I�I�a�L��T�T����%c�P�|5|j||cddd�S#1swYyxYwrrx)ro�start�stops r%�__getslice__zSynchronizedArray.__getslice__�s�� ��9�9�U�4�(��T�T�r�c�P�|5||j||ddd�y#1swYyxYwrrx)ror�r��valuess r%�__setslice__zSynchronizedArray.__setslice__�s�� �$*�D�I�I�e�D�!��T�T�r�N)rQr�r�r�r�r�r�r�r�r'r%rLrL�s��� �!�)�+r'rLc�,�eZdZed�Zed�Zy)rKr��rawN)rQr�r�rPr�r�r�r'r%rKrK�s���'�"�E� �� �Cr'rKr�)-r�weakref�rr�contextrr�ForkingPicklerr^�__all__rJ�c_wchar�c_byte�c_ubyte�c_short�c_ushort�c_int�c_uint�c_long�c_ulong� c_longlong�c_ulonglong�c_float�c_doubler)r&rr r rrr r\r!rPrhrf�WeakKeyDictionaryrM�objectrRrGrLrKr�r'r%�<module>r�s#������/��*�*�� L�� ������ ������ ������ ������ ������ � � ��!3�!3� ��������/� �� )-�$�,�:>�4�,�� $�2>����� � �'�g�'�'�)��H�v�H�@#�#�#�+�(�+�,�*�r'PK:W�\���Y(Y(.__pycache__/sharedctypes.cpython-312.opt-2.pycnu�[���� T��h���f�ddlZddlZddlmZddlmZddlmZmZejZ gd�Z ejejejejejej ej"ej$ej&ej(ej*ej,ej.ej0d�Zd�Zd �Zd �Zddd�d �Zddd�d�Zd�Zdd�Z d�Z!d�Z"d�Z#dZ$iZ%ejL�Z'Gd�de(�Z)Gd�de)�Z*Gd�de)�Z+Gd�de+�Z,y)�N�)�heap)�get_context)� reduction�assert_spawning)�RawValue�RawArray�Value�Array�copy�synchronized)�c�u�b�B�h�H�i�I�l�L�q�Q�f�dc�p�tj|�}tj|�}t ||d�S�N)�ctypes�sizeofr� BufferWrapper� rebuild_ctype)�type_�size�wrappers �5/usr/lib64/python3.12/multiprocessing/sharedctypes.py� _new_valuer&'s/���=�=���D�� � ��&�G�����.�.�c��� tj||�}t|�}tjtj |�dtj|��|j|�|S�Nr)�typecode_to_type�getr&r�memset� addressofr�__init__)�typecode_or_type�argsr"�objs r%rr,s^��� � � �!1�3C�D�E� �U� �C� �M�M�&�"�"�3�'��F�M�M�#�,>�?��C�L�L�$���Jr'c�B� tj||�}t|t�rO||z}t |�}tjtj|�dtj|��|S|t|�z}t |�}|j|�|Sr))r*r+� isinstance�intr&rr,r-r�lenr.)r/�size_or_initializerr"r1�results r%r r 6s���� � � �!1�3C�D�E��%�s�+��+�+������� � �f�&�&�s�+�Q�� � �c�0B�C�� ���/�0�0���E�"������,�-�� r'T)�lock�ctxc�� t|g|���}|dur|S|dvr|xs t�}|j�}t|d�st d|z��t|||��S�NF)TN�acquirez%r has no method 'acquire')r9)rr�RLock�hasattr�AttributeErrorr )r/r8r9r0r1s r%r r Fsn����#� +�d� +�C��u�}�� ��|���"�[�]���y�y�{���4��#��9�D�@�A�A���T�s�+�+r'c�� t||�}|dur|S|dvr|xs t�}|j�}t|d�st d|z��t|||��Sr;)r rr=r>r?r )r/r6r8r9r1s r%rrTsl����#�%8� 9�C��u�}�� ��|���"�[�]���y�y�{���4��#��9�D�@�A�A���T�s�+�+r'c�^�tt|��}|tj|�d<|Sr))r&�typer�pointer)r1�new_objs r%rrbs(����c��#�G�!$�F�N�N�7��A���Nr'c�>�|xs t�}t|tj�r t |||�St|tj �r6|jtjur t|||�St|||�St|�} t|}||||�S#t$rn|jD�cgc]}|d�� ncc}w}}|D�cic]}|t|���ncc}w}}d|jz} t| t f|�x}t|<Y��wxYw)Nr�Synchronized)rr3r�_SimpleCDatarFr�_type_�c_char�SynchronizedString�SynchronizedArrayrB�class_cache�KeyError�_fields_� make_property�__name__�SynchronizedBase) r1r8r9�cls�scls�field�names�namer� classnames r%r r gs�� � ���C��#�v�*�*�+��C��s�+�+� �C���� &��:�:����&�%�c�4��5�5� ��d�C�0�0��3�i�� N��s�#�D��C��s�#�#��� N�+.�<�<�8�<�%�U�1�X�<��8�E�8�7<�=�u�t��}�T�*�*�u��=�A�=�&����5�I�&*�9�7G�6I�1�&M�M�D�;�s�#� N�s*� B%�%D�<C �D�C(�'2D�Dc���t|�t|tj�r)t|j |j|jffStt|�|jdffSr) rr3rrr!rH�_wrapper�_length_rB)r1s r%�reduce_ctyper[�sP���C���#�v�|�|�$��s�z�z�3�<�<����F�F�F��t�C�y�#�,�,��=�=�=r'c��|�||z}tj|t�|j�}|j |�}||_|Sr)�_ForkingPickler�registerr[�create_memoryview�from_bufferrY)r"r$�length�bufr1s r%r!r!�sK�� ���������U�L�1� � #� #� %�C� � � �C� �C��C�L��Jr'c�� t|S#t$r-i}tt|fdzz|�||t|<||cYSwxYw)N�)� prop_cacherM�exec�template)rVrs r%rOrO�sR����$���������X�$���� #�Q�'��T�7� �4����w�� �s��3A�Az� def get%s(self): self.acquire() try: return self._obj.%s finally: self.release() def set%s(self, value): self.acquire() try: self._obj.%s = value finally: self.release() %s = property(get%s, set%s) c�8�eZdZd d�Zd�Zd�Zd�Zd�Zd�Zd�Z y) rQNc���||_|r||_n%|xstd��}|j�|_|jj|_|jj |_y)NT)�force)�_obj�_lockrr=r<�release)�selfr1r8r9s r%r.zSynchronizedBase.__init__�sQ���� ���D�J��0��4�0�C�����D�J��z�z�)�)����z�z�)�)��r'c�6�|jj�Sr)rl� __enter__�rns r%rpzSynchronizedBase.__enter__�s���z�z�#�#�%�%r'c�4�|jj|�Sr)rl�__exit__)rnr0s r%rszSynchronizedBase.__exit__�s��"�t�z�z�"�"�D�)�)r'c�T�t|�t|j|jffSr)rr rkrlrqs r%� __reduce__zSynchronizedBase.__reduce__�s"������d�i�i����4�4�4r'c��|jSr�rkrqs r%�get_objzSynchronizedBase.get_obj�s���y�y�r'c��|jSr)rlrqs r%�get_lockzSynchronizedBase.get_lock�s���z�z�r'c�N�dt|�j�d|j�d�S)N�<z wrapper for �>)rBrPrkrqs r%�__repr__zSynchronizedBase.__repr__�s��(,�T� �(;�(;�T�Y�Y�G�Gr'�NN) rP� __module__�__qualname__r.rprsrurxrzr~�r'r%rQrQ�s&��*�&�*�5���Hr'rQc��eZdZed�Zy)rF�valueN)rPr�r�rOr�r�r'r%rFrF�s���'�"�Er'rFc�*�eZdZd�Zd�Zd�Zd�Zd�Zy)rKc�,�t|j�Sr)r5rkrqs r%�__len__zSynchronizedArray.__len__�s���4�9�9�~�r'c�P�|5|j|cddd�S#1swYyxYwrrw)rnrs r%�__getitem__zSynchronizedArray.__getitem__�s�� ��9�9�Q�<��T�T����%c�P�|5||j|<ddd�y#1swYyxYwrrw)rnrr�s r%�__setitem__zSynchronizedArray.__setitem__�s�� � �D�I�I�a�L��T�T����%c�P�|5|j||cddd�S#1swYyxYwrrw)rn�start�stops r%�__getslice__zSynchronizedArray.__getslice__�s�� ��9�9�U�4�(��T�T�r�c�P�|5||j||ddd�y#1swYyxYwrrw)rnr�r��valuess r%�__setslice__zSynchronizedArray.__setslice__�s�� �$*�D�I�I�e�D�!��T�T�r�N)rPr�r�r�r�r�r�r�r�r'r%rKrK�s��� �!�)�+r'rKc�,�eZdZed�Zed�Zy)rJr��rawN)rPr�r�rOr�r�r�r'r%rJrJ�s���'�"�E� �� �Cr'rJr)-r�weakref�rr�contextrr�ForkingPicklerr]�__all__rI�c_wchar�c_byte�c_ubyte�c_short�c_ushort�c_int�c_uint�c_long�c_ulong� c_longlong�c_ulonglong�c_float�c_doubler*r&rr r rrr r[r!rOrgre�WeakKeyDictionaryrL�objectrQrFrKrJr�r'r%�<module>r�s#������/��*�*�� L�� ������ ������ ������ ������ ������ � � ��!3�!3� ��������/� �� )-�$�,�:>�4�,�� $�2>����� � �'�g�'�'�)��H�v�H�@#�#�#�+�(�+�,�*�r'PK:W�\sK���)�)(__pycache__/sharedctypes.cpython-312.pycnu�[���� T��h���f�ddlZddlZddlmZddlmZddlmZmZejZ gd�Z ejejejejejej ej"ej$ej&ej(ej*ej,ej.ej0d�Zd�Zd �Zd �Zddd�d �Zddd�d�Zd�Zdd�Z d�Z!d�Z"d�Z#dZ$iZ%ejL�Z'Gd�de(�Z)Gd�de)�Z*Gd�de)�Z+Gd�de+�Z,y)�N�)�heap)�get_context)� reduction�assert_spawning)�RawValue�RawArray�Value�Array�copy�synchronized)�c�u�b�B�h�H�i�I�l�L�q�Q�f�dc�p�tj|�}tj|�}t ||d�S�N)�ctypes�sizeofr� BufferWrapper� rebuild_ctype)�type_�size�wrappers �5/usr/lib64/python3.12/multiprocessing/sharedctypes.py� _new_valuer&'s/���=�=���D�� � ��&�G�����.�.�c���tj||�}t|�}tjtj |�dtj|��|j|�|S)z> Returns a ctypes object allocated from shared memory r)�typecode_to_type�getr&r�memset� addressofr�__init__)�typecode_or_type�argsr"�objs r%rr,sY�� � � �!1�3C�D�E� �U� �C� �M�M�&�"�"�3�'��F�M�M�#�,>�?��C�L�L�$���Jr'c�@�tj||�}t|t�rO||z}t |�}tjtj|�dtj|��|S|t|�z}t |�}|j|�|S)z= Returns a ctypes array allocated from shared memory r)r)r*� isinstance�intr&rr+r,r�lenr-)r.�size_or_initializerr"r0�results r%r r 6s��� � � �!1�3C�D�E��%�s�+��+�+������� � �f�&�&�s�+�Q�� � �c�0B�C�� ���/�0�0���E�"������,�-�� r'T)�lock�ctxc��t|g|���}|dur|S|dvr|xs t�}|j�}t|d�st d|z��t|||��S)z6 Return a synchronization wrapper for a Value F�TN�acquire�%r has no method 'acquire'�r8)rr�RLock�hasattr�AttributeErrorr )r.r7r8r/r0s r%r r Fsi���#� +�d� +�C��u�}�� ��|���"�[�]���y�y�{���4��#��9�D�@�A�A���T�s�+�+r'c��t||�}|dur|S|dvr|xs t�}|j�}t|d�st d|z��t|||��S)z9 Return a synchronization wrapper for a RawArray Fr:r;r<r=)r rr>r?r@r )r.r5r7r8r0s r%rrTsg���#�%8� 9�C��u�}�� ��|���"�[�]���y�y�{���4��#��9�D�@�A�A���T�s�+�+r'c�^�tt|��}|tj|�d<|S)Nr)r&�typer�pointer)r0�new_objs r%rrbs(����c��#�G�!$�F�N�N�7��A���Nr'c�l�t|t�rJd��|xs t�}t|tj�r t|||�St|tj�r6|jtjur t|||�St|||�St|�} t|}||||�S#t$rn|jD�cgc]}|d�� ncc}w}}|D�cic]}|t|���ncc}w}}d|j z} t| tf|�x}t|<Y��wxYw)Nzobject already synchronizedr�Synchronized)r2�SynchronizedBaserr�_SimpleCDatarGr�_type_�c_char�SynchronizedString�SynchronizedArrayrC�class_cache�KeyError�_fields_� make_property�__name__) r0r7r8�cls�scls�field�names�namer� classnames r%r r gs'���#�/�0�O�2O�O�0� � ���C��#�v�*�*�+��C��s�+�+� �C���� &��:�:����&�%�c�4��5�5� ��d�C�0�0��3�i�� N��s�#�D��C��s�#�#��� N�+.�<�<�8�<�%�U�1�X�<��8�E�8�7<�=�u�t��}�T�*�*�u��=�A�=�&����5�I�&*�9�7G�6I�1�&M�M�D�;�s�#� N�s*�) B<�<D3�C �D3�+C?�>2D3�2D3c���t|�t|tj�r)t|j |j|jffStt|�|jdffSr) rr2rrr!rJ�_wrapper�_length_rC)r0s r%�reduce_ctyper\�sP���C���#�v�|�|�$��s�z�z�3�<�<����F�F�F��t�C�y�#�,�,��=�=�=r'c��|�||z}tj|t�|j�}|j |�}||_|Sr)�_ForkingPickler�registerr\�create_memoryview�from_bufferrZ)r"r$�length�bufr0s r%r!r!�sK�� ���������U�L�1� � #� #� %�C� � � �C� �C��C�L��Jr'c�� t|S#t$r-i}tt|fdzz|�||t|<||cYSwxYw)N�)� prop_cacherO�exec�template)rWrs r%rQrQ�sR����$���������X�$���� #�Q�'��T�7� �4����w�� �s��3A�Az� def get%s(self): self.acquire() try: return self._obj.%s finally: self.release() def set%s(self, value): self.acquire() try: self._obj.%s = value finally: self.release() %s = property(get%s, set%s) c�8�eZdZd d�Zd�Zd�Zd�Zd�Zd�Zd�Z y) rHNc���||_|r||_n%|xstd��}|j�|_|jj|_|jj |_y)NT)�force)�_obj�_lockrr>r;�release)�selfr0r7r8s r%r-zSynchronizedBase.__init__�sQ���� ���D�J��0��4�0�C�����D�J��z�z�)�)����z�z�)�)��r'c�6�|jj�Sr)rm� __enter__�ros r%rqzSynchronizedBase.__enter__�s���z�z�#�#�%�%r'c�4�|jj|�Sr)rm�__exit__)ror/s r%rtzSynchronizedBase.__exit__�s��"�t�z�z�"�"�D�)�)r'c�T�t|�t|j|jffSr)rr rlrmrrs r%� __reduce__zSynchronizedBase.__reduce__�s"������d�i�i����4�4�4r'c��|jSr�rlrrs r%�get_objzSynchronizedBase.get_obj�s���y�y�r'c��|jSr)rmrrs r%�get_lockzSynchronizedBase.get_lock�s���z�z�r'c�N�dt|�j�d|j�d�S)N�<z wrapper for �>)rCrRrlrrs r%�__repr__zSynchronizedBase.__repr__�s��(,�T� �(;�(;�T�Y�Y�G�Gr'�NN) rR� __module__�__qualname__r-rqrtrvryr{r�r'r%rHrH�s&��*�&�*�5���Hr'rHc��eZdZed�Zy)rG�valueN)rRr�r�rQr�r�r'r%rGrG�s���'�"�Er'rGc�*�eZdZd�Zd�Zd�Zd�Zd�Zy)rMc�,�t|j�Sr)r4rlrrs r%�__len__zSynchronizedArray.__len__�s���4�9�9�~�r'c�P�|5|j|cddd�S#1swYyxYwrrx)rors r%�__getitem__zSynchronizedArray.__getitem__�s�� ��9�9�Q�<��T�T����%c�P�|5||j|<ddd�y#1swYyxYwrrx)rorr�s r%�__setitem__zSynchronizedArray.__setitem__�s�� � �D�I�I�a�L��T�T����%c�P�|5|j||cddd�S#1swYyxYwrrx)ro�start�stops r%�__getslice__zSynchronizedArray.__getslice__�s�� ��9�9�U�4�(��T�T�r�c�P�|5||j||ddd�y#1swYyxYwrrx)ror�r��valuess r%�__setslice__zSynchronizedArray.__setslice__�s�� �$*�D�I�I�e�D�!��T�T�r�N)rRr�r�r�r�r�r�r�r�r'r%rMrM�s��� �!�)�+r'rMc�,�eZdZed�Zed�Zy)rLr��rawN)rRr�r�rQr�r�r�r'r%rLrL�s���'�"�E� �� �Cr'rLr�)-r�weakref�rr�contextrr�ForkingPicklerr^�__all__rK�c_wchar�c_byte�c_ubyte�c_short�c_ushort�c_int�c_uint�c_long�c_ulong� c_longlong�c_ulonglong�c_float�c_doubler)r&rr r rrr r\r!rQrhrf�WeakKeyDictionaryrN�objectrHrGrMrLr�r'r%�<module>r�s#������/��*�*�� L�� ������ ������ ������ ������ ������ � � ��!3�!3� ��������/� �� )-�$�,�:>�4�,�� $�2>����� � �'�g�'�'�)��H�v�H�@#�#�#�+�(�+�,�*�r'PK:W�\�1F�(-(-'__pycache__/spawn.cpython-312.opt-1.pycnu�[���� T��h�%����ddlZddlZddlZddlZddlmZmZddlmZddlm Z ddlm Z gd�Zejdk7rd Z d ZnAeed d �Z ej xr)ej j#�j%d�Zd�Zd �Zer-eej*j-ej.d��neej �d�Zd�Zd�Zdd�Zd�Zd�Zd�ZgZd�Z d�Z!d�Z"d�Z#y)�N�)�get_start_method�set_start_method)�process)� reduction)�util)�_main�freeze_support�set_executable�get_executable�get_preparation_data�get_command_line�import_main_path�win32F�frozenzpythonservice.exec��|�|aytjdk(rtj|�aytj |�ay)Nr)�_python_exe�sys�platform�os�fsdecode�fsencode)�exes �./usr/lib64/python3.12/multiprocessing/spawn.pyrr$s4�� �{��� ���� ��k�k�#�&���k�k�#�&��c��tS)N)r�rrrr-s���rz python.exec�2�t|�dk\r |ddk(ryy)z= Return whether commandline indicates we are forking �r�--multiprocessing-forkTF)�len)�argvs r� is_forkingr#9s!���4�y�A�~�$�q�'�%=�=��rc��ttj�rgi}tjddD]/}|jd�\}}|dk(rd||<�"t |�||<�1tdi|��tj�yy)zE Run code for process object if this in not the main process rN�=�Noner)r#rr"�split�int� spawn_main�exit)�kwds�arg�name�values rr r Csr���#�(�(�����8�8�A�B�<�C��)�)�C�.�K�D�%����!��T� � ��Z��T� � � ��T����� �rc�@�ttdd�r4tjdg|j�D�cgc]}d|z�� c}zSd}|dj d�|j�D��z}tj�}t�}|g|zd|dgzScc}w) zJ Returns prefix of command line used for spawning a child process rFr �%s=%rz<from multiprocessing.spawn import spawn_main; spawn_main(%s)z, c3�&K�|] }d|z���y�w)r0Nr)�.0�items r� <genexpr>z#get_command_line.<locals>.<genexpr>\s����B�\�T�'�D�.�\�s�z-c)�getattrr� executable�items�joinr�_args_from_interpreter_flagsr)r+r3�prog�optsrs rrrSs����s�H�e�$����!9�:�,0�J�J�L�9�L�D��4��L�9�:� ;�N���� � �B�T�Z�Z�\�B�B�B���0�0�2������u�t�|�t�T�+C�D�D�D�� :s�Bc��tjdk(rqddl}ddl}|�+|j |j |jzd|�}nd}tj||��}|j|tj�}|}n.ddlm } || j_|}tj |�}t#||�} tj$| �y)z7 Run code specified by data received over pipe rrNF)�source_processr)�resource_tracker)rr�msvcrt�_winapi�OpenProcess�SYNCHRONIZE�PROCESS_DUP_HANDLEr� duplicate�open_osfhandler�O_RDONLY�r>�_resource_tracker�_fd�dupr r*)�pipe_handle� parent_pid� tracker_fdr?r@r=� new_handle�fd�parent_sentinelr>�exitcodes rr)r)bs��� �|�|�w�����!�$�0�0��#�#�g�&@�&@�@��z�#�N�"�N��(�(��8F�H� � � "� "�:�r�{�{� ;��(��&�1;��*�*�.� ���&�&��-���R��)�H��H�H�X�rc��tj|dd��5}dtj�_ t jj|�}t|�t jj|�}tj�` ddd�j|�S#tj�`wxYw#1swY�3xYw)N�rbT)�closefd) r�fdopenr�current_process�_inheritingr�pickle�load�prepare� _bootstrap)rOrP�from_parent�preparation_data�selfs rr r ~s��� ���2�t�T� *�k�04����!�-� 6�(�/�/�4�4�[�A���$�%��#�#�(�(��5�D��'�'�)�5� +��?�?�?�+�+���'�'�)�5�� +� *�s#�C�A B+�=C�+C�C�C c�X�ttj�dd�rtd��y)NrWFa� An attempt has been made to start a new process before the current process has finished its bootstrapping phase. This probably means that you are not using fork to start your child processes and you have forgotten to use the proper idiom in the main module: if __name__ == '__main__': freeze_support() ... The "freeze_support()" line can be omitted if the program is not going to be frozen to produce an executable. To fix this issue, refer to the "Safe importing of main module" section in https://docs.python.org/3/library/multiprocessing.html )r5rrV�RuntimeErrorrrr�_check_not_importing_mainra�s/���w�&�&�(�-��?��� � �@rc ���t�ttjt j �j��}tj�!tjj�|d<tjj�} |jd�}tj||<|j||tj tjt#j$�t'���tj(d}t+|j,dd�}|�||d<|Stj.d k7st0s�t2s�t+|d d�}|�t"jj5|�s>tj�.t"jj7tj|�}t"jj9|�|d<|S#t$rY��;wxYw)zM Return info about parent needed by child to unpickle process object )� log_to_stderr�authkeyN� log_levelrG)r-�sys_path�sys_argv�orig_dir�dir�start_method�__main__r-�init_main_from_namer�__file__�init_main_from_path)ra�dictr�_log_to_stderrrrVrd�_logger�getEffectiveLevelr�path�copy�index�ORIGINAL_DIR� ValueError�updater"r�getcwdr�modulesr5�__spec__r�WINEXE� WINSERVICE�isabsr8�normpath)r-�drf�i�main_module� main_mod_name� main_paths rr r �s�������)�)��'�'�)�1�1� �A� �|�|�����7�7�9��+�� �X�X�]�]�_�H�+��N�N�2����*�*�����H�H� ������%�%��I�I�K�%�'� � ��+�+�j�)�K��K�0�0�&�$�?�M�� �#0�� � � �H� ���� �� ��K��T�:� �� ��G�G�M�M�)�,��,�,�8��G�G�L�L��)=�)=�y�I� �')�w�w�'7�'7� �'B�A�#�$��H��9� �� �s�G%�% G2�1G2c�*�d|vr|dtj�_d|vr|dtj�_d|vr|drt j �d|vr&t j�j|d�d|vr|dt_ d|vr|dt_ d|vrtj|d�d|vr|dt_ d |vrt|d d ��d|vrt|d�yd |vrt!|d �yy)zE Try to get current process ready to unpickle process object r-rdrcrerfrgrirhrjT)�forcerlrnN)rrVr-rdrrc� get_logger�setLevelrrsr"r�chdirrvr�_fixup_main_from_name�_fixup_main_from_path)�datas rrZrZ�s����~�)-�f�����!�&��D��,0��O����!�)��$��4��#8������d������"�"�4��#4�5��T��� �#����T��� �#�����}� ����e����T��#�J�/��������n�-�T�:���$��d�#8�9�:� �$� &��d�#8�9�:� 'rc��tjd}|dk(s|jd�ryt|jdd�|k(ryt j |�tjd�}tj|dd��}|jj|�|xtjd<tjd<y)Nrkz .__main__r-�__mp_main__T)�run_name� alter_sys) rrz�endswithr5r{�old_main_modules�append�types� ModuleType�runpy� run_module�__dict__rx)�mod_name�current_mainr��main_contents rr�r��s��� �;�;�z�*�L��:���!2�!2�;�!?���|�$�$�f�d�3�x�?�� ���L�)��"�"�=�1�K��#�#�H�-:�.2�4�L�������-�;F�F�C�K�K� ��c�k�k�-�8rc���tjd}tjj tjj|��d}|dk(ryt |dd�|k(rytj|�tjd�}tj|d��}|jj|�|xtjd<tjd<y)Nrkr�ipythonrmr�)r�)rrzrrs�splitext�basenamer5r�r�r�r�r��run_pathr�rx)r�r�� main_namer�r�s rr�r�s����;�;�z�*�L���� � ����!1�!1�)�!<�=�a�@�I��I����|�Z��.�)�;�� ���L�)��"�"�=�1�K��>�>�)�+8�:�L�������-�;F�F�C�K�K� ��c�k�k�-�8rc��t|�y)z< Set sys.modules['__main__'] to module at main_path N)r�)r�s rrr/s���)�$r)NN)$rrr�r�rGrrr�contextrr�__all__rr|r}r5r6�lowerr�rrrsr8�exec_prefixr#r rr)r rar r�rZr�r�rrrr�<module>r�s��� � ���0����K���<�<�7�� �F��J� �S�(�E� *�F����X�C�N�N�$8�$8�$:�$C�$C�DW�$X�J�'����2�7�7�<�<�����>�?��3�>�>�"�� � E��8 ,� �,, �d��";�LG�2G�8%rPK:W�\R�~+~+'__pycache__/spawn.cpython-312.opt-2.pycnu�[���� T��h�%����ddlZddlZddlZddlZddlmZmZddlmZddlm Z ddlm Z gd�Zejdk7rd Z d ZnAeed d �Z ej xr)ej j#�j%d�Zd�Zd �Zer-eej*j-ej.d��neej �d�Zd�Zd�Zdd�Zd�Zd�Zd�ZgZd�Z d�Z!d�Z"d�Z#y)�N�)�get_start_method�set_start_method)�process)� reduction)�util)�_main�freeze_support�set_executable�get_executable�get_preparation_data�get_command_line�import_main_path�win32F�frozenzpythonservice.exec��|�|aytjdk(rtj|�aytj |�ay)Nr)�_python_exe�sys�platform�os�fsdecode�fsencode)�exes �./usr/lib64/python3.12/multiprocessing/spawn.pyrr$s4�� �{��� ���� ��k�k�#�&���k�k�#�&��c��tS�N)r�rrrr-s���rz python.exec�4� t|�dk\r |ddk(ryy)N�r�--multiprocessing-forkTF)�len)�argvs r� is_forkingr$9s&����4�y�A�~�$�q�'�%=�=��rc�� ttj�rgi}tjddD]/}|jd�\}}|dk(rd||<�"t |�||<�1tdi|��tj�yy)Nr �=�Noner)r$rr#�split�int� spawn_main�exit)�kwds�arg�name�values rr r Csw����#�(�(�����8�8�A�B�<�C��)�)�C�.�K�D�%����!��T� � ��Z��T� � � ��T����� �rc�B� ttdd�r4tjdg|j�D�cgc]}d|z�� c}zSd}|dj d�|j�D��z}tj�}t�}|g|zd|dgzScc}w) NrFr!�%s=%rz<from multiprocessing.spawn import spawn_main; spawn_main(%s)z, c3�&K�|] }d|z���y�w)r1Nr)�.0�items r� <genexpr>z#get_command_line.<locals>.<genexpr>\s����B�\�T�'�D�.�\�s�z-c)�getattrr� executable�items�joinr�_args_from_interpreter_flagsr)r,r4�prog�optsrs rrrSs�����s�H�e�$����!9�:�,0�J�J�L�9�L�D��4��L�9�:� ;�N���� � �B�T�Z�Z�\�B�B�B���0�0�2������u�t�|�t�T�+C�D�D�D�� :s�Bc�� tjdk(rqddl}ddl}|�+|j |j |jzd|�}nd}tj||��}|j|tj�}|}n.ddlm } || j_|}tj |�}t#||�} tj$| �y)NrrF)�source_processr)�resource_tracker)rr�msvcrt�_winapi�OpenProcess�SYNCHRONIZE�PROCESS_DUP_HANDLEr� duplicate�open_osfhandler�O_RDONLY�r?�_resource_tracker�_fd�dupr r+)�pipe_handle� parent_pid� tracker_fdr@rAr>� new_handle�fd�parent_sentinelr?�exitcodes rr*r*bs�����|�|�w�����!�$�0�0��#�#�g�&@�&@�@��z�#�N�"�N��(�(��8F�H� � � "� "�:�r�{�{� ;��(��&�1;��*�*�.� ���&�&��-���R��)�H��H�H�X�rc��tj|dd��5}dtj�_ t jj|�}t|�t jj|�}tj�` ddd�j|�S#tj�`wxYw#1swY�3xYw)N�rbT)�closefd) r�fdopenr�current_process�_inheritingr�pickle�load�prepare� _bootstrap)rPrQ�from_parent�preparation_data�selfs rr r ~s��� ���2�t�T� *�k�04����!�-� 6�(�/�/�4�4�[�A���$�%��#�#�(�(��5�D��'�'�)�5� +��?�?�?�+�+���'�'�)�5�� +� *�s#�C�A B+�=C�+C�C�C c�X�ttj�dd�rtd��y)NrXFa� An attempt has been made to start a new process before the current process has finished its bootstrapping phase. This probably means that you are not using fork to start your child processes and you have forgotten to use the proper idiom in the main module: if __name__ == '__main__': freeze_support() ... The "freeze_support()" line can be omitted if the program is not going to be frozen to produce an executable. To fix this issue, refer to the "Safe importing of main module" section in https://docs.python.org/3/library/multiprocessing.html )r6rrW�RuntimeErrorrrr�_check_not_importing_mainrb�s/���w�&�&�(�-��?��� � �@rc ��� t�ttjt j �j��}tj�!tjj�|d<tjj�} |jd�}tj||<|j||tj tjt#j$�t'���tj(d}t+|j,dd�}|�||d<|Stj.dk7st0s�t2s�t+|d d�}|�t"jj5|�s>tj�.t"jj7tj|�}t"jj9|�|d <|S#t$rY��;wxYw)N)� log_to_stderr�authkey� log_levelrH)r.�sys_path�sys_argv�orig_dir�dir�start_method�__main__r.�init_main_from_namer�__file__�init_main_from_path)rb�dictr�_log_to_stderrrrWre�_logger�getEffectiveLevelr�path�copy�index�ORIGINAL_DIR� ValueError�updater#r�getcwdr�modulesr6�__spec__r�WINEXE� WINSERVICE�isabsr9�normpath)r.�drg�i�main_module� main_mod_name� main_paths rr r �s��������)�)��'�'�)�1�1� �A� �|�|�����7�7�9��+�� �X�X�]�]�_�H�+��N�N�2����*�*�����H�H� ������%�%��I�I�K�%�'� � ��+�+�j�)�K��K�0�0�&�$�?�M�� �#0�� � � �H� ���� �� ��K��T�:� �� ��G�G�M�M�)�,��,�,�8��G�G�L�L��)=�)=�y�I� �')�w�w�'7�'7� �'B�A�#�$��H��9� �� �s�G&�& G3�2G3c�,� d|vr|dtj�_d|vr|dtj�_d|vr|drt j �d|vr&t j�j|d�d|vr|dt_ d|vr|dt_ d|vrtj|d�d|vr|dt_ d |vrt|d d ��d|vrt|d�yd |vrt!|d �yy)Nr.rerdrfrgrhrjrirkT)�forcermro)rrWr.rerrd� get_logger�setLevelrrtr#r�chdirrwr�_fixup_main_from_name�_fixup_main_from_path)�datas rr[r[�s�����~�)-�f�����!�&��D��,0��O����!�)��$��4��#8������d������"�"�4��#4�5��T��� �#����T��� �#�����}� ����e����T��#�J�/��������n�-�T�:���$��d�#8�9�:� �$� &��d�#8�9�:� 'rc��tjd}|dk(s|jd�ryt|jdd�|k(ryt j |�tjd�}tj|dd��}|jj|�|xtjd<tjd<y)Nrlz .__main__r.�__mp_main__T)�run_name� alter_sys) rr{�endswithr6r|�old_main_modules�append�types� ModuleType�runpy� run_module�__dict__ry)�mod_name�current_mainr��main_contents rr�r��s��� �;�;�z�*�L��:���!2�!2�;�!?���|�$�$�f�d�3�x�?�� ���L�)��"�"�=�1�K��#�#�H�-:�.2�4�L�������-�;F�F�C�K�K� ��c�k�k�-�8rc���tjd}tjj tjj|��d}|dk(ryt |dd�|k(rytj|�tjd�}tj|d��}|jj|�|xtjd<tjd<y)Nrlr�ipythonrnr�)r�)rr{rrt�splitext�basenamer6r�r�r�r�r��run_pathr�ry)r�r�� main_namer�r�s rr�r�s����;�;�z�*�L���� � ����!1�!1�)�!<�=�a�@�I��I����|�Z��.�)�;�� ���L�)��"�"�=�1�K��>�>�)�+8�:�L�������-�;F�F�C�K�K� ��c�k�k�-�8rc�� t|�yr)r�)r�s rrr/s����)�$r)NN)$rrr�r�rHrrr�contextrr�__all__rr}r~r6r7�lowerr�rrrtr9�exec_prefixr$r rr*r rbr r�r[r�r�rrrr�<module>r�s��� � ���0����K���<�<�7�� �F��J� �S�(�E� *�F����X�C�N�N�$8�$8�$:�$C�$C�DW�$X�J�'����2�7�7�<�<�����>�?��3�>�>�"�� � E��8 ,� �,, �d��";�LG�2G�8%rPK:W�\\}��-�-!__pycache__/spawn.cpython-312.pycnu�[���� T��h�%����ddlZddlZddlZddlZddlmZmZddlmZddlm Z ddlm Z gd�Zejdk7rd Z d ZnAeed d �Z ej xr)ej j#�j%d�Zd�Zd �Zer-eej*j-ej.d��neej �d�Zd�Zd�Zdd�Zd�Zd�Zd�ZgZd�Z d�Z!d�Z"d�Z#y)�N�)�get_start_method�set_start_method)�process)� reduction)�util)�_main�freeze_support�set_executable�get_executable�get_preparation_data�get_command_line�import_main_path�win32F�frozenzpythonservice.exec��|�|aytjdk(rtj|�aytj |�ay)Nr)�_python_exe�sys�platform�os�fsdecode�fsencode)�exes �./usr/lib64/python3.12/multiprocessing/spawn.pyrr$s4�� �{��� ���� ��k�k�#�&���k�k�#�&��c��tS)N)r�rrrr-s���rz python.exec�2�t|�dk\r |ddk(ryy)z= Return whether commandline indicates we are forking �r�--multiprocessing-forkTF)�len)�argvs r� is_forkingr#9s!���4�y�A�~�$�q�'�%=�=��rc��ttj�rgi}tjddD]/}|jd�\}}|dk(rd||<�"t |�||<�1tdi|��tj�yy)zE Run code for process object if this in not the main process rN�=�Noner)r#rr"�split�int� spawn_main�exit)�kwds�arg�name�values rr r Csr���#�(�(�����8�8�A�B�<�C��)�)�C�.�K�D�%����!��T� � ��Z��T� � � ��T����� �rc�@�ttdd�r4tjdg|j�D�cgc]}d|z�� c}zSd}|dj d�|j�D��z}tj�}t�}|g|zd|dgzScc}w) zJ Returns prefix of command line used for spawning a child process rFr �%s=%rz<from multiprocessing.spawn import spawn_main; spawn_main(%s)z, c3�&K�|] }d|z���y�w)r0Nr)�.0�items r� <genexpr>z#get_command_line.<locals>.<genexpr>\s����B�\�T�'�D�.�\�s�z-c)�getattrr� executable�items�joinr�_args_from_interpreter_flagsr)r+r3�prog�optsrs rrrSs����s�H�e�$����!9�:�,0�J�J�L�9�L�D��4��L�9�:� ;�N���� � �B�T�Z�Z�\�B�B�B���0�0�2������u�t�|�t�T�+C�D�D�D�� :s�Bc���ttj�sJd��tjdk(rqddl}ddl}|�+|j |j|jzd|�}nd}tj||��}|j|tj�}|}n.ddlm} || j _|}tj$|�}t'||�} tj(| �y) z7 Run code specified by data received over pipe zNot forkingrrNF)�source_processr)�resource_tracker)r#rr"r�msvcrt�_winapi�OpenProcess�SYNCHRONIZE�PROCESS_DUP_HANDLEr� duplicate�open_osfhandler�O_RDONLY�r>�_resource_tracker�_fd�dupr r*)�pipe_handle� parent_pid� tracker_fdr?r@r=� new_handle�fd�parent_sentinelr>�exitcodes rr)r)bs����c�h�h��.��.�� �|�|�w�����!�$�0�0��#�#�g�&@�&@�@��z�#�N�"�N��(�(��8F�H� � � "� "�:�r�{�{� ;��(��&�1;��*�*�.� ���&�&��-���R��)�H��H�H�X�rc��tj|dd��5}dtj�_ t jj|�}t|�t jj|�}tj�` ddd�j|�S#tj�`wxYw#1swY�3xYw)N�rbT)�closefd) r�fdopenr�current_process�_inheritingr�pickle�load�prepare� _bootstrap)rOrP�from_parent�preparation_data�selfs rr r ~s��� ���2�t�T� *�k�04����!�-� 6�(�/�/�4�4�[�A���$�%��#�#�(�(��5�D��'�'�)�5� +��?�?�?�+�+���'�'�)�5�� +� *�s#�C�A B+�=C�+C�C�C c�X�ttj�dd�rtd��y)NrWFa� An attempt has been made to start a new process before the current process has finished its bootstrapping phase. This probably means that you are not using fork to start your child processes and you have forgotten to use the proper idiom in the main module: if __name__ == '__main__': freeze_support() ... The "freeze_support()" line can be omitted if the program is not going to be frozen to produce an executable. To fix this issue, refer to the "Safe importing of main module" section in https://docs.python.org/3/library/multiprocessing.html )r5rrV�RuntimeErrorrrr�_check_not_importing_mainra�s/���w�&�&�(�-��?��� � �@rc ���t�ttjt j �j��}tj�!tjj�|d<tjj�} |jd�}tj||<|j||tj tjt#j$�t'���tj(d}t+|j,dd�}|�||d<|Stj.d k7st0s�t2s�t+|d d�}|�t"jj5|�s>tj�.t"jj7tj|�}t"jj9|�|d<|S#t$rY��;wxYw)zM Return info about parent needed by child to unpickle process object )� log_to_stderr�authkeyN� log_levelrG)r-�sys_path�sys_argv�orig_dir�dir�start_method�__main__r-�init_main_from_namer�__file__�init_main_from_path)ra�dictr�_log_to_stderrrrVrd�_logger�getEffectiveLevelr�path�copy�index�ORIGINAL_DIR� ValueError�updater"r�getcwdr�modulesr5�__spec__r�WINEXE� WINSERVICE�isabsr8�normpath)r-�drf�i�main_module� main_mod_name� main_paths rr r �s�������)�)��'�'�)�1�1� �A� �|�|�����7�7�9��+�� �X�X�]�]�_�H�+��N�N�2����*�*�����H�H� ������%�%��I�I�K�%�'� � ��+�+�j�)�K��K�0�0�&�$�?�M�� �#0�� � � �H� ���� �� ��K��T�:� �� ��G�G�M�M�)�,��,�,�8��G�G�L�L��)=�)=�y�I� �')�w�w�'7�'7� �'B�A�#�$��H��9� �� �s�G%�% G2�1G2c�*�d|vr|dtj�_d|vr|dtj�_d|vr|drt j �d|vr&t j�j|d�d|vr|dt_ d|vr|dt_ d|vrtj|d�d|vr|dt_ d |vrt|d d ��d|vrt|d�yd |vrt!|d �yy)zE Try to get current process ready to unpickle process object r-rdrcrerfrgrirhrjT)�forcerlrnN)rrVr-rdrrc� get_logger�setLevelrrsr"r�chdirrvr�_fixup_main_from_name�_fixup_main_from_path)�datas rrZrZ�s����~�)-�f�����!�&��D��,0��O����!�)��$��4��#8������d������"�"�4��#4�5��T��� �#����T��� �#�����}� ����e����T��#�J�/��������n�-�T�:���$��d�#8�9�:� �$� &��d�#8�9�:� 'rc��tjd}|dk(s|jd�ryt|jdd�|k(ryt j |�tjd�}tj|dd��}|jj|�|xtjd<tjd<y)Nrkz .__main__r-�__mp_main__T)�run_name� alter_sys) rrz�endswithr5r{�old_main_modules�append�types� ModuleType�runpy� run_module�__dict__rx)�mod_name�current_mainr��main_contents rr�r��s��� �;�;�z�*�L��:���!2�!2�;�!?���|�$�$�f�d�3�x�?�� ���L�)��"�"�=�1�K��#�#�H�-:�.2�4�L�������-�;F�F�C�K�K� ��c�k�k�-�8rc���tjd}tjj tjj|��d}|dk(ryt |dd�|k(rytj|�tjd�}tj|d��}|jj|�|xtjd<tjd<y)Nrkr�ipythonrmr�)r�)rrzrrs�splitext�basenamer5r�r�r�r�r��run_pathr�rx)r�r�� main_namer�r�s rr�r�s����;�;�z�*�L���� � ����!1�!1�)�!<�=�a�@�I��I����|�Z��.�)�;�� ���L�)��"�"�=�1�K��>�>�)�+8�:�L�������-�;F�F�C�K�K� ��c�k�k�-�8rc��t|�y)z< Set sys.modules['__main__'] to module at main_path N)r�)r�s rrr/s���)�$r)NN)$rrr�r�rGrrr�contextrr�__all__rr|r}r5r6�lowerr�rrrsr8�exec_prefixr#r rr)r rar r�rZr�r�rrrr�<module>r�s��� � ���0����K���<�<�7�� �F��J� �S�(�E� *�F����X�C�N�N�$8�$8�$:�$C�$C�DW�$X�J�'����2�7�7�<�<�����>�?��3�>�>�"�� � E��8 ,� �,, �d��";�LG�2G�8%rPK:W�\���N�N-__pycache__/synchronize.cpython-312.opt-1.pycnu�[���� T��h�/���gd�ZddlZddlZddlZddlZddlZddlmZddlmZddlm Z ddlm Z mZe ed ��\ZZejj"ZGd �de�Z Gd�d e �ZGd�de�ZGd�de �ZGd�de �ZGd�de�ZGd�de�ZGd�dej2�Zy#e$r ed��wxYw))�Lock�RLock� Semaphore�BoundedSemaphore� Condition�Event�N�)�context)�process)�util)�SemLock� sem_unlinkz�This platform lacks a functioning sem_open implementation, therefore, the required synchronization primitives needed will not function, see issue 3770.�c�r�eZdZej�Zd�Zed��Zd�Z d�Z d�Zd�Zd�Z ed��Zy ) r c��|�tjj�}|j�dk(|_t jdk(xs|j}td�D]2} tj||||j�|�x}|_ntd��tjd|jz�|j!�t jdk7rd�}tj"||�|jj$�`ddlm} | |jj$d �tj*|tj,|jj$fd ��yy#t$rY��!wxYw)N�fork�win32�dzcannot find name for semaphorezcreated semlock with handle %sc�8�|jj�y�N)�_semlock�_after_fork)�objs �4/usr/lib64/python3.12/multiprocessing/synchronize.pyrz%SemLock.__init__.<locals>._after_forkGs�����(�(�*�r )�register� semaphorer)�exitpriority)r �_default_context�get_context�get_start_method�_is_fork_ctx�sys�platform�range�_multiprocessingr � _make_namer�FileExistsErrorr�debug�handle� _make_methods�register_after_fork�name�resource_trackerr�Finalize�_cleanup) �self�kind�value�maxvalue�ctx� unlink_now�i�slrrs r�__init__zSemLock.__init__2sI���;��*�*�6�6�8�C��0�0�2�f�<����\�\�W�,�A��0A�0A� ��s��A� �%5�%=�%=��%��4�?�?�+<��& � ��T�]���"�"B�C�C�� � �3�b�i�i�?�@������<�<�7�"� +��$�$�T�;�7��=�=���)� 3��T�]�]�'�'��5��M�M�$�� 0� 0�4�=�=�3E�3E�2G�'(� *� *��#� �� �s�).E:�: F�Fc�8�ddlm}t|�||d�y)Nr )� unregisterr)r.r;r)r-r;s rr0zSemLock._cleanupTs��0��4���4��%rc�p�|jj|_|jj|_yr)r�acquire�release�r1s rr+zSemLock._make_methodsZs$���}�}�,�,����}�}�,�,��rc�6�|jj�Sr)r� __enter__r?s rrAzSemLock.__enter__^s���}�}�&�&�(�(rc�4�|jj|�Sr)r�__exit__�r1�argss rrCzSemLock.__exit__as��%�t�}�}�%�%�t�,�,rc�T�tj|�|j}tjdk(r.tj �j |j�}n#|jrtd��|j}||j|j|jfS)Nrz�A SemLock created in a fork context is being shared with a process in a spawn context. This is not supported. Please use the same context to create multiprocessing objects and Process.) r �assert_spawningrr#r$�get_spawning_popen�duplicate_for_childr*r"�RuntimeErrorr2r4r-)r1r8�hs r�__getstate__zSemLock.__getstate__ds�������%� �]�]���<�<�7�"��*�*�,�@�@����K�A�� � �"�$J�K�K�� � �A��2�7�7�B�K�K����1�1rc��tjj|�|_t j d|dz�|j �d|_y)Nz recreated blocker with handle %rrF)r&r �_rebuildrrr)r+r"�r1�states r�__setstate__zSemLock.__setstate__rsD��(�0�0�9�9�5�A�� �� � �5��a��@�A�����!��rc�|�tj�jd�dttj ���S)N� semprefix�-)r�current_process�_config�nextr �_rand�rrr'zSemLock._make_nameys/��!�1�1�3�;�;�K�H��w�}�}�-�/� /rN)�__name__� __module__�__qualname__�tempfile�_RandomNameSequencerXr9�staticmethodr0r+rArCrLrQr'rYrrr r .sY��(�H�(�(�*�E� *�D�&��&� -�)�-�2�"��/��/rr c� �eZdZdd�Zd�Zd�Zy)rc�H�tj|t|t|��y�N�r5)r r9� SEMAPHORE� SEM_VALUE_MAX�r1r3r5s rr9zSemaphore.__init__�s������y�%��C�Hrc�6�|jj�Sr)r� _get_valuer?s r� get_valuezSemaphore.get_value�s���}�}�'�'�)�)rc�� |jj�}d|jj�d|�d�S#t$rd}Y�*wxYw)N�unknown�<�(value=�)>)rrh� Exception� __class__rZ�r1r3s r�__repr__zSemaphore.__repr__�sG�� ��M�M�,�,�.�E��$(�>�>�#:�#:�E�B�B��� ��E� �s�9�A�AN�r )rZr[r\r9rirrrYrrrr�s��I�*�Crrc��eZdZdd�Zd�Zy)rc�@�tj|t|||��yrb�r r9rdrfs rr9zBoundedSemaphore.__init__�s������y�%��C�@rc��� |jj�}d|jj�d|�d|jj �d�S#t$rd}Y�AwxYw)Nrkrlrmz, maxvalue=rn)rrhrorprZr4rqs rrrzBoundedSemaphore.__repr__�sY�� ��M�M�,�,�.�E�����'�'��� � �0F�0F�H� H��� ��E� �s�A�A�ANrs�rZr[r\r9rrrYrrrr�s��A�Hrrc��eZdZd�Zd�Zy)rc�@�tj|tdd|��y�Nr rcrv�r1r5s rr9z Lock.__init__�s������y�!�Q�C�8rc��� |jj�rdtj�j}tj�jdk7rd|dtj�jzz }n?|jj�sd}n"|jj�dkDrd}nd}d|jj�d |�d �S#t$rd}Y�*wxYw)N� MainThread�|�Noner�SomeOtherThread�SomeOtherProcessrkrlz(owner=rn)r�_is_minerrUr-� threading�current_thread�_is_zero�_countrorprZ)r1r-s rrrz Lock.__repr__�s��� ��}�}�%�%�'��.�.�0�5�5���+�+�-�2�2�l�B��C�)�":�":�"<�"A�"A�A�A�D��]�]�+�+�-������%�%�'�!�+�(��)���$(�>�>�#:�#:�D�A�A��� ��D� �s�B=C�C*�)C*NrxrYrrrr�s ��9�Brrc��eZdZd�Zd�Zy)rc�@�tj|tdd|��yr{)r r9�RECURSIVE_MUTEXr|s rr9zRLock.__init__�s��������1�#�>rc�,� |jj�r~tj�j}tj�jdk7r$|dtj�jzz }|jj�}nH|jj�sd\}}n(|jj�dkDrd\}}nd\}}d|jj�d |�d |�d�S#t$rd\}}Y�0wxYw)Nr~r)r�rr)r��nonzero)r�r�)rkrkrl�(�, rn)rr�rrUr-r�r�r�r�rorprZ)r1r-�counts rrrzRLock.__repr__�s��� /��}�}�%�%�'��.�.�0�5�5���+�+�-�2�2�l�B��C�)�":�":�"<�"A�"A�A�A�D�� � �,�,�.���]�]�+�+�-�'���e����%�%�'�!�+�:���e�;���e��"&���!8�!8�$��F�F��� /�.�K�D�%� /�s�C D�D�DNrxrYrrrr�s ��?�Grrc�V�eZdZd d�Zd�Zd�Zd�Zd�Zd�Zd�Z d d �Z dd �Zd�Zd d�Z y)rNc���|xs|j�|_|jd�|_|jd�|_|jd�|_|j �y�Nr)r�_lockr�_sleeping_count�_woken_count�_wait_semaphorer+)r1�lockr5s rr9zCondition.__init__�sS���(�S�Y�Y�[�� �"�}�}�Q�/����M�M�!�,���"�}�}�Q�/������rc��tj|�|j|j|j|j fSr)r rGr�r�r�r�r?s rrLzCondition.__getstate__�s:������%�� � �D�0�0��!�!�4�#7�#7�9� 9rc�Z�|\|_|_|_|_|j �yr)r�r�r�r�r+rOs rrQzCondition.__setstate__�s*��49� 2���T�)� � �D�0����rc�6�|jj�Sr)r�rAr?s rrAzCondition.__enter__�s���z�z�#�#�%�%rc�4�|jj|�Sr)r�rCrDs rrCzCondition.__exit__�s��"�t�z�z�"�"�D�)�)rc�p�|jj|_|jj|_yr)r�r=r>r?s rr+zCondition._make_methods�s$���z�z�)�)����z�z�)�)��rc�� |jjj�|jjj�z }d|j j�d|j�d|�d�S#t$rd}Y�7wxYw)Nrkrlr�r�rn)r�rrhr�rorprZr�)r1�num_waiterss rrrzCondition.__repr__�ss�� $��/�/�8�8�C�C�E��,�,�5�5�@�@�B�C�K��"&���!8�!8�$�*�*�k�R�R��� $�#�K� $�s�A A5�5B�Bc�&�|jj�|jjj �}t|�D]}|jj�� |jjd|�|jj�t|�D]}|jj��S#|jj�t|�D]}|jj��wxYw)NT) r�r>r�rr�r%r�r=r�)r1�timeoutr�r7s r�waitzCondition.wait�s��� ���$�$�&�� � �#�#�*�*�,���u��A��J�J��� �� %��'�'�/�/��g�>� ���%�%�'��5�\��� � �"�"�$�"�� ���%�%�'��5�\��� � �"�"�$�"�s �*C � ADc�8�|jjd�r7|jjd�}|jjd�r�7d}||kr[|jjd�r@|jj �|dz }||kr|jjd�r�@|rdt|�D]}|jj��|jjd�r |jjd�r�yyy)NFrr )r�r=r�r�r>r%)r1�n�res�sleepersr7s r�notifyzCondition.notifys������'�'��.��&�&�.�.�u�5�C����'�'��.� ����l�t�3�3�;�;�E�B�� � �(�(�*���M�H���l�t�3�3�;�;�E�B���8�_���!�!�)�)�+�%��&�&�.�.�u�5���&�&�.�.�u�5�rc�D�|jtj��y)N)r�)r�r#�maxsizer?s r� notify_allzCondition.notify_all/s�����c�k�k��"rc���|�}|r|S|�tj�|z}nd}d}|s<|�|tj�z }|dkr |S|j�|�}|s�<|Sr�)�time� monotonicr�)r1� predicater��result�endtime�waittimes r�wait_forzCondition.wait_for2s~�������M����n�n�&��0�G��G��H���"�"�T�^�^�%5�5���q�=��� � �I�I�h���[�F� �� rrrs)rZr[r\r9rLrQrArCr+rrr�r�r�r�rYrrrr�s:���9� � &�*�*�S�%�.�4#�rrc�2�eZdZd�Zd�Zd�Zd�Zdd�Zd�Zy) rc�x�|j|j��|_|jd�|_yr�)rr�_condr�_flagr|s rr9zEvent.__init__Js(���]�]�3�8�8�:�.�� ��]�]�1�%�� rc���|j5|jjd�r$|jj� ddd�y ddd�y#1swYyxYw�NFT)r�r�r=r>r?s r�is_setzEvent.is_setNsD�� �Z�Z��z�z�!�!�%�(�� � �"�"�$���Z�� �Z�Z�s�7A� A�A c���|j5|jjd�|jj�|jj �ddd�y#1swYyxYw�NF)r�r�r=r>r�r?s r�setz Event.setUsE�� �Z�Z��J�J���u�%��J�J��� ��J�J�!�!�#��Z�Z�s�AA&�&A/c�|�|j5|jjd�ddd�y#1swYyxYwr�)r�r�r=r?s r�clearzEvent.clear[s%�� �Z�Z��J�J���u�%��Z�Z�s�2�;Nc�h�|j5|jjd�r|jj�n|jj |�|jjd�r$|jj� ddd�y ddd�y#1swYyxYwr�)r�r�r=r>r�)r1r�s rr�z Event.wait_sv�� �Z�Z��z�z�!�!�%�(�� � �"�"�$�� � ����(��z�z�!�!�%�(�� � �"�"�$���Z���Z�Z�s�BB(�B(�(B1c�|�|j�rdnd}dt|�j�dt|�d�d|�d�S)Nr��unsetrlz at z#x� �>)r��typer\�id)r1� set_statuss rrrzEvent.__repr__ks=��"�k�k�m�U�� ��4��:�*�*�+�4��4���}�A�j�\��K�Krr) rZr[r\r9r�r�r�r�rrrYrrrrHs!��&��$�&� �Lrrc��eZdZd d�Zd�Zd�Zed��Zejd��Zed��Z e jd��Z y) �BarrierNc��ddl}ddlm}||jd�dz�}|j �}|j|||||f�d|_d|_y)Nrr )� BufferWrapperr7r)�struct�heapr��calcsizerrQ�_stater�) r1�parties�actionr�r5r�r��wrapper�conds rr9zBarrier.__init__tsR���'������ 4�q� 8�9���}�}������7�F�G�T�7�C�D������rc��|\|_|_|_|_|_|jj�j d�|_y)Nr7)�_parties�_action�_timeoutr��_wrapper�create_memoryview�cast�_arrayrOs rrQzBarrier.__setstate__}s>��&+� $�����d�m� ��T�]��m�m�5�5�7�<�<�S�A��rc�t�|j|j|j|j|jfSr)r�r�r�r�r�r?s rrLzBarrier.__getstate__�s,��� � �t�|�|�T�]�]�� � �D�M�M�+� +rc� �|jdSr��r�r?s rr�zBarrier._state�����{�{�1�~�rc�"�||jd<yr�r�rqs rr�zBarrier._state��������A�rc� �|jdS�Nr r�r?s rr�zBarrier._count�r�rc�"�||jd<yr�r�rqs rr�zBarrier._count�r�r)NN) rZr[r\r9rQrL�propertyr��setterr�rYrrr�r�rsj���B� +������]�]���������]�]���rr�)�__all__r�r#r]r&r��r rrr r�ImportError�listr%r�rdre�objectrrrrrrr�rYrr�<module>r�s������ ������� 4�4�"�%��(�^���� �(�(�6�6� �N/�f�N/�h C�� C�&H�y�H�"B�7�B�2G�G�G�4i��i�^%L�F�%L�T"�i���"��k �4� �3�4�4�4�s�B>�>CPK:W�\���N�N-__pycache__/synchronize.cpython-312.opt-2.pycnu�[���� T��h�/���gd�ZddlZddlZddlZddlZddlZddlmZddlmZddlm Z ddlm Z mZe ed ��\ZZejj"ZGd �de�Z Gd�d e �ZGd�de�ZGd�de �ZGd�de �ZGd�de�ZGd�de�ZGd�dej2�Zy#e$r ed��wxYw))�Lock�RLock� Semaphore�BoundedSemaphore� Condition�Event�N�)�context)�process)�util)�SemLock� sem_unlinkz�This platform lacks a functioning sem_open implementation, therefore, the required synchronization primitives needed will not function, see issue 3770.�c�r�eZdZej�Zd�Zed��Zd�Z d�Z d�Zd�Zd�Z ed��Zy ) r c��|�tjj�}|j�dk(|_t jdk(xs|j}td�D]2} tj||||j�|�x}|_ntd��tjd|jz�|j!�t jdk7rd�}tj"||�|jj$�`ddlm} | |jj$d �tj*|tj,|jj$fd ��yy#t$rY��!wxYw)N�fork�win32�dzcannot find name for semaphorezcreated semlock with handle %sc�8�|jj�y�N)�_semlock�_after_fork)�objs �4/usr/lib64/python3.12/multiprocessing/synchronize.pyrz%SemLock.__init__.<locals>._after_forkGs�����(�(�*�r )�register� semaphorer)�exitpriority)r �_default_context�get_context�get_start_method�_is_fork_ctx�sys�platform�range�_multiprocessingr � _make_namer�FileExistsErrorr�debug�handle� _make_methods�register_after_fork�name�resource_trackerr�Finalize�_cleanup) �self�kind�value�maxvalue�ctx� unlink_now�i�slrrs r�__init__zSemLock.__init__2sI���;��*�*�6�6�8�C��0�0�2�f�<����\�\�W�,�A��0A�0A� ��s��A� �%5�%=�%=��%��4�?�?�+<��& � ��T�]���"�"B�C�C�� � �3�b�i�i�?�@������<�<�7�"� +��$�$�T�;�7��=�=���)� 3��T�]�]�'�'��5��M�M�$�� 0� 0�4�=�=�3E�3E�2G�'(� *� *��#� �� �s�).E:�: F�Fc�8�ddlm}t|�||d�y)Nr )� unregisterr)r.r;r)r-r;s rr0zSemLock._cleanupTs��0��4���4��%rc�p�|jj|_|jj|_yr)r�acquire�release�r1s rr+zSemLock._make_methodsZs$���}�}�,�,����}�}�,�,��rc�6�|jj�Sr)r� __enter__r?s rrAzSemLock.__enter__^s���}�}�&�&�(�(rc�4�|jj|�Sr)r�__exit__�r1�argss rrCzSemLock.__exit__as��%�t�}�}�%�%�t�,�,rc�T�tj|�|j}tjdk(r.tj �j |j�}n#|jrtd��|j}||j|j|jfS)Nrz�A SemLock created in a fork context is being shared with a process in a spawn context. This is not supported. Please use the same context to create multiprocessing objects and Process.) r �assert_spawningrr#r$�get_spawning_popen�duplicate_for_childr*r"�RuntimeErrorr2r4r-)r1r8�hs r�__getstate__zSemLock.__getstate__ds�������%� �]�]���<�<�7�"��*�*�,�@�@����K�A�� � �"�$J�K�K�� � �A��2�7�7�B�K�K����1�1rc��tjj|�|_t j d|dz�|j �d|_y)Nz recreated blocker with handle %rrF)r&r �_rebuildrrr)r+r"�r1�states r�__setstate__zSemLock.__setstate__rsD��(�0�0�9�9�5�A�� �� � �5��a��@�A�����!��rc�|�tj�jd�dttj ���S)N� semprefix�-)r�current_process�_config�nextr �_rand�rrr'zSemLock._make_nameys/��!�1�1�3�;�;�K�H��w�}�}�-�/� /rN)�__name__� __module__�__qualname__�tempfile�_RandomNameSequencerXr9�staticmethodr0r+rArCrLrQr'rYrrr r .sY��(�H�(�(�*�E� *�D�&��&� -�)�-�2�"��/��/rr c� �eZdZdd�Zd�Zd�Zy)rc�H�tj|t|t|��y�N�r5)r r9� SEMAPHORE� SEM_VALUE_MAX�r1r3r5s rr9zSemaphore.__init__�s������y�%��C�Hrc�6�|jj�Sr)r� _get_valuer?s r� get_valuezSemaphore.get_value�s���}�}�'�'�)�)rc�� |jj�}d|jj�d|�d�S#t$rd}Y�*wxYw)N�unknown�<�(value=�)>)rrh� Exception� __class__rZ�r1r3s r�__repr__zSemaphore.__repr__�sG�� ��M�M�,�,�.�E��$(�>�>�#:�#:�E�B�B��� ��E� �s�9�A�AN�r )rZr[r\r9rirrrYrrrr�s��I�*�Crrc��eZdZdd�Zd�Zy)rc�@�tj|t|||��yrb�r r9rdrfs rr9zBoundedSemaphore.__init__�s������y�%��C�@rc��� |jj�}d|jj�d|�d|jj �d�S#t$rd}Y�AwxYw)Nrkrlrmz, maxvalue=rn)rrhrorprZr4rqs rrrzBoundedSemaphore.__repr__�sY�� ��M�M�,�,�.�E�����'�'��� � �0F�0F�H� H��� ��E� �s�A�A�ANrs�rZr[r\r9rrrYrrrr�s��A�Hrrc��eZdZd�Zd�Zy)rc�@�tj|tdd|��y�Nr rcrv�r1r5s rr9z Lock.__init__�s������y�!�Q�C�8rc��� |jj�rdtj�j}tj�jdk7rd|dtj�jzz }n?|jj�sd}n"|jj�dkDrd}nd}d|jj�d |�d �S#t$rd}Y�*wxYw)N� MainThread�|�Noner�SomeOtherThread�SomeOtherProcessrkrlz(owner=rn)r�_is_minerrUr-� threading�current_thread�_is_zero�_countrorprZ)r1r-s rrrz Lock.__repr__�s��� ��}�}�%�%�'��.�.�0�5�5���+�+�-�2�2�l�B��C�)�":�":�"<�"A�"A�A�A�D��]�]�+�+�-������%�%�'�!�+�(��)���$(�>�>�#:�#:�D�A�A��� ��D� �s�B=C�C*�)C*NrxrYrrrr�s ��9�Brrc��eZdZd�Zd�Zy)rc�@�tj|tdd|��yr{)r r9�RECURSIVE_MUTEXr|s rr9zRLock.__init__�s��������1�#�>rc�,� |jj�r~tj�j}tj�jdk7r$|dtj�jzz }|jj�}nH|jj�sd\}}n(|jj�dkDrd\}}nd\}}d|jj�d |�d |�d�S#t$rd\}}Y�0wxYw)Nr~r)r�rr)r��nonzero)r�r�)rkrkrl�(�, rn)rr�rrUr-r�r�r�r�rorprZ)r1r-�counts rrrzRLock.__repr__�s��� /��}�}�%�%�'��.�.�0�5�5���+�+�-�2�2�l�B��C�)�":�":�"<�"A�"A�A�A�D�� � �,�,�.���]�]�+�+�-�'���e����%�%�'�!�+�:���e�;���e��"&���!8�!8�$��F�F��� /�.�K�D�%� /�s�C D�D�DNrxrYrrrr�s ��?�Grrc�V�eZdZd d�Zd�Zd�Zd�Zd�Zd�Zd�Z d d �Z dd �Zd�Zd d�Z y)rNc���|xs|j�|_|jd�|_|jd�|_|jd�|_|j �y�Nr)r�_lockr�_sleeping_count�_woken_count�_wait_semaphorer+)r1�lockr5s rr9zCondition.__init__�sS���(�S�Y�Y�[�� �"�}�}�Q�/����M�M�!�,���"�}�}�Q�/������rc��tj|�|j|j|j|j fSr)r rGr�r�r�r�r?s rrLzCondition.__getstate__�s:������%�� � �D�0�0��!�!�4�#7�#7�9� 9rc�Z�|\|_|_|_|_|j �yr)r�r�r�r�r+rOs rrQzCondition.__setstate__�s*��49� 2���T�)� � �D�0����rc�6�|jj�Sr)r�rAr?s rrAzCondition.__enter__�s���z�z�#�#�%�%rc�4�|jj|�Sr)r�rCrDs rrCzCondition.__exit__�s��"�t�z�z�"�"�D�)�)rc�p�|jj|_|jj|_yr)r�r=r>r?s rr+zCondition._make_methods�s$���z�z�)�)����z�z�)�)��rc�� |jjj�|jjj�z }d|j j�d|j�d|�d�S#t$rd}Y�7wxYw)Nrkrlr�r�rn)r�rrhr�rorprZr�)r1�num_waiterss rrrzCondition.__repr__�ss�� $��/�/�8�8�C�C�E��,�,�5�5�@�@�B�C�K��"&���!8�!8�$�*�*�k�R�R��� $�#�K� $�s�A A5�5B�Bc�&�|jj�|jjj �}t|�D]}|jj�� |jjd|�|jj�t|�D]}|jj��S#|jj�t|�D]}|jj��wxYw)NT) r�r>r�rr�r%r�r=r�)r1�timeoutr�r7s r�waitzCondition.wait�s��� ���$�$�&�� � �#�#�*�*�,���u��A��J�J��� �� %��'�'�/�/��g�>� ���%�%�'��5�\��� � �"�"�$�"�� ���%�%�'��5�\��� � �"�"�$�"�s �*C � ADc�8�|jjd�r7|jjd�}|jjd�r�7d}||kr[|jjd�r@|jj �|dz }||kr|jjd�r�@|rdt|�D]}|jj��|jjd�r |jjd�r�yyy)NFrr )r�r=r�r�r>r%)r1�n�res�sleepersr7s r�notifyzCondition.notifys������'�'��.��&�&�.�.�u�5�C����'�'��.� ����l�t�3�3�;�;�E�B�� � �(�(�*���M�H���l�t�3�3�;�;�E�B���8�_���!�!�)�)�+�%��&�&�.�.�u�5���&�&�.�.�u�5�rc�D�|jtj��y)N)r�)r�r#�maxsizer?s r� notify_allzCondition.notify_all/s�����c�k�k��"rc���|�}|r|S|�tj�|z}nd}d}|s<|�|tj�z }|dkr |S|j�|�}|s�<|Sr�)�time� monotonicr�)r1� predicater��result�endtime�waittimes r�wait_forzCondition.wait_for2s~�������M����n�n�&��0�G��G��H���"�"�T�^�^�%5�5���q�=��� � �I�I�h���[�F� �� rrrs)rZr[r\r9rLrQrArCr+rrr�r�r�r�rYrrrr�s:���9� � &�*�*�S�%�.�4#�rrc�2�eZdZd�Zd�Zd�Zd�Zdd�Zd�Zy) rc�x�|j|j��|_|jd�|_yr�)rr�_condr�_flagr|s rr9zEvent.__init__Js(���]�]�3�8�8�:�.�� ��]�]�1�%�� rc���|j5|jjd�r$|jj� ddd�y ddd�y#1swYyxYw�NFT)r�r�r=r>r?s r�is_setzEvent.is_setNsD�� �Z�Z��z�z�!�!�%�(�� � �"�"�$���Z�� �Z�Z�s�7A� A�A c���|j5|jjd�|jj�|jj �ddd�y#1swYyxYw�NF)r�r�r=r>r�r?s r�setz Event.setUsE�� �Z�Z��J�J���u�%��J�J��� ��J�J�!�!�#��Z�Z�s�AA&�&A/c�|�|j5|jjd�ddd�y#1swYyxYwr�)r�r�r=r?s r�clearzEvent.clear[s%�� �Z�Z��J�J���u�%��Z�Z�s�2�;Nc�h�|j5|jjd�r|jj�n|jj |�|jjd�r$|jj� ddd�y ddd�y#1swYyxYwr�)r�r�r=r>r�)r1r�s rr�z Event.wait_sv�� �Z�Z��z�z�!�!�%�(�� � �"�"�$�� � ����(��z�z�!�!�%�(�� � �"�"�$���Z���Z�Z�s�BB(�B(�(B1c�|�|j�rdnd}dt|�j�dt|�d�d|�d�S)Nr��unsetrlz at z#x� �>)r��typer\�id)r1� set_statuss rrrzEvent.__repr__ks=��"�k�k�m�U�� ��4��:�*�*�+�4��4���}�A�j�\��K�Krr) rZr[r\r9r�r�r�r�rrrYrrrrHs!��&��$�&� �Lrrc��eZdZd d�Zd�Zd�Zed��Zejd��Zed��Z e jd��Z y) �BarrierNc��ddl}ddlm}||jd�dz�}|j �}|j|||||f�d|_d|_y)Nrr )� BufferWrapperr7r)�struct�heapr��calcsizerrQ�_stater�) r1�parties�actionr�r5r�r��wrapper�conds rr9zBarrier.__init__tsR���'������ 4�q� 8�9���}�}������7�F�G�T�7�C�D������rc��|\|_|_|_|_|_|jj�j d�|_y)Nr7)�_parties�_action�_timeoutr��_wrapper�create_memoryview�cast�_arrayrOs rrQzBarrier.__setstate__}s>��&+� $�����d�m� ��T�]��m�m�5�5�7�<�<�S�A��rc�t�|j|j|j|j|jfSr)r�r�r�r�r�r?s rrLzBarrier.__getstate__�s,��� � �t�|�|�T�]�]�� � �D�M�M�+� +rc� �|jdSr��r�r?s rr�zBarrier._state�����{�{�1�~�rc�"�||jd<yr�r�rqs rr�zBarrier._state��������A�rc� �|jdS�Nr r�r?s rr�zBarrier._count�r�rc�"�||jd<yr�r�rqs rr�zBarrier._count�r�r)NN) rZr[r\r9rQrL�propertyr��setterr�rYrrr�r�rsj���B� +������]�]���������]�]���rr�)�__all__r�r#r]r&r��r rrr r�ImportError�listr%r�rdre�objectrrrrrrr�rYrr�<module>r�s������ ������� 4�4�"�%��(�^���� �(�(�6�6� �N/�f�N/�h C�� C�&H�y�H�"B�7�B�2G�G�G�4i��i�^%L�F�%L�T"�i���"��k �4� �3�4�4�4�s�B>�>CPK:W�\\�~�H�H&__pycache__/util.cpython-312.opt-1.pycnu�[���� T��h�7��d�ddlZddlZddlZddlZddlZddlZddlmZddlm Z gd�Z dZdZdZ dZd Zd ZdZdadad �Zd�Zd�Zd�Zd�Zd*d�Zd�Zd�Ze�Zd�Zd�Zej>�Z ejB�Z"d�Z#d�Z$iZ%ejB�Z&Gd�de'�Z(d*d�Z)d�Z*da+eee)e jXe jZfd�Z.ej^e.�Gd�de'�Z0Gd �d!ejb�Z2 ejfd"�Z4d$�Z6d%�Z7d&�Z8d'�Z9d(�Z:d)�Z;y#e5$rd#Z4Y�wxYw)+�N)�_args_from_interpreter_flags�)�process)� sub_debug�debug�info�sub_warning� get_logger� log_to_stderr�get_temp_dir�register_after_fork� is_exiting�Finalize�ForkAwareThreadLock�ForkAwareLocal�close_all_fds_except�SUBDEBUG� SUBWARNING�� ���multiprocessingz+[%(levelname)s/%(processName)s] %(message)sFc�N�trtjt|g|��ddi�yy�N� stacklevel�)�_logger�logr��msg�argss �-/usr/lib64/python3.12/multiprocessing/util.pyrr,s"������H�c�7�D�7�Q�7��c�N�trtjt|g|��ddi�yyr)rr�DEBUGr s r#rr0s"������E�3�4��4�!�4�r$c�N�trtjt|g|��ddi�yyr)rr�INFOr s r#rr4s"������D�#�3��3��3�r$c�N�trtjt|g|��ddi�yyr)rrrr s r#r r 8s"������J��9�d�9�q�9�r$c���ddl}|j� ts�|jt�adt_t td�r3tjt�tjt�nLtjjtdif�tjjtdif�|j�tS#|j�wxYw)z0 Returns logger used by multiprocessing rN� unregister�)�logging�_acquireLockr� getLogger�LOGGER_NAME� propagate�hasattr�atexitr+�_exit_function�register� _exithandlers�remove�append�_releaseLock)r-s r#r r <s��� ��������'�'��4�G� !�G���v�|�,��!�!�.�1�����/��$�$�+�+�^�R��,D�E��$�$�+�+�^�R��,D�E� �����N�� ����s�B5C!�!C3c���ddl}t�}|jt�}|j �}|j|�|j |�|r|j|�datS)zB Turn on logging and add a handler which prints to stderr rNT) r-r � Formatter�DEFAULT_LOGGING_FORMAT� StreamHandler�setFormatter� addHandler�setLevel�_log_to_stderrr)�levelr-�logger� formatter�handlers r#rrWsb�� � �\�F��!�!�"8�9�I��#�#�%�G�����#� ���g���������N��Nr$c�N�tjdk(ryttd�ryy)N�linuxT�getandroidapilevelF)�sys�platformr2r,r$r#�#_platform_supports_abstract_socketsrKls"�� �|�|�w����s�(�)��r$c��|syt|t�r|ddk(St|t�r|ddk(Std|�d���)NFr�zaddress type of z unrecognized)� isinstance�bytes�str� TypeError)�addresss r#�is_abstract_socket_namespacerStsN�����'�5�!��q�z�Q��� �G�S� !��q�z�T�!�!� �&�w�k��?� @�@r$c�j�d�}|||��tj�}|�d|jd<yy)Nc�,�t|dt�s�y�Nr)� issubclass�FileNotFoundError)�func�path�err_infos r#�onerrorz!_remove_temp_dir.<locals>.onerror�s���(�1�+�'8�9��:r$)r\�tempdir)r�current_process�_config)�rmtreer]r\r^s r#�_remove_temp_dirra�s>����7�G�$��-�-�/�O��"�-1���� �*�#r$c�0�tj�jjd�}|�fddl}ddl}|j d��}td|�tdt|j|fd��|tj�jd<|S)Nr]rzpymp-)�prefixzcreated temp directory %si����)r"�exitpriority)rr^r_�get�shutil�tempfile�mkdtemprrrar`)r]rfrgs r#rr�s����%�%�'�/�/�3�3�I�>�G�����"�"�'�"�2��� (�'�2� ��'�v�}�}�g�.F�"� $�7>����!�)�)�)�4��Nr$c���ttj��}|j�|D]\\}}}} ||��y#t$r}td|�Yd}~�0d}~wwxYw)Nz after forker raised exception %s)�list�_afterfork_registry�items�sort� Exceptionr)rl�index�identrY�obj�es r#�_run_after_forkersrs�sa���$�*�*�,�-�E� �J�J�L�%*�!����t�c� 8���I�&+��� 8��3�Q�7�7�� 8�s�A� A%�A � A%c�H�|ttt�t|�|f<y�N)rk�next�_afterfork_counter�id)rqrYs r#r r �s��EH���0�1�2�c�7�D�A�Br$c�N�eZdZdZdd�Zdeeejfd�Z d�Z d�Zd�Zy) rzA Class which supports object finalization using weakrefs Nc�|�|�4t|t�s$tdj|t |����|�tj||�|_n |�td��||_ ||_ |xsi|_|tt�f|_tj �|_|t$|j<y)Nz3Exitpriority ({0!r}) must be None or int, not {1!s}z+Without object, exitpriority cannot be None)rN�intrQ�format�type�weakref�ref�_weakref� ValueError� _callback�_args�_kwargsrv�_finalizer_counter�_key�os�getpid�_pid�_finalizer_registry)�selfrq�callbackr"�kwargsrds r#�__init__zFinalize.__init__�s����$�j��c�.J��E�L�L� �$�|�"4�6�7� 7��?�#�K�K��T�2�D�M� � !��J�K�K�!����� ��|����!�4�(:�#;�<�� ��I�I�K�� �)-��D�I�I�&r$c�r� ||j=|j|�k7r|d�d}nO|d|j|j|j�|j|ji|j��}dx|_x|_x|_x|_|_|S#t$r|d�YywxYw)zQ Run the callback unless it has already been called or cancelled z+finalizer ignored because different processNz/finalizer calling %s with args %s and kwargs %szfinalizer no longer registered)r�r�r�r�r�r��KeyError)r��wrr�rr��ress r#�__call__zFinalize.__call__�s��� �#�D�I�I�.��y�y�F�H�$��G�H����K��.�.�$�*�*�d�l�l�D�$�d�n�n�d�j�j�A�D�L�L�A��7;� <�D�M� <�D�N� <�T�Z� <� �L�4�9��J��� 8��6�7� 8�s� B"�"B6�5B6c�� t|j=dx|_x|_x|_x|_|_y#t$rYywxYw)z3 Cancel finalization of the object N)r�r�r�r�r�r�r��r�s r#�cancelzFinalize.cancel�sU�� <�#�D�I�I�.� 8<� <�D�M� <�D�N� <�T�Z� <� �L�4�9�� � �� �s�7� A�Ac�&�|jtvS)zS Return whether this finalizer is still waiting to invoke callback )r�r�r�s r#�still_activezFinalize.still_active�s���y�y�/�/�/r$c�� |j�}|�d|jjzSd|jj�dt|jd|j���}|jr|dt|j�zz }|jr|dt|j�zz }|jd�|dt|jd�zz }|d zS#ttf$rd}Y��wxYw) Nz<%s object, dead>�<z object, callback=�__name__z, args=z , kwargs=rz, exitpriority=�>)r��AttributeErrorrQ� __class__r��getattrr�r�rPr�r�)r�rq�xs r#�__repr__zFinalize.__repr__�s��� ��-�-�/�C��;�&����)@�)@�@�@�����'�'����� �D�N�N�C� E���:�:� ��S����_�,�,�A��<�<� ��s�4�<�<�0�0�0�A��9�9�Q�<�#� �"�S����1��%6�6�6�A��3�w���� �*� ��C� �s�C(�(C<�;C<)r,NN) r�� __module__�__qualname__�__doc__r�r�rr�r�r�r�r�r�r,r$r#rr�s3���.�&�&9�$�R�Y�Y� �0 <�0�r$rc�|��t�y��d�}n�fd�}tt�D�cgc] }||�s�|��}}|jd��|D].}tj|�}|��t d|� |��0��tj�yycc}w#t $rddl}|j�Y�mwxYw)z� Run all finalizers whose exit priority is not None and at least minpriority Finalizers with highest priority are called first; finalizers with the same priority will be called in reverse order of creation. Nc��|dduSrVr,)�ps r#�<lambda>z!_run_finalizers.<locals>.<lambda>s ��q��t�4�'r$c�&��|dduxr|d�k\SrVr,)r��minprioritys �r#r�z!_run_finalizers.<locals>.<lambda>s���q��t�4�'�?�A�a�D�K�,?�?r$T)�reversez calling %sr) r�rjrmrerrn� traceback� print_exc�clear)r��f�key�keys� finalizerr�s` r#�_run_finalizersr�s�����"� ���'��?�� � 3�4�?�4�C��#��C�4�D�?��I�I�d�I����'�+�+�C�0� �� ��l�I�.� &��� ����!�!�#���@��� &� ��#�#�%� &�s� B�B�5B�B;�:B;c�"�txstduS)z6 Returns true if the process is shutting down N)�_exitingr,r$r#rr;s���'�x�4�'�'r$c�\�ts�da|d�|d�|d�|��u|�D]<}|js�|d|j�|jj ��>|�D]%}|d|j�|j��'|d�|�yy)NTzprocess shutting downz2running all "atexit" finalizers with priority >= 0rz!calling terminate() for daemon %szcalling join() for process %sz)running the remaining "atexit" finalizers)r��daemon�name�_popen� terminate�join)rrr��active_childrenr^r�s r#r4r4Cs������� $�%� �B�C������(�%�&���8�8��<�a�f�f�E��H�H�&�&�(�'� %�&���4�a�f�f�=�����'� �9�:���?r$c�$�eZdZd�Zd�Zd�Zd�Zy)rc���tj�|_|jj|_|jj|_t|tj�yru)� threading�Lock�_lock�acquire�releaser r�_at_fork_reinitr�s r#r�zForkAwareThreadLock.__init__tsC���^�^�%�� ��z�z�)�)����z�z�)�)����D�"5�"E�"E�Fr$c�8�|jj�yru)r�r�r�s r#r�z#ForkAwareThreadLock._at_fork_reinitzs��� � �"�"�$r$c�6�|jj�Sru)r�� __enter__r�s r#r�zForkAwareThreadLock.__enter__}s���z�z�#�#�%�%r$c�4�|jj|�Sru)r��__exit__)r�r"s r#r�zForkAwareThreadLock.__exit__�s��"�t�z�z�"�"�D�)�)r$N)r�r�r�r�r�r�r�r,r$r#rrss��G�%�&�*r$rc��eZdZd�Zd�Zy)rc��t|d��y)Nc�6�|jj�Sru)�__dict__r�)rqs r#r�z)ForkAwareLocal.__init__.<locals>.<lambda>�s��s�|�|�/A�/A�/Cr$)r r�s r#r�zForkAwareLocal.__init__�s ���D�"C�Dr$c��t|�dfS)Nr,)r}r�s r#� __reduce__zForkAwareLocal.__reduce__�s���D�z�2�~�r$N)r�r�r�r�r�r,r$r#rr�s ��E�r$r�SC_OPEN_MAX�c���t|�dtgz}|j�tt |�dz �D]$}tj||dz||dz��&y)N���r)rj�MAXFDrm�range�lenr�� closerange)�fds�is r#rr�sR�� �s�)�r�5�k� !�C��H�H�J� �3�s�8�a�<� �� � � �c�!�f�Q�h��A�a�C��)�!r$c��tj�y tjj� tjt jt j�} t |dd��t_y#ttf$rY�]wxYw#tj|��xYw#ttf$rYywxYw)Nzutf-8F)�encoding�closefd) rI�stdin�close�OSErrorr�r��open�devnull�O_RDONLY)�fds r#�_close_stdinr��s��� �y�y��� �� � ���� � �W�W�R�Z�Z���� -�� ��R�'�5�A�C�I�� �Z� � �� �� ��H�H�R�L����Z� � �� �s4�A=�2B-�%B�=B�B�B*�*B-�-B?�>B?c��� tjj� tj j�y#ttf$rY�1wxYw#ttf$rYywxYwru)rI�stdout�flushr�r��stderrr,r$r#�_flush_std_streamsr��s]�� �� � ���� �� � ����� �J�'� �� �� �J�'� �� �s"�A�A�A�A�A'�&A'c��ddl}ddl}ttt t |���}t j�\}} |j||gd|dddddddd||dddddddd|j�t j|�t j|�S#t j|�t j|�wxYw)NrTr�F)�_posixsubprocess� subprocess�tuple�sorted�mapr{r��pipe� fork_exec� _USE_VFORKr�)rZr"�passfdsr�r��errpipe_read� errpipe_writes r#�spawnv_passfdsr��s������F�3�s�G�,�-�.�G�"$�'�'�)��L�-� ��)�)��4�&�$���t���B��B��L�-��5�"�d�D�$��D��!�!� #� ����� ������ ����� �����s�1B�,Cc�<�|D]}tj|��y)z/Close each file descriptor given as an argumentN)r�r�)r�r�s r#� close_fdsr��s���� �����r$c��ddlm}tj�ddlm}|jj�ddlm}|jj�t�|j�|j�y)zKCleanup multiprocessing resources when multiprocessing tests completed.r)�support)� forkserver)�resource_trackerN) �testr�r�_cleanuprr��_forkserver�_stopr��_resource_trackerr�� gc_collect� reap_children)r�r�r�s r#�_cleanup_testsr�sc�������+���� � �"�1��&�&�,�,�.����������r$ru)<r�� itertoolsrIr~r3r�r�r�r�__all__�NOTSETrr&r(rr0r<rrArrrr r rrKrS�abstract_sockets_supportedrar�WeakValueDictionaryrk�countrwrsr r�r��objectrr�rr�r�r^r4r5r�localr�sysconfr�rnrr�r�r�r�rr,r$r#�<module>rs��� �� �� ��3���� ���� �� �� � ���F�� ����8�5�4�:��6�*�A�A�B�� 2��$2�g�1�1�3��$�Y�_�_�&��8�I���$�Y�_�_�&��S�v�S�l&$�X(����E�?�#*�#:�#:�#*�#:�#:�(�T������*�&�*�"�Y�_�_����B�J�J�}�%�E�*� �. � � ���Q���E��s�D%�%D/�.D/PK:W�\�J��E�E&__pycache__/util.cpython-312.opt-2.pycnu�[���� T��h�7��d�ddlZddlZddlZddlZddlZddlZddlmZddlm Z gd�Z dZdZdZ dZd Zd ZdZdadad �Zd�Zd�Zd�Zd�Zd*d�Zd�Zd�Ze�Zd�Zd�Zej>�Z ejB�Z"d�Z#d�Z$iZ%ejB�Z&Gd�de'�Z(d*d�Z)d�Z*da+eee)e jXe jZfd�Z.ej^e.�Gd�de'�Z0Gd �d!ejb�Z2 ejfd"�Z4d$�Z6d%�Z7d&�Z8d'�Z9d(�Z:d)�Z;y#e5$rd#Z4Y�wxYw)+�N)�_args_from_interpreter_flags�)�process)� sub_debug�debug�info�sub_warning� get_logger� log_to_stderr�get_temp_dir�register_after_fork� is_exiting�Finalize�ForkAwareThreadLock�ForkAwareLocal�close_all_fds_except�SUBDEBUG� SUBWARNING�� ���multiprocessingz+[%(levelname)s/%(processName)s] %(message)sFc�N�trtjt|g|��ddi�yy�N� stacklevel�)�_logger�logr��msg�argss �-/usr/lib64/python3.12/multiprocessing/util.pyrr,s"������H�c�7�D�7�Q�7��c�N�trtjt|g|��ddi�yyr)rr�DEBUGr s r#rr0s"������E�3�4��4�!�4�r$c�N�trtjt|g|��ddi�yyr)rr�INFOr s r#rr4s"������D�#�3��3��3�r$c�N�trtjt|g|��ddi�yyr)rrrr s r#r r 8s"������J��9�d�9�q�9�r$c��� ddl}|j� ts�|jt�adt_t td�r3tjt�tjt�nLtjjtdif�tjjtdif�|j�tS#|j�wxYw)Nr� unregister�)�logging�_acquireLockr� getLogger�LOGGER_NAME� propagate�hasattr�atexitr+�_exit_function�register� _exithandlers�remove�append�_releaseLock)r-s r#r r <s������������'�'��4�G� !�G���v�|�,��!�!�.�1�����/��$�$�+�+�^�R��,D�E��$�$�+�+�^�R��,D�E� �����N�� ����s�B5C"�"C4c��� ddl}t�}|jt�}|j �}|j|�|j |�|r|j|�datS)NrT) r-r � Formatter�DEFAULT_LOGGING_FORMAT� StreamHandler�setFormatter� addHandler�setLevel�_log_to_stderrr)�levelr-�logger� formatter�handlers r#rrWsg���� �\�F��!�!�"8�9�I��#�#�%�G�����#� ���g���������N��Nr$c�N�tjdk(ryttd�ryy)N�linuxT�getandroidapilevelF)�sys�platformr2r,r$r#�#_platform_supports_abstract_socketsrKls"�� �|�|�w����s�(�)��r$c��|syt|t�r|ddk(St|t�r|ddk(Std|�d���)NFr�zaddress type of z unrecognized)� isinstance�bytes�str� TypeError)�addresss r#�is_abstract_socket_namespacerStsN�����'�5�!��q�z�Q��� �G�S� !��q�z�T�!�!� �&�w�k��?� @�@r$c�j�d�}|||��tj�}|�d|jd<yy)Nc�,�t|dt�s�y�Nr)� issubclass�FileNotFoundError)�func�path�err_infos r#�onerrorz!_remove_temp_dir.<locals>.onerror�s���(�1�+�'8�9��:r$)r\�tempdir)r�current_process�_config)�rmtreer]r\r^s r#�_remove_temp_dirra�s>����7�G�$��-�-�/�O��"�-1���� �*�#r$c�0�tj�jjd�}|�fddl}ddl}|j d��}td|�tdt|j|fd��|tj�jd<|S)Nr]rzpymp-)�prefixzcreated temp directory %si����)r"�exitpriority)rr^r_�get�shutil�tempfile�mkdtemprrrar`)r]rfrgs r#rr�s����%�%�'�/�/�3�3�I�>�G�����"�"�'�"�2��� (�'�2� ��'�v�}�}�g�.F�"� $�7>����!�)�)�)�4��Nr$c���ttj��}|j�|D]\\}}}} ||��y#t$r}td|�Yd}~�0d}~wwxYw)Nz after forker raised exception %s)�list�_afterfork_registry�items�sort� Exceptionr)rl�index�identrY�obj�es r#�_run_after_forkersrs�sa���$�*�*�,�-�E� �J�J�L�%*�!����t�c� 8���I�&+��� 8��3�Q�7�7�� 8�s�A� A%�A � A%c�H�|ttt�t|�|f<y�N)rk�next�_afterfork_counter�id)rqrYs r#r r �s��EH���0�1�2�c�7�D�A�Br$c�L�eZdZ dd�Zdeeejfd�Zd�Z d�Z d�Zy)rNc�|�|�4t|t�s$tdj|t |����|�tj||�|_n |�td��||_ ||_ |xsi|_|tt�f|_tj �|_|t$|j<y)Nz3Exitpriority ({0!r}) must be None or int, not {1!s}z+Without object, exitpriority cannot be None)rN�intrQ�format�type�weakref�ref�_weakref� ValueError� _callback�_args�_kwargsrv�_finalizer_counter�_key�os�getpid�_pid�_finalizer_registry)�selfrq�callbackr"�kwargsrds r#�__init__zFinalize.__init__�s����$�j��c�.J��E�L�L� �$�|�"4�6�7� 7��?�#�K�K��T�2�D�M� � !��J�K�K�!����� ��|����!�4�(:�#;�<�� ��I�I�K�� �)-��D�I�I�&r$c�t� ||j=|j|�k7r|d�d}nO|d|j|j|j�|j|ji|j��}dx|_x|_x|_x|_|_|S#t$r|d�YywxYw)Nz+finalizer ignored because different processz/finalizer calling %s with args %s and kwargs %szfinalizer no longer registered)r�r�r�r�r�r��KeyError)r��wrr�rr��ress r#�__call__zFinalize.__call__�s��� � �#�D�I�I�.��y�y�F�H�$��G�H����K��.�.�$�*�*�d�l�l�D�$�d�n�n�d�j�j�A�D�L�L�A��7;� <�D�M� <�D�N� <�T�Z� <� �L�4�9��J��� 8��6�7� 8�s� B#�#B7�6B7c�� t|j=dx|_x|_x|_x|_|_y#t$rYywxYwru)r�r�r�r�r�r�r��r�s r#�cancelzFinalize.cancel�sZ�� � <�#�D�I�I�.� 8<� <�D�M� <�D�N� <�T�Z� <� �L�4�9�� � �� �s�8� A�Ac�(� |jtvSru)r�r�r�s r#�still_activezFinalize.still_active�s�� ��y�y�/�/�/r$c�� |j�}|�d|jjzSd|jj�dt|jd|j���}|jr|dt|j�zz }|jr|dt|j�zz }|jd�|dt|jd�zz }|d zS#ttf$rd}Y��wxYw) Nz<%s object, dead>�<z object, callback=�__name__z, args=z , kwargs=rz, exitpriority=�>)r��AttributeErrorrQ� __class__r��getattrr�r�rPr�r�)r�rq�xs r#�__repr__zFinalize.__repr__�s��� ��-�-�/�C��;�&����)@�)@�@�@�����'�'����� �D�N�N�C� E���:�:� ��S����_�,�,�A��<�<� ��s�4�<�<�0�0�0�A��9�9�Q�<�#� �"�S����1��%6�6�6�A��3�w���� �*� ��C� �s�C(�(C<�;C<)r,NN)r�� __module__�__qualname__r�r�rr�r�r�r�r�r�r,r$r#rr�s3���.�&�&9�$�R�Y�Y� �0 <�0�r$rc�~�� t�y��d�}n�fd�}tt�D�cgc] }||�s�|��}}|jd��|D].}tj|�}|��t d|� |��0��tj�yycc}w#t $rddl}|j�Y�mwxYw)Nc��|dduSrVr,)�ps r#�<lambda>z!_run_finalizers.<locals>.<lambda>s ��q��t�4�'r$c�&��|dduxr|d�k\SrVr,)r��minprioritys �r#r�z!_run_finalizers.<locals>.<lambda>s���q��t�4�'�?�A�a�D�K�,?�?r$T)�reversez calling %sr) r�rjrmrerrn� traceback� print_exc�clear)r��f�key�keys� finalizerr�s` r#�_run_finalizersr�s������"� ���'��?�� � 3�4�?�4�C��#��C�4�D�?��I�I�d�I����'�+�+�C�0� �� ��l�I�.� &��� ����!�!�#���@��� &� ��#�#�%� &�s� B�B�6B�B<�;B<c�$� txstduSru)�_exitingr,r$r#rr;s����'�x�4�'�'r$c�\�ts�da|d�|d�|d�|��u|�D]<}|js�|d|j�|jj ��>|�D]%}|d|j�|j��'|d�|�yy)NTzprocess shutting downz2running all "atexit" finalizers with priority >= 0rz!calling terminate() for daemon %szcalling join() for process %sz)running the remaining "atexit" finalizers)r��daemon�name�_popen� terminate�join)rrr��active_childrenr^r�s r#r4r4Cs������� $�%� �B�C������(�%�&���8�8��<�a�f�f�E��H�H�&�&�(�'� %�&���4�a�f�f�=�����'� �9�:���?r$c�$�eZdZd�Zd�Zd�Zd�Zy)rc���tj�|_|jj|_|jj|_t|tj�yru)� threading�Lock�_lock�acquire�releaser r�_at_fork_reinitr�s r#r�zForkAwareThreadLock.__init__tsC���^�^�%�� ��z�z�)�)����z�z�)�)����D�"5�"E�"E�Fr$c�8�|jj�yru)r�r�r�s r#r�z#ForkAwareThreadLock._at_fork_reinitzs��� � �"�"�$r$c�6�|jj�Sru)r�� __enter__r�s r#r�zForkAwareThreadLock.__enter__}s���z�z�#�#�%�%r$c�4�|jj|�Sru)r��__exit__)r�r"s r#r�zForkAwareThreadLock.__exit__�s��"�t�z�z�"�"�D�)�)r$N)r�r�r�r�r�r�r�r,r$r#rrss��G�%�&�*r$rc��eZdZd�Zd�Zy)rc��t|d��y)Nc�6�|jj�Sru)�__dict__r�)rqs r#r�z)ForkAwareLocal.__init__.<locals>.<lambda>�s��s�|�|�/A�/A�/Cr$)r r�s r#r�zForkAwareLocal.__init__�s ���D�"C�Dr$c��t|�dfS)Nr,)r}r�s r#� __reduce__zForkAwareLocal.__reduce__�s���D�z�2�~�r$N)r�r�r�r�r�r,r$r#rr�s ��E�r$r�SC_OPEN_MAX�c���t|�dtgz}|j�tt |�dz �D]$}tj||dz||dz��&y)N���r)rj�MAXFDrm�range�lenr�� closerange)�fds�is r#rr�sR�� �s�)�r�5�k� !�C��H�H�J� �3�s�8�a�<� �� � � �c�!�f�Q�h��A�a�C��)�!r$c��tj�y tjj� tjt jt j�} t |dd��t_y#ttf$rY�]wxYw#tj|��xYw#ttf$rYywxYw)Nzutf-8F)�encoding�closefd) rI�stdin�close�OSErrorr�r��open�devnull�O_RDONLY)�fds r#�_close_stdinr��s��� �y�y��� �� � ���� � �W�W�R�Z�Z���� -�� ��R�'�5�A�C�I�� �Z� � �� �� ��H�H�R�L����Z� � �� �s4�A=�2B-�%B�=B�B�B*�*B-�-B?�>B?c��� tjj� tj j�y#ttf$rY�1wxYw#ttf$rYywxYwru)rI�stdout�flushr�r��stderrr,r$r#�_flush_std_streamsr��s]�� �� � ���� �� � ����� �J�'� �� �� �J�'� �� �s"�A�A�A�A�A'�&A'c��ddl}ddl}ttt t |���}t j�\}} |j||gd|dddddddd||dddddddd|j�t j|�t j|�S#t j|�t j|�wxYw)NrTr�F)�_posixsubprocess� subprocess�tuple�sorted�mapr{r��pipe� fork_exec� _USE_VFORKr�)rZr"�passfdsr�r��errpipe_read� errpipe_writes r#�spawnv_passfdsr��s������F�3�s�G�,�-�.�G�"$�'�'�)��L�-� ��)�)��4�&�$���t���B��B��L�-��5�"�d�D�$��D��!�!� #� ����� ������ ����� �����s�1B�,Cc�>� |D]}tj|��yru)r�r�)r�r�s r#� close_fdsr��s��9��� �����r$c�� ddlm}tj�ddlm}|jj�ddlm}|jj�t�|j�|j�y)Nr)�support)� forkserver)�resource_tracker) �testr�r�_cleanuprr��_forkserver�_stopr��_resource_trackerr�� gc_collect� reap_children)r�r�r�s r#�_cleanup_testsr�sh��������+���� � �"�1��&�&�,�,�.����������r$ru)<r�� itertoolsrIr~r3r�r�r�r�__all__�NOTSETrr&r(rr0r<rrArrrr r rrKrS�abstract_sockets_supportedrar�WeakValueDictionaryrk�countrwrsr r�r��objectrr�rr�r�r^r4r5r�localr�sysconfr�rnrr�r�r�r�rr,r$r#�<module>rs��� �� �� ��3���� ���� �� �� � ���F�� ����8�5�4�:��6�*�A�A�B�� 2��$2�g�1�1�3��$�Y�_�_�&��8�I���$�Y�_�_�&��S�v�S�l&$�X(����E�?�#*�#:�#:�#*�#:�#:�(�T������*�&�*�"�Y�_�_����B�J�J�}�%�E�*� �. � � ���Q���E��s�D%�%D/�.D/PK:W�\3_x��H�H __pycache__/util.cpython-312.pycnu�[���� T��h�7��d�ddlZddlZddlZddlZddlZddlZddlmZddlm Z gd�Z dZdZdZ dZd Zd ZdZdadad �Zd�Zd�Zd�Zd�Zd*d�Zd�Zd�Ze�Zd�Zd�Zej>�Z ejB�Z"d�Z#d�Z$iZ%ejB�Z&Gd�de'�Z(d*d�Z)d�Z*da+eee)e jXe jZfd�Z.ej^e.�Gd�de'�Z0Gd �d!ejb�Z2 ejfd"�Z4d$�Z6d%�Z7d&�Z8d'�Z9d(�Z:d)�Z;y#e5$rd#Z4Y�wxYw)+�N)�_args_from_interpreter_flags�)�process)� sub_debug�debug�info�sub_warning� get_logger� log_to_stderr�get_temp_dir�register_after_fork� is_exiting�Finalize�ForkAwareThreadLock�ForkAwareLocal�close_all_fds_except�SUBDEBUG� SUBWARNING�� ���multiprocessingz+[%(levelname)s/%(processName)s] %(message)sFc�N�trtjt|g|��ddi�yy�N� stacklevel�)�_logger�logr��msg�argss �-/usr/lib64/python3.12/multiprocessing/util.pyrr,s"������H�c�7�D�7�Q�7��c�N�trtjt|g|��ddi�yyr)rr�DEBUGr s r#rr0s"������E�3�4��4�!�4�r$c�N�trtjt|g|��ddi�yyr)rr�INFOr s r#rr4s"������D�#�3��3��3�r$c�N�trtjt|g|��ddi�yyr)rrrr s r#r r 8s"������J��9�d�9�q�9�r$c���ddl}|j� ts�|jt�adt_t td�r3tjt�tjt�nLtjjtdif�tjjtdif�|j�tS#|j�wxYw)z0 Returns logger used by multiprocessing rN� unregister�)�logging�_acquireLockr� getLogger�LOGGER_NAME� propagate�hasattr�atexitr+�_exit_function�register� _exithandlers�remove�append�_releaseLock)r-s r#r r <s��� ��������'�'��4�G� !�G���v�|�,��!�!�.�1�����/��$�$�+�+�^�R��,D�E��$�$�+�+�^�R��,D�E� �����N�� ����s�B5C!�!C3c���ddl}t�}|jt�}|j �}|j|�|j |�|r|j|�datS)zB Turn on logging and add a handler which prints to stderr rNT) r-r � Formatter�DEFAULT_LOGGING_FORMAT� StreamHandler�setFormatter� addHandler�setLevel�_log_to_stderrr)�levelr-�logger� formatter�handlers r#rrWsb�� � �\�F��!�!�"8�9�I��#�#�%�G�����#� ���g���������N��Nr$c�N�tjdk(ryttd�ryy)N�linuxT�getandroidapilevelF)�sys�platformr2r,r$r#�#_platform_supports_abstract_socketsrKls"�� �|�|�w����s�(�)��r$c��|syt|t�r|ddk(St|t�r|ddk(Std|�d���)NFr�zaddress type of z unrecognized)� isinstance�bytes�str� TypeError)�addresss r#�is_abstract_socket_namespacerStsN�����'�5�!��q�z�Q��� �G�S� !��q�z�T�!�!� �&�w�k��?� @�@r$c�j�d�}|||��tj�}|�d|jd<yy)Nc�,�t|dt�s�y�Nr)� issubclass�FileNotFoundError)�func�path�err_infos r#�onerrorz!_remove_temp_dir.<locals>.onerror�s���(�1�+�'8�9��:r$)r\�tempdir)r�current_process�_config)�rmtreer]r\r^s r#�_remove_temp_dirra�s>����7�G�$��-�-�/�O��"�-1���� �*�#r$c�0�tj�jjd�}|�fddl}ddl}|j d��}td|�tdt|j|fd��|tj�jd<|S)Nr]rzpymp-)�prefixzcreated temp directory %si����)r"�exitpriority)rr^r_�get�shutil�tempfile�mkdtemprrrar`)r]rfrgs r#rr�s����%�%�'�/�/�3�3�I�>�G�����"�"�'�"�2��� (�'�2� ��'�v�}�}�g�.F�"� $�7>����!�)�)�)�4��Nr$c���ttj��}|j�|D]\\}}}} ||��y#t$r}td|�Yd}~�0d}~wwxYw)Nz after forker raised exception %s)�list�_afterfork_registry�items�sort� Exceptionr)rl�index�identrY�obj�es r#�_run_after_forkersrs�sa���$�*�*�,�-�E� �J�J�L�%*�!����t�c� 8���I�&+��� 8��3�Q�7�7�� 8�s�A� A%�A � A%c�H�|ttt�t|�|f<y�N)rk�next�_afterfork_counter�id)rqrYs r#r r �s��EH���0�1�2�c�7�D�A�Br$c�N�eZdZdZdd�Zdeeejfd�Z d�Z d�Zd�Zy) rzA Class which supports object finalization using weakrefs Nc�|�|�4t|t�s$tdj|t |����|�tj||�|_n |�td��||_ ||_ |xsi|_|tt�f|_tj �|_|t$|j<y)Nz3Exitpriority ({0!r}) must be None or int, not {1!s}z+Without object, exitpriority cannot be None)rN�intrQ�format�type�weakref�ref�_weakref� ValueError� _callback�_args�_kwargsrv�_finalizer_counter�_key�os�getpid�_pid�_finalizer_registry)�selfrq�callbackr"�kwargsrds r#�__init__zFinalize.__init__�s����$�j��c�.J��E�L�L� �$�|�"4�6�7� 7��?�#�K�K��T�2�D�M� � !��J�K�K�!����� ��|����!�4�(:�#;�<�� ��I�I�K�� �)-��D�I�I�&r$c�r� ||j=|j|�k7r|d�d}nO|d|j|j|j�|j|ji|j��}dx|_x|_x|_x|_|_|S#t$r|d�YywxYw)zQ Run the callback unless it has already been called or cancelled z+finalizer ignored because different processNz/finalizer calling %s with args %s and kwargs %szfinalizer no longer registered)r�r�r�r�r�r��KeyError)r��wrr�rr��ress r#�__call__zFinalize.__call__�s��� �#�D�I�I�.��y�y�F�H�$��G�H����K��.�.�$�*�*�d�l�l�D�$�d�n�n�d�j�j�A�D�L�L�A��7;� <�D�M� <�D�N� <�T�Z� <� �L�4�9��J��� 8��6�7� 8�s� B"�"B6�5B6c�� t|j=dx|_x|_x|_x|_|_y#t$rYywxYw)z3 Cancel finalization of the object N)r�r�r�r�r�r�r��r�s r#�cancelzFinalize.cancel�sU�� <�#�D�I�I�.� 8<� <�D�M� <�D�N� <�T�Z� <� �L�4�9�� � �� �s�7� A�Ac�&�|jtvS)zS Return whether this finalizer is still waiting to invoke callback )r�r�r�s r#�still_activezFinalize.still_active�s���y�y�/�/�/r$c�� |j�}|�d|jjzSd|jj�dt|jd|j���}|jr|dt|j�zz }|jr|dt|j�zz }|jd�|dt|jd�zz }|d zS#ttf$rd}Y��wxYw) Nz<%s object, dead>�<z object, callback=�__name__z, args=z , kwargs=rz, exitpriority=�>)r��AttributeErrorrQ� __class__r��getattrr�r�rPr�r�)r�rq�xs r#�__repr__zFinalize.__repr__�s��� ��-�-�/�C��;�&����)@�)@�@�@�����'�'����� �D�N�N�C� E���:�:� ��S����_�,�,�A��<�<� ��s�4�<�<�0�0�0�A��9�9�Q�<�#� �"�S����1��%6�6�6�A��3�w���� �*� ��C� �s�C(�(C<�;C<)r,NN) r�� __module__�__qualname__�__doc__r�r�rr�r�r�r�r�r�r,r$r#rr�s3���.�&�&9�$�R�Y�Y� �0 <�0�r$rc�|��t�y��d�}n�fd�}tt�D�cgc] }||�s�|��}}|jd��|D].}tj|�}|��t d|� |��0��tj�yycc}w#t $rddl}|j�Y�mwxYw)z� Run all finalizers whose exit priority is not None and at least minpriority Finalizers with highest priority are called first; finalizers with the same priority will be called in reverse order of creation. Nc��|dduSrVr,)�ps r#�<lambda>z!_run_finalizers.<locals>.<lambda>s ��q��t�4�'r$c�&��|dduxr|d�k\SrVr,)r��minprioritys �r#r�z!_run_finalizers.<locals>.<lambda>s���q��t�4�'�?�A�a�D�K�,?�?r$T)�reversez calling %sr) r�rjrmrerrn� traceback� print_exc�clear)r��f�key�keys� finalizerr�s` r#�_run_finalizersr�s�����"� ���'��?�� � 3�4�?�4�C��#��C�4�D�?��I�I�d�I����'�+�+�C�0� �� ��l�I�.� &��� ����!�!�#���@��� &� ��#�#�%� &�s� B�B�5B�B;�:B;c�"�txstduS)z6 Returns true if the process is shutting down N)�_exitingr,r$r#rr;s���'�x�4�'�'r$c�\�ts�da|d�|d�|d�|��u|�D]<}|js�|d|j�|jj ��>|�D]%}|d|j�|j��'|d�|�yy)NTzprocess shutting downz2running all "atexit" finalizers with priority >= 0rz!calling terminate() for daemon %szcalling join() for process %sz)running the remaining "atexit" finalizers)r��daemon�name�_popen� terminate�join)rrr��active_childrenr^r�s r#r4r4Cs������� $�%� �B�C������(�%�&���8�8��<�a�f�f�E��H�H�&�&�(�'� %�&���4�a�f�f�=�����'� �9�:���?r$c�$�eZdZd�Zd�Zd�Zd�Zy)rc���tj�|_|jj|_|jj|_t|tj�yru)� threading�Lock�_lock�acquire�releaser r�_at_fork_reinitr�s r#r�zForkAwareThreadLock.__init__tsC���^�^�%�� ��z�z�)�)����z�z�)�)����D�"5�"E�"E�Fr$c�8�|jj�yru)r�r�r�s r#r�z#ForkAwareThreadLock._at_fork_reinitzs��� � �"�"�$r$c�6�|jj�Sru)r�� __enter__r�s r#r�zForkAwareThreadLock.__enter__}s���z�z�#�#�%�%r$c�4�|jj|�Sru)r��__exit__)r�r"s r#r�zForkAwareThreadLock.__exit__�s��"�t�z�z�"�"�D�)�)r$N)r�r�r�r�r�r�r�r,r$r#rrss��G�%�&�*r$rc��eZdZd�Zd�Zy)rc��t|d��y)Nc�6�|jj�Sru)�__dict__r�)rqs r#r�z)ForkAwareLocal.__init__.<locals>.<lambda>�s��s�|�|�/A�/A�/Cr$)r r�s r#r�zForkAwareLocal.__init__�s ���D�"C�Dr$c��t|�dfS)Nr,)r}r�s r#� __reduce__zForkAwareLocal.__reduce__�s���D�z�2�~�r$N)r�r�r�r�r�r,r$r#rr�s ��E�r$r�SC_OPEN_MAX�c���t|�dtgz}|j�|dtk(sJd��tt |�dz �D]$}tj||dz||dz��&y)N���zfd too larger)rj�MAXFDrm�range�lenr�� closerange)�fds�is r#rr�si�� �s�)�r�5�k� !�C��H�H�J��r�7�e��+�^�+�� �3�s�8�a�<� �� � � �c�!�f�Q�h��A�a�C��)�!r$c��tj�y tjj� tjt jt j�} t |dd��t_y#ttf$rY�]wxYw#tj|��xYw#ttf$rYywxYw)Nzutf-8F)�encoding�closefd) rI�stdin�close�OSErrorr�r��open�devnull�O_RDONLY)�fds r#�_close_stdinr��s��� �y�y��� �� � ���� � �W�W�R�Z�Z���� -�� ��R�'�5�A�C�I�� �Z� � �� �� ��H�H�R�L����Z� � �� �s4�A=�2B-�%B�=B�B�B*�*B-�-B?�>B?c��� tjj� tj j�y#ttf$rY�1wxYw#ttf$rYywxYwru)rI�stdout�flushr�r��stderrr,r$r#�_flush_std_streamsr��s]�� �� � ���� �� � ����� �J�'� �� �� �J�'� �� �s"�A�A�A�A�A'�&A'c��ddl}ddl}ttt t |���}t j�\}} |j||gd|dddddddd||dddddddd|j�t j|�t j|�S#t j|�t j|�wxYw)NrTr�F)�_posixsubprocess� subprocess�tuple�sorted�mapr{r��pipe� fork_exec� _USE_VFORKr�)rZr"�passfdsr�r��errpipe_read� errpipe_writes r#�spawnv_passfdsr��s������F�3�s�G�,�-�.�G�"$�'�'�)��L�-� ��)�)��4�&�$���t���B��B��L�-��5�"�d�D�$��D��!�!� #� ����� ������ ����� �����s�1B�,Cc�<�|D]}tj|��y)z/Close each file descriptor given as an argumentN)r�r�)r�r�s r#� close_fdsr��s���� �����r$c��ddlm}tj�ddlm}|jj�ddlm}|jj�t�|j�|j�y)zKCleanup multiprocessing resources when multiprocessing tests completed.r)�support)� forkserver)�resource_trackerN) �testr�r�_cleanuprr��_forkserver�_stopr��_resource_trackerr�� gc_collect� reap_children)r�r�r�s r#�_cleanup_testsr�sc�������+���� � �"�1��&�&�,�,�.����������r$ru)<r�� itertoolsrIr~r3r�r�r�r�__all__�NOTSETrr&r(rr0r<rrArrrr r rrKrS�abstract_sockets_supportedrar�WeakValueDictionaryrk�countrwrsr r�r��objectrr�rr�r�r^r4r5r�localr�sysconfr�rnrr�r�r�r�rr,r$r#�<module>rs��� �� �� ��3���� ���� �� �� � ���F�� ����8�5�4�:��6�*�A�A�B�� 2��$2�g�1�1�3��$�Y�_�_�&��8�I���$�Y�_�_�&��S�v�S�l&$�X(����E�?�#*�#:�#:�#*�#:�#:�(�T������*�&�*�"�Y�_�_����B�J�J�}�%�E�*� �. � � ���Q���E��s�D%�%D/�.D/PK:W�\�mh�B�B#__pycache__/context.cpython-312.pycnu�[���� T��h�-����ddlZddlZddlZddlmZddlmZdZGd�de�ZGd�d e�Z Gd �de�Z Gd�d e�ZGd�de�Z Gd�dej�ZGd�de �Zej"dk7r�Gd�dej�ZGd�dej�ZGd�dej�ZGd�de �ZGd�de �ZGd�d e �Ze�e�e�d!�Zej"d"k(reed#�Zn@eed$�Zn4Gd%�dej�ZGd&�de �Zd#e�iZeed#�Zd'�Zej6�Zd(�Zd)�Zd*�Zy)+�N�)�process)� reduction�c��eZdZy)�ProcessErrorN��__name__� __module__�__qualname__r��0/usr/lib64/python3.12/multiprocessing/context.pyrr���r rc��eZdZy)�BufferTooShortNr rr rrrrr rc��eZdZy)�TimeoutErrorNr rr rrrrr rc��eZdZy)�AuthenticationErrorNr rr rrrrr rc��eZdZeZeZeZeZeej�Z eej�Z eej�Zd�Zd�Z d"d�Zd�Zd�Zd#d�Zd$d �Zd$d �Zd�Zd%d�Zd&d �Zd&d�Zd�Z d'd�Zd�Zd�Zdd�d�Zdd�d�Zd�Zd�Zd#d�Z d�Z!d�Z"d�Z#d#d�Z$d(d�Z%d(d�Z&e'd��Z(e(jRd ��Z(d!�Z*y))�BaseContextc�H�tj�}|�td��|S)z(Returns the number of CPUs in the systemzcannot determine number of cpus)�os� cpu_count�NotImplementedError)�self�nums rrzBaseContext.cpu_count)s#���l�l�n���;�%�&G�H�H��Jr c�`�ddlm}||j���}|j�|S)z�Returns 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)rr�ms r�ManagerzBaseContext.Manager1s(�� *��D�,�,�.�/�� ��� ��r Tc��ddlm}||�S)z1Returns two connection object connected by a piper)�Pipe)� connectionr()r�duplexr(s rr(zBaseContext.Pipe<s��$��F�|�r c�<�ddlm}||j���S)z#Returns a non-recursive lock objectr)�Lockr )�synchronizer,r#)rr,s rr,zBaseContext.LockAs��%���(�(�*�+�+r c�<�ddlm}||j���S)zReturns a recursive lock objectr)�RLockr )r-r/r#)rr/s rr/zBaseContext.RLockF���&���)�)�+�,�,r Nc�>�ddlm}|||j���S)zReturns a condition objectr)� Conditionr )r-r2r#)r�lockr2s rr2zBaseContext.ConditionKs��*���4�#3�#3�#5�6�6r c�>�ddlm}|||j���S)zReturns a semaphore objectr)� Semaphorer )r-r5r#)r�valuer5s rr5zBaseContext.SemaphorePs��*���D�$4�$4�$6�7�7r c�>�ddlm}|||j���S)z"Returns a bounded semaphore objectr)�BoundedSemaphorer )r-r8r#)rr6r8s rr8zBaseContext.BoundedSemaphoreUs��1���4�+;�+;�+=�>�>r c�<�ddlm}||j���S)zReturns an event objectr)�Eventr )r-r:r#)rr:s rr:zBaseContext.EventZr0r c�B�ddlm}|||||j���S)zReturns a barrier objectr)�Barrierr )r-r<r#)r�parties�action�timeoutr<s rr<zBaseContext.Barrier_s��(��w���T�5E�5E�5G�H�Hr c�>�ddlm}|||j���S)�Returns a queue objectr)�Queuer )�queuesrBr#)r�maxsizerBs rrBzBaseContext.Queueds��!��W�$�"2�"2�"4�5�5r c�>�ddlm}|||j���S)rAr)� JoinableQueuer )rCrFr#)rrDrFs rrFzBaseContext.JoinableQueueis��)��W�$�*:�*:�*<�=�=r c�<�ddlm}||j���S)rAr)�SimpleQueuer )rCrHr#)rrHs rrHzBaseContext.SimpleQueuens��'��t�/�/�1�2�2r c�D�ddlm}||||||j���S)zReturns a process pool objectr)�Pool)�context)�poolrJr#)r� processes�initializer�initargs�maxtasksperchildrJs rrJzBaseContext.Poolss)�� ��I�{�H�6F� �,�,�.�0� 0r c� �ddlm}||g|���S)zReturns a shared objectr)�RawValue)�sharedctypesrR)r�typecode_or_type�argsrRs rrRzBaseContext.RawValuezs��*��(�0�4�0�0r c� �ddlm}|||�S)zReturns a shared arrayr)�RawArray)rSrW)rrT�size_or_initializerrWs rrWzBaseContext.RawArrays��*��(�*=�>�>r )r3c�D�ddlm}||g|��||j�d��S)z$Returns a synchronized shared objectr)�Value�r3r!)rSrZr#)rrTr3rUrZs rrZzBaseContext.Value�s/��'��%�-��-�4��)�)�+�-� -r c�B�ddlm}|||||j���S)z#Returns a synchronized shared arrayr)�Arrayr[)rSr]r#)rrTrXr3r]s rr]zBaseContext.Array�s&��'��%�':���)�)�+�-� -r c�j�tjdk(r ttdd�rddlm}|�yyy)z�Check 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�spawnra)rras rrazBaseContext.freeze_support�s-���<�<�7�"�w�s�H�e�'D�-���(E�"r c��ddlm}|�S)zZReturn package logger -- if it does not already exist then it is created. r)� get_logger)�utilrg)rrgs rrgzBaseContext.get_logger�s�� %��|�r c��ddlm}||�S)z8Turn on logging and add a handler which prints to stderrr)� log_to_stderr)rhrj)r�levelrjs rrjzBaseContext.log_to_stderr�s��'��U�#�#r c��ddlm}y)zVInstall support for sending connections and sockets between processes r)r)N)�r))rr)s r�allow_connection_picklingz%BaseContext.allow_connection_pickling�s�� !r c� �ddlm}||�y)z�Sets 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)rerp)r� executablerps rrpzBaseContext.set_executable�s�� *��z�"r c� �ddlm}||�y)zkSet list of module names to try to load in forkserver process. This is really just a hint. r)�set_forkserver_preloadN)� forkserverrs)r�module_namesrss rrsz"BaseContext.set_forkserver_preload�s�� 7��|�,r c�z�|�|S t|}|j�|S#t$rtd|z�d�wxYw)Nzcannot find context for %r)�_concrete_contexts�KeyError� ValueError�_check_available)r�methodr!s rr#zBaseContext.get_context�sU���>��K� N�$�V�,�C� ����� ��� N��9�F�B�C��M� N�s� !�:c��|jS�N)�_name�r� allow_nones r�get_start_methodzBaseContext.get_start_method�s���z�z�r c��td��)Nz+cannot set start method of concrete context)ry�rr{�forces r�set_start_methodzBaseContext.set_start_method�s���F�G�Gr c�4�t�jd�S)z_Controls how objects will be reduced to a form that can be shared with other processes.r)�globals�get�rs r�reducerzBaseContext.reducer�s���y�}�}�[�)�)r c��|t�d<y)Nr)r�)rrs rr�zBaseContext.reducer�s��!*�� �+�r c��yr}rr�s rrzzBaseContext._check_available�s��r )Tr})r)NN)r)NNrN�F)+r rrrrrr�staticmethodr�current_process�parent_process�active_childrenrr&r(r,r/r2r5r8r:r<rBrFrHrJrRrWrZr]rargrjrnrprsr#r�r��propertyr��setterrzrr rrrs���L�#�N��L�-��"�7�#:�#:�;�O�!�'�"8�"8�9�N�"�7�#:�#:�;�O�� �� ,� -� 7� 8� ?� -� I� 6� >� 3� ?A�"�0�1� ?� 37�-�DH�-���$� !�#�-���H��*��*� �^�^�+��+� r rc�0�eZdZdZed��Zed��Zy)�ProcessNc�\�tj�jj|�Sr})�_default_contextr#r��_Popen)�process_objs rr�zProcess._Popen�s"���+�+�-�5�5�<�<�[�I�Ir c�Z�tj�jj�Sr})r�r#r��_after_forkrr rr�zProcess._after_fork�s ���+�+�-�5�5�A�A�C�Cr �r rr� _start_methodr�r�r�rr rr�r��s1���M��J��J��D��Dr r�c�@��eZdZeZd�Zd�fd� Zdd�Zdd�Zd�Z�xZ S)�DefaultContextc� �||_d|_yr})r��_actual_context)rrKs r�__init__zDefaultContext.__init__�s�� '���#��r c�x��|�)|j�|j|_|jSt�|� |�Sr})r�r��superr#)rr{� __class__s �rr#zDefaultContext.get_context�s>����>��#�#�+�'+�'<�'<��$��'�'�'��7�&�v�.�.r c�z�|j� |std��|� |rd|_y|j|�|_y)Nzcontext has already been set)r��RuntimeErrorr#r�s rr�zDefaultContext.set_start_method�sA�����+�E��=�>�>��>�e�#'�D� ��#�/�/��7��r c�n�|j�|ry|j|_|jjSr})r�r�r~rs rr�zDefaultContext.get_start_method�s4�����'���#'�#8�#8�D� ��#�#�)�)�)r c��tjdk(rdgStjdk(rddgnddg}tjr|j d�|S)z=Returns a list of the supported start methods, default first.r_re�darwin�forkrt)rbrcr�HAVE_SEND_HANDLE�append)r�methodss r�get_all_start_methodsz$DefaultContext.get_all_start_methodssM���<�<�7�"��9��+.�<�<�8�+C�w��'�&�RY�IZ�G��)�)����|�,��Nr r}r�) r rrr�r�r#r�r�r�� __classcell__)r�s@rr�r��s!����G�$�/�8�*�r r�r_c� �eZdZdZed��Zy)�ForkProcessr�c��ddlm}||�S�Nr)�Popen)� popen_forkr��r�r�s rr�zForkProcess._Popens��)���%�%r N�r rrr�r�r�rr rr�r�s��� � � &� � &r r�c�0�eZdZdZed��Zed��Zy)�SpawnProcessrec��ddlm}||�Sr�)�popen_spawn_posixr�r�s rr�zSpawnProcess._Popen���0���%�%r c��yr}rrr rr�zSpawnProcess._after_fork#��� r Nr�rr rr�r��-��� � � &� � &� � � � r r�c� �eZdZdZed��Zy)�ForkServerProcessrtc��ddlm}||�Sr�)�popen_forkserverr�r�s rr�zForkServerProcess._Popen*s��/���%�%r Nr�rr rr�r�(s��$� � � &� � &r r�c��eZdZdZeZy)�ForkContextr�N)r rrr~r�r�rr rr�r�/s�����r r�c��eZdZdZeZy��SpawnContextreN�r rrr~r�r�rr rr�r�3������r r�c��eZdZdZeZd�Zy)�ForkServerContextrtc�:�tjstd��y)Nz%forkserver start method not available)rr�ryr�s rrzz"ForkServerContext._check_available:s���-�-� �!H�I�I�.r N)r rrr~r�r�rzrr rr�r�7s����#�� Jr r�)r�rertr�rer�c�0�eZdZdZed��Zed��Zy)r�rec��ddlm}||�Sr�)�popen_spawn_win32r�r�s rr�zSpawnProcess._PopenNr�r c��yr}rrr rr�zSpawnProcess._after_forkSr�r Nr�rr rr�r�Lr�r c��eZdZdZeZyr�r�rr rr�r�Xr�r c�(�t|t_yr})rwr�r�)r{s r�_force_start_methodr�es��'9�&�'A��$r c�$�ttdd�S)N�spawning_popen)rd�_tlsrr r�get_spawning_popenr�ns���4�)�4�0�0r c��|t_yr})r�r�)�popens r�set_spawning_popenr�qs ���D�r c�Z�t��!tdt|�jz��y)NzF%s objects should only be shared between processes through inheritance)r�r��typer )�objs r�assert_spawningr�ts4����#�� #�%)�#�Y�%7�%7� 8�� �$r ) rrb� threadingrmrr�__all__� Exceptionrrrr�objectr�BaseProcessr�r�rcr�r�r�r�r�r�rwr�r��localr�r�r�r�rr r�<module>r�s��� � ���� �� �9� � �\� � �<� � �,� �x �&�x �|D�g�!�!�D�&�[�&�Z�<�<�7��&�g�)�)�&� �w�*�*� �&�G�/�/�&��k���{��J�K�J�� ���'�)��� �|�|�x��*�*<�W�*E�F��)�*<�V�*D�E�� �w�*�*� ��{�� �����&�&8��&A�B��B��y�����1� �r PK:W�\�z��:�:,__pycache__/forkserver.cpython-312.opt-1.pycnu�[���� T��h�/��b�ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl mZddlm Z ddl mZddl mZddl mZgd �Zd Zej&d�ZGd�d e�Zdd�Zd�Zd�Zd�Ze�Zej8Zej:Zej<Zej>Zy)�N�)� connection)�process)� reduction)�resource_tracker)�spawn)�util)�ensure_running�get_inherited_fds�connect_to_new_process�set_forkserver_preload��qc�6�eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z y) � ForkServerc�~�d|_d|_d|_d|_t j �|_dg|_y)N�__main__)�_forkserver_address�_forkserver_alive_fd�_forkserver_pid�_inherited_fds� threading�Lock�_lock�_preload_modules��selfs �3/usr/lib64/python3.12/multiprocessing/forkserver.py�__init__zForkServer.__init__"s:��#'�� �$(��!�#���"����^�^�%�� �!+����c�f�|j5|j�ddd�y#1swYyxYw�N)r�_stop_unlockedrs r�_stopzForkServer._stop*s�� �Z�Z����!��Z�Z�s�'�0c�B�|j�ytj|j�d|_tj|jd�d|_tj|j�stj|j�d|_y)Nr) r�os�closer�waitpidr �is_abstract_socket_namespacer�unlinkrs rr#zForkServer._stop_unlocked/sw�����'�� ����*�*�+�$(��!� � � �4�'�'��+�#����0�0��1I�1I�J��I�I�d�.�.�/�#'�� r c�L�td�|D��std��||_y)z>Set list of module names to try to load in forkserver process.c3�>K�|]}t|�tu���y�wr")�type�str)�.0�mods r� <genexpr>z4ForkServer.set_forkserver_preload.<locals>.<genexpr>@s����=�}��4��9��#�}�s�z&module_names must be a list of stringsN)�all� TypeErrorr)r� modules_namess rr z!ForkServer.set_forkserver_preload>s$���=�}�=�=��D�E�E� -��r c��|jS)z�Return list of fds inherited from parent process. This returns None if the current process was not started by fork server. )rrs rrzForkServer.get_inherited_fdsDs���"�"�"r c��|j�t|�dztk\rtd��t jtj �5}|j |j�tj�\}}tj�\}}|||jtj�g}||z } tj||�||ftj|�tj|�cddd�S#tj|�tj|��xYw#tj|�tj|�wxYw#1swYyxYw)a;Request forkserver to create a child process. Returns a pair of fds (status_r, data_w). The calling process can read the child process's pid and (eventually) its returncode from status_r. The calling process should write to data_w the pickled preparation and process data. �ztoo many fdsN)r �len�MAXFDS_TO_SEND� ValueError�socket�AF_UNIX�connectrr&�piperr�getfdr�sendfdsr')r�fds�client�parent_r�child_w�child_r�parent_w�allfdss rrz!ForkServer.connect_to_new_processLs�� �����s�8�a�<�>�)��^�,�,� �]�]�6�>�>� *�f��N�N�4�3�3�4� "��� ��H�g� "��� ��G�X��w��(A�(A�&�,�,�.�0�F��c�M�F� "��!�!�&�&�1���)�����!�����!�!+� *�� �����"�����"�������!�����!��!+� *�s1�A1E2�D�*E2�-E�E�,E/�/E2�2E;c�4�|j5tj�|j�qt j |jtj�\}}|s ddd�yt j|j�d|_ d|_d|_d}|jrBddh}tjd�}|j�D��cic] \}}||vs�||��}}}ni}tjtj�5}t!j"d�} |j%| �t'j(| �st j*| d�|j-�t j.�\} } |j1�| g}||j1�| |j|fz}tj2�} | gt'j4�z}|d|gz }t'j6| ||�} t j| �| |_ ||_||_ddd�ddd�ycc}}w#t j|��xYw#t j| �wxYw#1swY�MxYw#1swYyxYw) z�Make sure that a fork server is running. This can be called from any process. Note that usually a child process will just reuse the forkserver started by its parent, so ensure_running() will do nothing. NzCfrom multiprocessing.forkserver import main; main(%d, %d, %r, **%r)� main_path�sys_path�ignorer<i�z-c)rrr rr&r(�WNOHANGr'rrrr�get_preparation_data�itemsr;r<r�arbitrary_address�bindr r)�chmod�listenr>�fileno�get_executable�_args_from_interpreter_flags�spawnv_passfds)r�pid�status�cmd�desired_keys�data�x�y�listener�address�alive_r�alive_w�fds_to_pass�exe�argss rr zForkServer.ensure_runningis&���Z�Z��+�+�-��#�#�/� �j�j��)=�)=�r�z�z�J���V����Z�����2�2�3�+/��(�,0��)�'+��$�,�C��$�$� +�Z�8���1�1�(�;��)-����K����A��l�9J��1����K������v�~�~�.�(�$�6�6�y�A��� � �g�&��8�8��A��H�H�W�e�,����!�$&�7�7�9� ���&�#+�?�?�#4�g�">�K��H�O�O�-�w��8M�8M� �"�"�C��.�.�0�C��5�4�#D�#D�#F�F�D��T�3�K�'�D��-�-�c�4��E�C� �H�H�W�%�+2��(�,3��)�'*��$�3/�1�Z��(L��,��H�H�W�%����H�H�W�%��-/�.��1�Z�si�AJ�+A.J�I�&I�+)J�A9J�A=I �*J�6J�J� I%�%I(�(I?�?J�J �J�JN) �__name__� __module__�__qualname__rr$r#r rrr �r rrr s%��-�"� (�.�#�"�:8+r rc �� �|rq|�|tjddd|vrE|�Cdtj�_ tj|�tj�`|D]} t|��tj�tj�\}}tj|d�tj|d�d�}tj|tj tj"i} | j%�D� �cic]\} }| tj| |���}} }tj&|�i} t)j(t(j*|��5}t-j.�5}|j1�t2_|j7|t,j8�|j7|t,j8�|j7|t,j8� |j;�D��cgc]\}}|j<��}}}|rn�0||vrt>�||vr�tj@|d� tjBdtjD�\}}|d k(rne| jI|d�}|�8tjJ|�} tM||�tjP|�ntSjTd |z���||v�rK|jW�d 5}tYjZ|t\dz�}t_|�t\kDr#tadjct_|����|^}}}|jQ�tjd�}|d k(rld} |jQ�|jQ�||||g}|jg| ji��tk||||�}tjv|�nC tM||�|| |<tjP|�|D]}tjP|��ddd���<#tj�`wxYw#t$rY���wxYwcc}} wcc}}w#tF$rY���wxYw#tN$rY���wxYw#tl$rFtjntjp��tjrju�Y��wxYw#tjv|�wxYw#tN$rY�� wxYw#1swY��xYw#tx$r)}|jztzj|k7r�Yd}~��d}~wwxYw#1swYnxYw ddd�y#1swYyxYw) zRun forkserver.NrTFc��yr"rh)�_unuseds r�sigchld_handlerzmain.<locals>.sigchld_handler�s��r )rSi���rz.forkserver: waitpid returned unexpected pid %drzToo many ({0:n}) fds to send)?�sys�pathr�current_process�_inheritingr�import_main_path� __import__�ImportErrorr �_close_stdinr&r>�set_blocking�signal�SIGCHLD�SIGINT�SIG_IGNrN� set_wakeup_fdr;r<� selectors�DefaultSelector�getsockname�_forkserverr�register� EVENT_READ�select�fileobj� SystemExit�readr(rL�ChildProcessError�pop�waitstatus_to_exitcode�write_signed�BrokenPipeErrorr'�warnings�warn�acceptr�recvfdsr9r8�RuntimeError�format�fork�extend�values� _serve_one� Exception� excepthook�exc_info�stderr�flush�_exit�OSError�errno�ECONNABORTED)�listener_fdr`�preloadrIrJ�modname�sig_r�sig_wrl�handlers�sig�val�old_handlers� pid_to_fdr^�selector�key�events�rfdsrW�stsrD� returncode�srArE�code� unused_fds�fd�es r�mainr��s������"�C�H�H�Q�K��� �Y�%:�48�G�#�#�%�1� :��&�&�y�1��+�+�-�9��G� ��7�#�� �����7�7�9�L�E�5��O�O�E�5�!��O�O�E�5�!� � ����� � �v�~�~� �H�'/�n�n�&6�8�&6� ��c�����s�C�0�0�&6��8�������I� ���v�~�~�k� :�h� � "� "� $��*2�*>�*>�*@��'����(�I�$8�$8�9����'�9�#7�#7�8����%��!5�!5�6��P ��=E�_�_�=N�O�=N�M�S�&�C�K�K�=N�D�O���� �d�?�%�$��D�=��G�G�E�5�)��"�')�z�z�"�b�j�j�'A�H�C���!�8�!�"+�-�-��T�":��"�.�)+�)B�)B�3�)G�J�%� ,�W�j� A��H�H�W�-�%�M�M�+>�@C�+D�E�+�0�t�#�!���*�1�-��'�/�/��>�A�3E�F���s�8�n�4�".� >� E� E�$'��H�!.�#/�/�25�.���3���� � �g�g�i���!�8�#$�D�/� (��� 0� (��� 0�.5�w��u�-M� � *� 1� 1�)�2B�2B�2D� E�'1�'�3�2<�2>�(@��!#�����%� ,�W�c� :�.5�I�c�N��H�H�W�-�&)�� "�����'*�G.�S��Q�+�+�-�9��� �� ��&8��(P�� 1�"�!�"��$3�%� $�%��@$-�3� #������� ?� #� � � 0� 0� 2�3��!#������ $3�%� $�%��=.�-��L� ��7�7�e�0�0�0��1�� ��m %� $�� $� ;� :� :�s6�P=�'Q�!Q&�1U%�A;U�T�Q, �,,T�'Q2�/T�0R�<AT�BT�AR�T�1S>�=6T�3T�;U�=Q� Q#�"Q#�,T�2 Q?�;T�>Q?�?T� R�T�R�T�AS! �S$� S! �!S$�$S; �;T�> T �T� T �T�T�T� U�#U�U�U�U�U �U%�%U.c�n�tjd�|j�D]\}}tj||��|D]}tj|��|^t _tj_ t _ tj|�}tj||�}|S)Nrm)rwr{rNr&r'rrr�_resource_tracker�_fdr�dupr�_main) rErAr�r�r�r�r��parent_sentinelr�s rr�r�-s��� ������N�N�$���S�� � �c�3��%��� ������ %(�"�[�%��'�'�+�� ��f�f�W�o�O��;�;�w��0�D��Kr c��d}tj}t|�|krCtj||t|�z �}|std��||z }t|�|kr�Ctj |�dS)Nr zunexpected EOFr)� SIGNED_STRUCT�sizer8r&r��EOFError�unpack)r�r[�lengthr�s r�read_signedr�Dsu���D� � � �F� �d�)�f� ��G�G�B���T��*�+����+�,�,��� �� �d�)�f� � ����%�a�(�(r c��tj|�}|r/tj||�}|dk(rt d��||d}|r�.yy)Nrzshould not get here)r��packr&�writer�)r��n�msg�nbytess rr�r�NsH�� � � �Q� �C� ����"�c�"���Q�;��4�5�5��&�'�l�� r )NN) r�r&r|rwr;�structrnrr��rr�contextrrrr �__all__r9�Structr��objectrr�r�r�r�rr rrr rhr r�<module>r�s���� �� � � � ���������%������ � �c�"� �A+��A+�NC�L�.)���l���+�+���1�1��$�;�;��$�;�;�r PK:W�\���' &__pycache__/popen_fork.cpython-312.pycnu�[���� T��hI ��<�ddlZddlZddlmZdgZGd�de�Zy)�N�)�util�Popenc�`�eZdZdZd�Zd�Zejfd�Zdd�Z d�Z d�Zd �Zd �Z d�Zy) r�forkc�j�tj�d|_d|_|j |�y�N)r�_flush_std_streams� returncode� finalizer�_launch)�self�process_objs �3/usr/lib64/python3.12/multiprocessing/popen_fork.py�__init__zPopen.__init__s(�����!����������[�!�c��|Sr �)r�fds r�duplicate_for_childzPopen.duplicate_for_childs��� rc���|j�M tj|j|�\}}||jk(rtj |�|_|jS#t$rYywxYwr )r�os�waitpid�pid�OSError�waitstatus_to_exitcode)r�flagr�stss r�pollz Popen.pollsh���?�?�"� ��:�:�d�h�h��5���S� �d�h�h��"$�";�";�C�"@�������� � �� �s�#A&�& A2�1A2Nc��|j�G|�ddlm}||jg|�sy|j |dk(rt j�Sd�S|jS)Nr)�waitg)r�multiprocessing.connectionr!�sentinelrr�WNOHANG)r�timeoutr!s rr!z Popen.wait$sS���?�?�"��"�;��T�]�]�O�W�5���9�9�7�c�>�R�Z�Z�A�A�q�A�A����rc��|j�" tj|j|�yy#t$rYyt $r|j d����YywxYw)Ng�������?)r%)rr�killr�ProcessLookupErrorrr!)r�sigs r�_send_signalzPopen._send_signal.s]���?�?�"� �������#�&�#��&� ��� ��9�9�S�9�)�1��2� �s� 0� A�A�Ac�B�|jtj�yr )r*�signal�SIGTERM�rs r� terminatezPopen.terminate8������&�.�.�)rc�B�|jtj�yr )r*r,�SIGKILLr.s rr'z Popen.kill;r0rc�H�d}tj�\}}tj�\}}tj�|_|jdk(rS tj|�tj|�|j|��}tj|�ytj|�tj|�tj|tj||f�|_ ||_y#tj|�wxYw)Nrr)�parent_sentinel)r�piperr�close� _bootstrap�_exitr�Finalize� close_fdsrr#)rr�code�parent_r�child_w�child_r�parent_ws rr z Popen._launch>s������G�G�I���'��G�G�I�����7�7�9����8�8�q�=� �����"�����"�"�-�-�g�-�F��������H�H�W���H�H�W��!�]�]�4����,4�h�+@�B�D�N�$�D�M�� �����s�<D � D!c�>�|j�|j�yyr )rr.s rr6zPopen.closeQs���>�>�%��N�N��&rr )�__name__� __module__�__qualname__�methodrrrr$rr!r*r/r'r r6rrrrrs=�� �F�"��� � � ���*�*�%�&r)rr,�r�__all__�objectrrrr�<module>rHs#�� � ���)��G�F�GrPK:W�\q��www2__pycache__/popen_forkserver.cpython-312.opt-1.pycnu�[���� T��h�����ddlZddlZddlmZmZej sed��ddlmZddlm Z ddlm Z ddlmZd gZGd �de �ZGd�d e j�Zy) �N�)� reduction�set_spawning_popenz,No support for sending fds between processes)� forkserver)� popen_fork)�spawn)�util�Popenc��eZdZd�Zd�Zy)�_DupFdc��||_y�N)�ind)�selfrs �9/usr/lib64/python3.12/multiprocessing/popen_forkserver.py�__init__z_DupFd.__init__s �����c�D�tj�|jSr)r�get_inherited_fdsr)rs r�detachz _DupFd.detachs���+�+�-�d�h�h�7�7rN)�__name__� __module__�__qualname__rr�rrrrs���8rrc�P��eZdZdZeZ�fd�Zd�Zd�Ze jfd�Z�xZS)r rc�2��g|_t�|� |�yr)�_fds�superr)r�process_obj� __class__s �rrzPopen.__init__!s����� � ����%rc�h�|jj|�t|j�dz S)Nr)r�append�len)r�fds r�duplicate_for_childzPopen.duplicate_for_child%s'��� � ������4�9�9�~��!�!rc��tj|j�}tj�}t|� t j||�t j||�td�tj|j�\|_}tj|�}tj|tj ||jf�|_t%|dd��5}|j'|j)��ddd�tj*|j�|_y#td�wxYw#1swY�>xYw)N�wbT)�closefd)r�get_preparation_data�_name�io�BytesIOrr�dumpr�connect_to_new_processr�sentinel�os�dupr �Finalize� close_fds� finalizer�open�write� getbuffer�read_signed�pid)rr� prep_data�buf�w� _parent_w�fs r�_launchz Popen._launch)s����.�.�{�/@�/@�A� ��j�j�l���4� � %��N�N�9�c�*��N�N�;��,��t�$�%�<�<�T�Y�Y�G��� �q��F�F�1�I� ����t�T�^�^�(1�4�=�=�'A�C��� �!�T�4� (�A� �G�G�C�M�M�O�$�)��)�)�$�-�-�8���� �t�$��)� (�s�,E�7 E� E�Ec�F�|j�cddlm}|tjk(rdnd}||j g|�sy t j|j �|_|jS|jS#ttf$rd|_Y|jSwxYw)Nr)�wait�) � returncode�multiprocessing.connectionrAr0�WNOHANGr/rr8�OSError�EOFError)r�flagrA�timeouts r�pollz Popen.poll=s����?�?�"�7��2�:�:�-�a�4�G�������1�� &�",�"8�"8����"G�������t������X�&� &�#&������� &�s�$A<�<B �B ) rrr�methodr�DupFdrr%r?r0rErJ� __classcell__)r s@rr r s*��� �F��E�&�"�9�(� � � r)r+r0�contextrr�HAVE_SEND_HANDLE�ImportError�rrrr �__all__�objectrr rrr�<module>rTsV�� � �2��!�!� �D� E�E������)��8�V�8�-�J���-rPK:W�\q��www2__pycache__/popen_forkserver.cpython-312.opt-2.pycnu�[���� T��h�����ddlZddlZddlmZmZej sed��ddlmZddlm Z ddlm Z ddlmZd gZGd �de �ZGd�d e j�Zy) �N�)� reduction�set_spawning_popenz,No support for sending fds between processes)� forkserver)� popen_fork)�spawn)�util�Popenc��eZdZd�Zd�Zy)�_DupFdc��||_y�N)�ind)�selfrs �9/usr/lib64/python3.12/multiprocessing/popen_forkserver.py�__init__z_DupFd.__init__s �����c�D�tj�|jSr)r�get_inherited_fdsr)rs r�detachz _DupFd.detachs���+�+�-�d�h�h�7�7rN)�__name__� __module__�__qualname__rr�rrrrs���8rrc�P��eZdZdZeZ�fd�Zd�Zd�Ze jfd�Z�xZS)r rc�2��g|_t�|� |�yr)�_fds�superr)r�process_obj� __class__s �rrzPopen.__init__!s����� � ����%rc�h�|jj|�t|j�dz S)Nr)r�append�len)r�fds r�duplicate_for_childzPopen.duplicate_for_child%s'��� � ������4�9�9�~��!�!rc��tj|j�}tj�}t|� t j||�t j||�td�tj|j�\|_}tj|�}tj|tj ||jf�|_t%|dd��5}|j'|j)��ddd�tj*|j�|_y#td�wxYw#1swY�>xYw)N�wbT)�closefd)r�get_preparation_data�_name�io�BytesIOrr�dumpr�connect_to_new_processr�sentinel�os�dupr �Finalize� close_fds� finalizer�open�write� getbuffer�read_signed�pid)rr� prep_data�buf�w� _parent_w�fs r�_launchz Popen._launch)s����.�.�{�/@�/@�A� ��j�j�l���4� � %��N�N�9�c�*��N�N�;��,��t�$�%�<�<�T�Y�Y�G��� �q��F�F�1�I� ����t�T�^�^�(1�4�=�=�'A�C��� �!�T�4� (�A� �G�G�C�M�M�O�$�)��)�)�$�-�-�8���� �t�$��)� (�s�,E�7 E� E�Ec�F�|j�cddlm}|tjk(rdnd}||j g|�sy t j|j �|_|jS|jS#ttf$rd|_Y|jSwxYw)Nr)�wait�) � returncode�multiprocessing.connectionrAr0�WNOHANGr/rr8�OSError�EOFError)r�flagrA�timeouts r�pollz Popen.poll=s����?�?�"�7��2�:�:�-�a�4�G�������1�� &�",�"8�"8����"G�������t������X�&� &�#&������� &�s�$A<�<B �B ) rrr�methodr�DupFdrr%r?r0rErJ� __classcell__)r s@rr r s*��� �F��E�&�"�9�(� � � r)r+r0�contextrr�HAVE_SEND_HANDLE�ImportError�rrrr �__all__�objectrr rrr�<module>rTsV�� � �2��!�!� �D� E�E������)��8�V�8�-�J���-rPK:W�\q��www,__pycache__/popen_forkserver.cpython-312.pycnu�[���� T��h�����ddlZddlZddlmZmZej sed��ddlmZddlm Z ddlm Z ddlmZd gZGd �de �ZGd�d e j�Zy) �N�)� reduction�set_spawning_popenz,No support for sending fds between processes)� forkserver)� popen_fork)�spawn)�util�Popenc��eZdZd�Zd�Zy)�_DupFdc��||_y�N)�ind)�selfrs �9/usr/lib64/python3.12/multiprocessing/popen_forkserver.py�__init__z_DupFd.__init__s �����c�D�tj�|jSr)r�get_inherited_fdsr)rs r�detachz _DupFd.detachs���+�+�-�d�h�h�7�7rN)�__name__� __module__�__qualname__rr�rrrrs���8rrc�P��eZdZdZeZ�fd�Zd�Zd�Ze jfd�Z�xZS)r rc�2��g|_t�|� |�yr)�_fds�superr)r�process_obj� __class__s �rrzPopen.__init__!s����� � ����%rc�h�|jj|�t|j�dz S)Nr)r�append�len)r�fds r�duplicate_for_childzPopen.duplicate_for_child%s'��� � ������4�9�9�~��!�!rc��tj|j�}tj�}t|� t j||�t j||�td�tj|j�\|_}tj|�}tj|tj ||jf�|_t%|dd��5}|j'|j)��ddd�tj*|j�|_y#td�wxYw#1swY�>xYw)N�wbT)�closefd)r�get_preparation_data�_name�io�BytesIOrr�dumpr�connect_to_new_processr�sentinel�os�dupr �Finalize� close_fds� finalizer�open�write� getbuffer�read_signed�pid)rr� prep_data�buf�w� _parent_w�fs r�_launchz Popen._launch)s����.�.�{�/@�/@�A� ��j�j�l���4� � %��N�N�9�c�*��N�N�;��,��t�$�%�<�<�T�Y�Y�G��� �q��F�F�1�I� ����t�T�^�^�(1�4�=�=�'A�C��� �!�T�4� (�A� �G�G�C�M�M�O�$�)��)�)�$�-�-�8���� �t�$��)� (�s�,E�7 E� E�Ec�F�|j�cddlm}|tjk(rdnd}||j g|�sy t j|j �|_|jS|jS#ttf$rd|_Y|jSwxYw)Nr)�wait�) � returncode�multiprocessing.connectionrAr0�WNOHANGr/rr8�OSError�EOFError)r�flagrA�timeouts r�pollz Popen.poll=s����?�?�"�7��2�:�:�-�a�4�G�������1�� &�",�"8�"8����"G�������t������X�&� &�#&������� &�s�$A<�<B �B ) rrr�methodr�DupFdrr%r?r0rErJ� __classcell__)r s@rr r s*��� �F��E�&�"�9�(� � � r)r+r0�contextrr�HAVE_SEND_HANDLE�ImportError�rrrr �__all__�objectrr rrr�<module>rTsV�� � �2��!�!� �D� E�E������)��8�V�8�-�J���-rPK:W�\ũ�PP3__pycache__/popen_spawn_posix.cpython-312.opt-1.pycnu�[���� T��h����ddlZddlZddlmZmZddlmZddlmZddlmZdgZ Gd�d e �ZGd �dej�Zy)�N�)� reduction�set_spawning_popen)� popen_fork)�spawn)�util�Popenc��eZdZd�Zd�Zy)�_DupFdc��||_y�N��fd��selfrs �:/usr/lib64/python3.12/multiprocessing/popen_spawn_posix.py�__init__z_DupFd.__init__s �����c��|jSr r)rs r�detachz _DupFd.detachs���w�w�rN)�__name__� __module__�__qualname__rr�rrrrs���rrc�2��eZdZdZeZ�fd�Zd�Zd�Z�xZ S)r rc�2��g|_t�|� |�yr )�_fds�superr)r�process_obj� __class__s �rrzPopen.__init__s����� � ����%rc�<�|jj|�|Sr )r�appendrs r�duplicate_for_childzPopen.duplicate_for_child"s��� � ������ rc��ddlm}|j�}|jj |�tj|j�}tj�}t|� tj||�tj||�td�dx}x}x}} tj�\}}tj�\}} tj||��} |jj!||g�t#j$tj&�| |j�|_||_t-| dd��5}|j/|j1��ddd�g}|| fD]} | ��|j | ��t#j2|t"j4|�|_||fD]} | ��tj8| ��y#td�wxYw#1swY��xYw#g}|| fD]} | ��|j | ��t#j2|t"j4|�|_||fD]} | ��tj8| ��wxYw)Nr)�resource_tracker)� tracker_fd�pipe_handle�wbF)�closefd)�r%�getfdrr"r�get_preparation_data�_name�io�BytesIOrr�dump�os�pipe�get_command_line�extendr�spawnv_passfds�get_executable�pid�sentinel�open�write� getbuffer�Finalize� close_fds� finalizer�close)rrr%r&� prep_data�fp�parent_r�child_w�child_r�parent_w�cmd�f�fds_to_closers r�_launchz Popen._launch&s��&�%�+�+�-� �� � ����$��.�.�{�/@�/@�A� � �Z�Z�\���4� � %��N�N�9�b�)��N�N�;��+��t�$�26�6��6�7�6�W�x� !� "��� ��H�g� "��� ��G�X��(�(�J�5<�>�C��I�I���g�w�/�0��*�*�5�+?�+?�+A�+.�� � �;�D�H�$�D�M��h��e�4���������'�5��L���*���>� �'�'��+�+�"�]�]�4�����N�D�N���(���>��H�H�R�L�)��+ �t�$��5�4���L���*���>� �'�'��+�+�"�]�]�4�����N�D�N���(���>��H�H�R�L�)�s>�1,G3�1B/H� H�H�3 H�H�H�I;�AI;�#I;) rrr�methodr�DupFdrr#rI� __classcell__)r s@rr r s��� �F��E�&��"!r) r.r1�contextrrr*rrr�__all__�objectrr rrr�<module>rPs<�� � �2�����)���V��.!�J���.!rPK:W�\ũ�PP3__pycache__/popen_spawn_posix.cpython-312.opt-2.pycnu�[���� T��h����ddlZddlZddlmZmZddlmZddlmZddlmZdgZ Gd�d e �ZGd �dej�Zy)�N�)� reduction�set_spawning_popen)� popen_fork)�spawn)�util�Popenc��eZdZd�Zd�Zy)�_DupFdc��||_y�N��fd��selfrs �:/usr/lib64/python3.12/multiprocessing/popen_spawn_posix.py�__init__z_DupFd.__init__s �����c��|jSr r)rs r�detachz _DupFd.detachs���w�w�rN)�__name__� __module__�__qualname__rr�rrrrs���rrc�2��eZdZdZeZ�fd�Zd�Zd�Z�xZ S)r rc�2��g|_t�|� |�yr )�_fds�superr)r�process_obj� __class__s �rrzPopen.__init__s����� � ����%rc�<�|jj|�|Sr )r�appendrs r�duplicate_for_childzPopen.duplicate_for_child"s��� � ������ rc��ddlm}|j�}|jj |�tj|j�}tj�}t|� tj||�tj||�td�dx}x}x}} tj�\}}tj�\}} tj||��} |jj!||g�t#j$tj&�| |j�|_||_t-| dd��5}|j/|j1��ddd�g}|| fD]} | ��|j | ��t#j2|t"j4|�|_||fD]} | ��tj8| ��y#td�wxYw#1swY��xYw#g}|| fD]} | ��|j | ��t#j2|t"j4|�|_||fD]} | ��tj8| ��wxYw)Nr)�resource_tracker)� tracker_fd�pipe_handle�wbF)�closefd)�r%�getfdrr"r�get_preparation_data�_name�io�BytesIOrr�dump�os�pipe�get_command_line�extendr�spawnv_passfds�get_executable�pid�sentinel�open�write� getbuffer�Finalize� close_fds� finalizer�close)rrr%r&� prep_data�fp�parent_r�child_w�child_r�parent_w�cmd�f�fds_to_closers r�_launchz Popen._launch&s��&�%�+�+�-� �� � ����$��.�.�{�/@�/@�A� � �Z�Z�\���4� � %��N�N�9�b�)��N�N�;��+��t�$�26�6��6�7�6�W�x� !� "��� ��H�g� "��� ��G�X��(�(�J�5<�>�C��I�I���g�w�/�0��*�*�5�+?�+?�+A�+.�� � �;�D�H�$�D�M��h��e�4���������'�5��L���*���>� �'�'��+�+�"�]�]�4�����N�D�N���(���>��H�H�R�L�)��+ �t�$��5�4���L���*���>� �'�'��+�+�"�]�]�4�����N�D�N���(���>��H�H�R�L�)�s>�1,G3�1B/H� H�H�3 H�H�H�I;�AI;�#I;) rrr�methodr�DupFdrr#rI� __classcell__)r s@rr r s��� �F��E�&��"!r) r.r1�contextrrr*rrr�__all__�objectrr rrr�<module>rPs<�� � �2�����)���V��.!�J���.!rPK:W�\ũ�PP-__pycache__/popen_spawn_posix.cpython-312.pycnu�[���� T��h����ddlZddlZddlmZmZddlmZddlmZddlmZdgZ Gd�d e �ZGd �dej�Zy)�N�)� reduction�set_spawning_popen)� popen_fork)�spawn)�util�Popenc��eZdZd�Zd�Zy)�_DupFdc��||_y�N��fd��selfrs �:/usr/lib64/python3.12/multiprocessing/popen_spawn_posix.py�__init__z_DupFd.__init__s �����c��|jSr r)rs r�detachz _DupFd.detachs���w�w�rN)�__name__� __module__�__qualname__rr�rrrrs���rrc�2��eZdZdZeZ�fd�Zd�Zd�Z�xZ S)r rc�2��g|_t�|� |�yr )�_fds�superr)r�process_obj� __class__s �rrzPopen.__init__s����� � ����%rc�<�|jj|�|Sr )r�appendrs r�duplicate_for_childzPopen.duplicate_for_child"s��� � ������ rc��ddlm}|j�}|jj |�tj|j�}tj�}t|� tj||�tj||�td�dx}x}x}} tj�\}}tj�\}} tj||��} |jj!||g�t#j$tj&�| |j�|_||_t-| dd��5}|j/|j1��ddd�g}|| fD]} | ��|j | ��t#j2|t"j4|�|_||fD]} | ��tj8| ��y#td�wxYw#1swY��xYw#g}|| fD]} | ��|j | ��t#j2|t"j4|�|_||fD]} | ��tj8| ��wxYw)Nr)�resource_tracker)� tracker_fd�pipe_handle�wbF)�closefd)�r%�getfdrr"r�get_preparation_data�_name�io�BytesIOrr�dump�os�pipe�get_command_line�extendr�spawnv_passfds�get_executable�pid�sentinel�open�write� getbuffer�Finalize� close_fds� finalizer�close)rrr%r&� prep_data�fp�parent_r�child_w�child_r�parent_w�cmd�f�fds_to_closers r�_launchz Popen._launch&s��&�%�+�+�-� �� � ����$��.�.�{�/@�/@�A� � �Z�Z�\���4� � %��N�N�9�b�)��N�N�;��+��t�$�26�6��6�7�6�W�x� !� "��� ��H�g� "��� ��G�X��(�(�J�5<�>�C��I�I���g�w�/�0��*�*�5�+?�+?�+A�+.�� � �;�D�H�$�D�M��h��e�4���������'�5��L���*���>� �'�'��+�+�"�]�]�4�����N�D�N���(���>��H�H�R�L�)��+ �t�$��5�4���L���*���>� �'�'��+�+�"�]�]�4�����N�D�N���(���>��H�H�R�L�)�s>�1,G3�1B/H� H�H�3 H�H�H�I;�AI;�#I;) rrr�methodr�DupFdrr#rI� __classcell__)r s@rr r s��� �F��E�&��"!r) r.r1�contextrrr*rrr�__all__�objectrr rrr�<module>rPs<�� � �2�����)���V��.!�J���.!rPK:W�\�_� ��3__pycache__/popen_spawn_win32.cpython-312.opt-1.pycnu�[���� T��h���H�ddlZddlZddlZddlZddlZddlmZmZmZddl m Z ddl mZdgZdZ ejdk(xr eed d �Zej"j%�j'd�Zd�Zeej"ej,�Zd �ZGd�de�Zy)�N�)� reduction�get_spawning_popen�set_spawning_popen)�spawn)�util�Popeni�win32�frozenFzpythonservice.exec��||k(xs?tjj|�tjj|�k(S�N)�os�path�normcase)�p1�p2s �:/usr/lib64/python3.12/multiprocessing/popen_spawn_win32.py�_path_eqrs4�� ��8�C�r�w�w�'�'��+�r�w�w�/?�/?��/C�C�C�c�<�|D]}tj|��yr )�_winapi�CloseHandle)�handles�handles r�_close_handlesrs�������F�#�rc�>�eZdZdZdZd�Zd�Zd d�Zd�Zd�Z e Z d �Zy)r z@ Start a subprocess to run the code of a process object rc�d�tj|j�}tjdd�\}}tj|d�}tjtj�|��}tj�}trat|tj�rGtjx|d<}tj j#�}tj|d<nd}dj%d�|D��}t'|dd��5} tj(||ddd d|dd� \} }}} tj*|�||_d|_| |_t3| �|_t7j8|t:|j4t3|�f�|_t?|� tAjB|| �tAjB|| �t?d� ddd�y#tj*|��xYw#t?d�wxYw#1swYyxYw) Nr)� parent_pid�pipe_handle�__PYVENV_LAUNCHER__� c3�&K�|] }d|z���y�w)z"%s"N�)�.0�xs r� <genexpr>z!Popen.__init__.<locals>.<genexpr>Fs����/�3�a�v��z�3�s��wbT)�closefdF)"r�get_preparation_data�_namer� CreatePipe�msvcrt�open_osfhandle�get_command_liner�getpid�get_executable�WINENVr�sys� executable�_base_executable�environ�copy�join�open� CreateProcessr�pid� returncode�_handle�int�sentinelr�Finalizer� finalizerrr�dump)�self�process_obj� prep_data�rhandle�whandle�wfd�cmd� python_exe�env�to_child�hp�htr:�tids r�__init__zPopen.__init__-s����.�.�{�/@�/@�A� �#�-�-�d�A�6�����#�#�G�Q�/���$�$�� � ��18�:���)�)�+� ��h�z�3�>�>�:�"%�"6�"6�6�C��F�Z��*�*�/�/�#�C�),���C�%�&��C��h�h�/�3�/�/�� �#�t�T� *�h� �#*�#8�#8����$��q�#�t�T�$;� ��B��S��#�#�B�'��D�H�"�D�O��D�L���G�D�M�!�]�]�4��,0�M�M�3�w�<�+H�J�D�N� �t�$� )����y�(�3����{�H�5�"�4�(�3+� *�� ��#�#�G�,��� #�4�(��3+� *�s=�H&�7G;�A%H&�:,H�&H&�;H�H&� H#�#H&�&H/c�B�tj||j�Sr )r� duplicater>)rBrs r�duplicate_for_childzPopen.duplicate_for_childcs���"�"�6�4�=�=�9�9rNc��|j�|jS|�tj}ntdt |dzdz��}tj t |j�|�}|tjk(r@tj|j�}|tk(rtj}||_|jS)Nri�g�?)r;r�INFINITE�maxr=�WaitForSingleObjectr<� WAIT_OBJECT_0�GetExitCodeProcess� TERMINATE�signal�SIGTERM)rB�timeout�msecs�res�codes r�waitz Popen.waitgs����?�?�&��?�?�"��?��$�$�E���3�w��~��3�4�5�E��)�)�#�d�l�l�*;�U�C���'�'�'�'��-�-�d�l�l�;�D��y� ������"�D�O����rc�&�|jd��S)Nr)r\)r`�rBs r�pollz Popen.pollys���y�y��y�#�#rc��|j�y tjt|j�t �y#t$r?tjt|j��}|tjk(r�YywxYwr ) r;r�TerminateProcessr=r<rY�PermissionErrorrX�STILL_ACTIVE)rBr_s r� terminatezPopen.terminate|sm���?�?�&�� ��$�$�S����%6� �B��� ��-�-�c�$�,�,�.?�@�D��w�+�+�+��,� �s�-=�AB�Bc�$�|j�yr )r@rbs r�closezPopen.close�s�����rr )�__name__� __module__�__qualname__�__doc__�methodrOrRr`rcrh�killrjr#rrr r 's4����F�4)�l:��$$��$�D�r)rr,rZr2r�contextrrr�rr�__all__rY�platform�getattr�WINEXEr3�lower�endswith� WINSERVICErr4r1r�objectr r#rr�<module>r{s��� � � � ��F�F����)�� � � �,�,�'� !� C�g�c�8�U�&C�� �^�^� !� !� #� ,� ,�-@� A� �D��c�n�n�c�&:�&:� ;� ;��$�j�F�jrPK:W�\6|�@"@"1__pycache__/resource_sharer.cpython-312.opt-1.pycnu�[���� T��h���ddlZddlZddlZddlZddlZddlmZddlmZddlm Z dgZ ejdk(re dgz Z Gd �de�Z ne d gz Z Gd�d e�ZGd�d e�Ze�Zej"Zy)�N�)�process)� reduction)�util�stop�win32� DupSocketc��eZdZdZd�Zd�Zy)r zPicklable wrapper for a socket.c�z��|j���fd�}tj|�j�|_y)Nc�J���j|�}|j|�y�N)�share� send_bytes)�conn�pidr�new_socks ��8/usr/lib64/python3.12/multiprocessing/resource_sharer.py�sendz DupSocket.__init__.<locals>.sends��� ���s�+������&�)�dup�_resource_sharer�register�close�_id)�self�sockrrs @r�__init__zDupSocket.__init__s-����x�x�z�H� '�(�0�0��x�~�~�F�D�Hrc��tj|j�5}|j�}t j |�cddd�S#1swYyxYw)z1Get the socket. This should only be called once.N)r�get_connectionr� recv_bytes�socket� fromshare)rrrs r�detachzDupSocket.detach$s<��!�0�0����:�d����)���'�'��.�;�:�:�s�%A�AN��__name__� __module__�__qualname__�__doc__rr#�rrr r s��-� G� /r�DupFdc��eZdZdZd�Zd�Zy)r*z-Wrapper for fd which can be used at any time.c�z��tj|���fd�}�fd�}tj||�|_y)Nc�4��tj|�|�yr )r�send_handle)rr�new_fds �rrzDupFd.__init__.<locals>.send1s����%�%�d�F�C�8rc�0��tj��yr )�osr)r/s�rrzDupFd.__init__.<locals>.close3s������� r)r1rrrr)r�fdrrr/s @rrzDupFd.__init__/s.����V�V�B�Z�F� 9� !�'�0�0��u�=�D�Hrc��tj|j�5}tj|�cddd�S#1swYyxYw)z-Get the fd. This should only be called once.N)rrrr�recv_handle)rrs rr#zDupFd.detach7s0��!�0�0����:�d� �,�,�T�2�;�:�:�s �?�ANr$r)rrr*r*-s��;� >� 3rc�F�eZdZdZd�Zd�Zed��Zd d�Zd�Z d�Z d �Zy)�_ResourceSharerz.Manager for resources using background thread.c���d|_i|_tj�|_d|_d|_d|_tj|tj�y)Nr)�_key�_cache� threading�Lock�_lock� _listener�_address�_threadr�register_after_forkr6� _afterfork)rs rrz_ResourceSharer.__init__?sI���� �����^�^�%�� ������ ����� � ���'A�'A�Brc��|j5|j�|j�|xjdz c_||f|j|j<|j|jfcddd�S#1swYyxYw)z+Register resource, returning an identifier.Nr)r<r>�_startr8r9)rrrs rrz_ResourceSharer.registerHsY�� �Z�Z��}�}�$���� ��I�I��N�I�&*�E�]�D�K�K�� � �"��M�M�4�9�9�-��Z�Z�s�A$A;�;Bc��ddlm}|\}}||tj�j��}|j|t j�f�|S)z<Return connection from which to receive identified resource.r��Client��authkey)� connectionrFr�current_processrHrr1�getpid)�identrF�address�key�cs rrz_ResourceSharer.get_connectionQsG�� '������7�G�$;�$;�$=�$E�$E�F�� ����R�Y�Y�[�!�"��rNc��ddlm}|j5|j��||jt j �j��}|jd�|j�|jj|�|jj�rtjd�|jj�d|_ d|_d|_|jj!�D]\}\}}|��|jj#�ddd�y#1swYyxYw)z:Stop the background thread and clear registered resources.rrENrGz._ResourceSharer thread did not stop when asked)rIrFr<r>rrJrHrrr?�join�is_aliver�sub_warningr=r9�items�clear)r�timeoutrFrOrNrrs rrz_ResourceSharer.stopZs���&� �Z�Z��}�}�(��4�=�=�#*�#:�#:�#<�#D�#D�F�����t����� ����!�!�'�*��<�<�(�(�*��$�$�&;�<����$�$�&�#��� $�� �!%���*.�+�+�*;�*;�*=�&�C��$���G�+>����!�!�#�!�Z�Z�s�DD:�:Ec�:�|jj�D]\}\}}|��|jj�|jj �|j �|j j �d|_d|_d|_yr ) r9rTrUr<�_at_fork_reinitr=rr>r?)rrNrrs rrAz_ResourceSharer._afterforkosv��"&�+�+�"3�"3�"5��C��$���G�#6�������� � �"�"�$��>�>�%��N�N� � �"������ ���rc�B�ddlm}tjd�|t j �jd��|_|jj|_ tj|j��}d|_ |j�||_y)Nr)�Listenerz0starting listener and thread for sending handles�)rH�backlog)�targetT)rIrZr�debugrrJrHr=rMr>r:�Thread�_serve�daemon�startr?)rrZ�ts rrCz_ResourceSharer._startzsl��(�� � �E�F�!�'�*A�*A�*C�*K�*K�UX�Y������.�.�� ����D�K�K�0����� ��� ���rc�*�ttd�r6tjtjtj�� |j j �5}|j�}|� ddd�y|\}}|jj|�\}} |||�|� ddd��v#|�wxYw#1swY�xYw#tj�s$tjtj��Y�UxYw)N�pthread_sigmask)�hasattr�signalre� SIG_BLOCK� valid_signalsr=�accept�recvr9�popr� is_exiting�sys� excepthook�exc_info)rr�msgrN�destination_pidrrs rr`z_ResourceSharer._serve�s����6�,�-��"�"�6�#3�#3�V�5I�5I�5K�L�� 4��^�^�*�*�,���)�)�+�C��{��-�,�,/�(�C��"&�+�+�/�/�#�"6�K�D�%� ��T�?�3���-������-�,�� 4����(��N�N�C�L�L�N�3�sH� C�#C �7C�#C �$ B>�-C �5C�> C�C � C�C�:Dr )r%r&r'r(rr�staticmethodrrrArCr`r)rrr6r6=s8��8�C�.�����$�* � �4rr6)r1rgr!rnr:�r�contextrr�__all__�platform�objectr r*r6rrr)rr�<module>rys��� � � � ������(���<�<�7����}��G� /�F� /� ��y��G� 3�� 3� Y4�f�Y4�x#�$�����rPK:W�\2��P�P'__pycache__/synchronize.cpython-312.pycnu�[���� T��h�/���gd�ZddlZddlZddlZddlZddlZddlmZddlmZddlm Z ddlm Z mZe ed ��\ZZejj"ZGd �de�Z Gd�d e �ZGd�de�ZGd�de �ZGd�de �ZGd�de�ZGd�de�ZGd�dej2�Zy#e$r ed��wxYw))�Lock�RLock� Semaphore�BoundedSemaphore� Condition�Event�N�)�context)�process)�util)�SemLock� sem_unlinkz�This platform lacks a functioning sem_open implementation, therefore, the required synchronization primitives needed will not function, see issue 3770.�c�r�eZdZej�Zd�Zed��Zd�Z d�Z d�Zd�Zd�Z ed��Zy ) r c��|�tjj�}|j�dk(|_t jdk(xs|j}td�D]2} tj||||j�|�x}|_ntd��tjd|jz�|j!�t jdk7rd�}tj"||�|jj$�`ddlm} | |jj$d �tj*|tj,|jj$fd ��yy#t$rY��!wxYw)N�fork�win32�dzcannot find name for semaphorezcreated semlock with handle %sc�8�|jj�y�N)�_semlock�_after_fork)�objs �4/usr/lib64/python3.12/multiprocessing/synchronize.pyrz%SemLock.__init__.<locals>._after_forkGs�����(�(�*�r )�register� semaphorer)�exitpriority)r �_default_context�get_context�get_start_method�_is_fork_ctx�sys�platform�range�_multiprocessingr � _make_namer�FileExistsErrorr�debug�handle� _make_methods�register_after_fork�name�resource_trackerr�Finalize�_cleanup) �self�kind�value�maxvalue�ctx� unlink_now�i�slrrs r�__init__zSemLock.__init__2sI���;��*�*�6�6�8�C��0�0�2�f�<����\�\�W�,�A��0A�0A� ��s��A� �%5�%=�%=��%��4�?�?�+<��& � ��T�]���"�"B�C�C�� � �3�b�i�i�?�@������<�<�7�"� +��$�$�T�;�7��=�=���)� 3��T�]�]�'�'��5��M�M�$�� 0� 0�4�=�=�3E�3E�2G�'(� *� *��#� �� �s�).E:�: F�Fc�8�ddlm}t|�||d�y)Nr )� unregisterr)r.r;r)r-r;s rr0zSemLock._cleanupTs��0��4���4��%rc�p�|jj|_|jj|_yr)r�acquire�release�r1s rr+zSemLock._make_methodsZs$���}�}�,�,����}�}�,�,��rc�6�|jj�Sr)r� __enter__r?s rrAzSemLock.__enter__^s���}�}�&�&�(�(rc�4�|jj|�Sr)r�__exit__�r1�argss rrCzSemLock.__exit__as��%�t�}�}�%�%�t�,�,rc�T�tj|�|j}tjdk(r.tj �j |j�}n#|jrtd��|j}||j|j|jfS)Nrz�A SemLock created in a fork context is being shared with a process in a spawn context. This is not supported. Please use the same context to create multiprocessing objects and Process.) r �assert_spawningrr#r$�get_spawning_popen�duplicate_for_childr*r"�RuntimeErrorr2r4r-)r1r8�hs r�__getstate__zSemLock.__getstate__ds�������%� �]�]���<�<�7�"��*�*�,�@�@����K�A�� � �"�$J�K�K�� � �A��2�7�7�B�K�K����1�1rc��tjj|�|_t j d|dz�|j �d|_y)Nz recreated blocker with handle %rrF)r&r �_rebuildrrr)r+r"�r1�states r�__setstate__zSemLock.__setstate__rsD��(�0�0�9�9�5�A�� �� � �5��a��@�A�����!��rc�|�tj�jd�dttj ���S)N� semprefix�-)r�current_process�_config�nextr �_rand�rrr'zSemLock._make_nameys/��!�1�1�3�;�;�K�H��w�}�}�-�/� /rN)�__name__� __module__�__qualname__�tempfile�_RandomNameSequencerXr9�staticmethodr0r+rArCrLrQr'rYrrr r .sY��(�H�(�(�*�E� *�D�&��&� -�)�-�2�"��/��/rr c� �eZdZdd�Zd�Zd�Zy)rc�H�tj|t|t|��y�N�r5)r r9� SEMAPHORE� SEM_VALUE_MAX�r1r3r5s rr9zSemaphore.__init__�s������y�%��C�Hrc�6�|jj�Sr)r� _get_valuer?s r� get_valuezSemaphore.get_value�s���}�}�'�'�)�)rc�� |jj�}d|jj�d|�d�S#t$rd}Y�*wxYw)N�unknown�<�(value=�)>)rrh� Exception� __class__rZ�r1r3s r�__repr__zSemaphore.__repr__�sG�� ��M�M�,�,�.�E��$(�>�>�#:�#:�E�B�B��� ��E� �s�9�A�AN�r )rZr[r\r9rirrrYrrrr�s��I�*�Crrc��eZdZdd�Zd�Zy)rc�@�tj|t|||��yrb�r r9rdrfs rr9zBoundedSemaphore.__init__�s������y�%��C�@rc��� |jj�}d|jj�d|�d|jj �d�S#t$rd}Y�AwxYw)Nrkrlrmz, maxvalue=rn)rrhrorprZr4rqs rrrzBoundedSemaphore.__repr__�sY�� ��M�M�,�,�.�E�����'�'��� � �0F�0F�H� H��� ��E� �s�A�A�ANrs�rZr[r\r9rrrYrrrr�s��A�Hrrc��eZdZd�Zd�Zy)rc�@�tj|tdd|��y�Nr rcrv�r1r5s rr9z Lock.__init__�s������y�!�Q�C�8rc��� |jj�rdtj�j}tj�jdk7rd|dtj�jzz }n?|jj�sd}n"|jj�dkDrd}nd}d|jj�d |�d �S#t$rd}Y�*wxYw)N� MainThread�|�Noner�SomeOtherThread�SomeOtherProcessrkrlz(owner=rn)r�_is_minerrUr-� threading�current_thread�_is_zero�_countrorprZ)r1r-s rrrz Lock.__repr__�s��� ��}�}�%�%�'��.�.�0�5�5���+�+�-�2�2�l�B��C�)�":�":�"<�"A�"A�A�A�D��]�]�+�+�-������%�%�'�!�+�(��)���$(�>�>�#:�#:�D�A�A��� ��D� �s�B=C�C*�)C*NrxrYrrrr�s ��9�Brrc��eZdZd�Zd�Zy)rc�@�tj|tdd|��yr{)r r9�RECURSIVE_MUTEXr|s rr9zRLock.__init__�s��������1�#�>rc�,� |jj�r~tj�j}tj�jdk7r$|dtj�jzz }|jj�}nH|jj�sd\}}n(|jj�dkDrd\}}nd\}}d|jj�d |�d |�d�S#t$rd\}}Y�0wxYw)Nr~r)r�rr)r��nonzero)r�r�)rkrkrl�(�, rn)rr�rrUr-r�r�r�r�rorprZ)r1r-�counts rrrzRLock.__repr__�s��� /��}�}�%�%�'��.�.�0�5�5���+�+�-�2�2�l�B��C�)�":�":�"<�"A�"A�A�A�D�� � �,�,�.���]�]�+�+�-�'���e����%�%�'�!�+�:���e�;���e��"&���!8�!8�$��F�F��� /�.�K�D�%� /�s�C D�D�DNrxrYrrrr�s ��?�Grrc�V�eZdZd d�Zd�Zd�Zd�Zd�Zd�Zd�Z d d �Z dd �Zd�Zd d�Z y)rNc���|xs|j�|_|jd�|_|jd�|_|jd�|_|j �y�Nr)r�_lockr�_sleeping_count�_woken_count�_wait_semaphorer+)r1�lockr5s rr9zCondition.__init__�sS���(�S�Y�Y�[�� �"�}�}�Q�/����M�M�!�,���"�}�}�Q�/������rc��tj|�|j|j|j|j fSr)r rGr�r�r�r�r?s rrLzCondition.__getstate__�s:������%�� � �D�0�0��!�!�4�#7�#7�9� 9rc�Z�|\|_|_|_|_|j �yr)r�r�r�r�r+rOs rrQzCondition.__setstate__�s*��49� 2���T�)� � �D�0����rc�6�|jj�Sr)r�rAr?s rrAzCondition.__enter__�s���z�z�#�#�%�%rc�4�|jj|�Sr)r�rCrDs rrCzCondition.__exit__�s��"�t�z�z�"�"�D�)�)rc�p�|jj|_|jj|_yr)r�r=r>r?s rr+zCondition._make_methods�s$���z�z�)�)����z�z�)�)��rc�� |jjj�|jjj�z }d|j j�d|j�d|�d�S#t$rd}Y�7wxYw)Nrkrlr�r�rn)r�rrhr�rorprZr�)r1�num_waiterss rrrzCondition.__repr__�ss�� $��/�/�8�8�C�C�E��,�,�5�5�@�@�B�C�K��"&���!8�!8�$�*�*�k�R�R��� $�#�K� $�s�A A5�5B�Bc�|�|jjj�sJd��|jj �|jjj�}t |�D]}|jj �� |jjd|�|jj �t |�D]}|jj��S#|jj �t |�D]}|jj��wxYw)Nz,must acquire() condition before using wait()T) r�rr�r�r>r�r%r�r=r�)r1�timeoutr�r7s r�waitzCondition.wait�s����z�z�"�"�+�+�-� >�=� >�-� ���$�$�&�� � �#�#�*�*�,���u��A��J�J��� �� %��'�'�/�/��g�>� ���%�%�'��5�\��� � �"�"�$�"�� ���%�%�'��5�\��� � �"�"�$�"�s �C5�5AD;c���|jjj�sJd��|jj d�rJd��|j j d�r@|jj d�}|sJd��|j j d�r�@d}||kr[|jj d�r@|jj�|dz }||kr|jj d�r�@|rdt|�D]}|j j ��|jj d�r |jj d�r�yyy)Nzlock is not ownedFz<notify: Should not have been able to acquire _wait_semaphorez>notify: Bug in sleeping_count.acquire- res should not be Falserr ) r�rr�r�r=r�r�r>r%)r1�n�res�sleepersr7s r�notifyzCondition.notifysV���z�z�"�"�+�+�-�B�/B�B�-��'�'�/�/��� *�)� *�����'�'��.��&�&�.�.�u�5�C�� 8�7� 8�3����'�'��.� ����l�t�3�3�;�;�E�B�� � �(�(�*���M�H���l�t�3�3�;�;�E�B���8�_���!�!�)�)�+�%��&�&�.�.�u�5���&�&�.�.�u�5�rc�D�|jtj��y)N)r�)r�r#�maxsizer?s r� notify_allzCondition.notify_all/s�����c�k�k��"rc���|�}|r|S|�tj�|z}nd}d}|s<|�|tj�z }|dkr |S|j�|�}|s�<|Sr�)�time� monotonicr�)r1� predicater��result�endtime�waittimes r�wait_forzCondition.wait_for2s~�������M����n�n�&��0�G��G��H���"�"�T�^�^�%5�5���q�=��� � �I�I�h���[�F� �� rrrs)rZr[r\r9rLrQrArCr+rrr�r�r�r�rYrrrr�s:���9� � &�*�*�S�%�.�4#�rrc�2�eZdZd�Zd�Zd�Zd�Zdd�Zd�Zy) rc�x�|j|j��|_|jd�|_yr�)rr�_condr�_flagr|s rr9zEvent.__init__Js(���]�]�3�8�8�:�.�� ��]�]�1�%�� rc���|j5|jjd�r$|jj� ddd�y ddd�y#1swYyxYw�NFT)r�r�r=r>r?s r�is_setzEvent.is_setNsD�� �Z�Z��z�z�!�!�%�(�� � �"�"�$���Z�� �Z�Z�s�7A� A�A c���|j5|jjd�|jj�|jj �ddd�y#1swYyxYw�NF)r�r�r=r>r�r?s r�setz Event.setUsE�� �Z�Z��J�J���u�%��J�J��� ��J�J�!�!�#��Z�Z�s�AA&�&A/c�|�|j5|jjd�ddd�y#1swYyxYwr�)r�r�r=r?s r�clearzEvent.clear[s%�� �Z�Z��J�J���u�%��Z�Z�s�2�;Nc�h�|j5|jjd�r|jj�n|jj |�|jjd�r$|jj� ddd�y ddd�y#1swYyxYwr�)r�r�r=r>r�)r1r�s rr�z Event.wait_sv�� �Z�Z��z�z�!�!�%�(�� � �"�"�$�� � ����(��z�z�!�!�%�(�� � �"�"�$���Z���Z�Z�s�BB(�B(�(B1c�|�|j�rdnd}dt|�j�dt|�d�d|�d�S)Nr��unsetrlz at z#x� �>)r��typer\�id)r1� set_statuss rrrzEvent.__repr__ks=��"�k�k�m�U�� ��4��:�*�*�+�4��4���}�A�j�\��K�Krr) rZr[r\r9r�r�r�r�rrrYrrrrHs!��&��$�&� �Lrrc��eZdZd d�Zd�Zd�Zed��Zejd��Zed��Z e jd��Z y) �BarrierNc��ddl}ddlm}||jd�dz�}|j �}|j|||||f�d|_d|_y)Nrr )� BufferWrapperr7r)�struct�heapr��calcsizerrQ�_stater�) r1�parties�actionr�r5r�r��wrapper�conds rr9zBarrier.__init__tsR���'������ 4�q� 8�9���}�}������7�F�G�T�7�C�D������rc��|\|_|_|_|_|_|jj�j d�|_y)Nr7)�_parties�_action�_timeoutr��_wrapper�create_memoryview�cast�_arrayrOs rrQzBarrier.__setstate__}s>��&+� $�����d�m� ��T�]��m�m�5�5�7�<�<�S�A��rc�t�|j|j|j|j|jfSr)r�r�r�r�r�r?s rrLzBarrier.__getstate__�s,��� � �t�|�|�T�]�]�� � �D�M�M�+� +rc� �|jdSr��r�r?s rr�zBarrier._state�����{�{�1�~�rc�"�||jd<yr�r�rqs rr�zBarrier._state��������A�rc� �|jdS�Nr r�r?s rr�zBarrier._count�r�rc�"�||jd<yr�r�rqs rr�zBarrier._count�r�r)NN) rZr[r\r9rQrL�propertyr��setterr�rYrrr�r�rsj���B� +������]�]���������]�]���rr�)�__all__r�r#r]r&r��r rrr r�ImportError�listr%r�rdre�objectrrrrrrr�rYrr�<module>r�s������ ������� 4�4�"�%��(�^���� �(�(�6�6� �N/�f�N/�h C�� C�&H�y�H�"B�7�B�2G�G�G�4i��i�^%L�F�%L�T"�i���"��k �4� �3�4�4�4�s�B>�>CPK:W�\j6�6��*__pycache__/__init__.cpython-312.opt-1.pycnu�[���� T��h����ddlZddlmZeej�D�cgc]}|jd�r�|��c}Ze�jd�eD��dZ dZ dejvrejdejd <yycc}w) �N�)�context�_c#�TK�|] }|ttj|�f���"y�w)N)�getattrr�_default_context)�.0�names �1/usr/lib64/python3.12/multiprocessing/__init__.py� <genexpr>rs#����U�W�T�$��� 8� 8�$�?�@�W�s�&(���__main__�__mp_main__)�sys�r�dirr� startswith�__all__�globals�update�SUBDEBUG� SUBWARNING�modules)�xs0r�<module>rs������'�2�2�3� M�3��1�<�<��;L�1�3� M��� ���U�W�U�U� �� � ������!$���Z�!8�C�K�K� ����Ns �B �B PK:W�\j6�6��*__pycache__/__init__.cpython-312.opt-2.pycnu�[���� T��h����ddlZddlmZeej�D�cgc]}|jd�r�|��c}Ze�jd�eD��dZ dZ dejvrejdejd <yycc}w) �N�)�context�_c#�TK�|] }|ttj|�f���"y�w)N)�getattrr�_default_context)�.0�names �1/usr/lib64/python3.12/multiprocessing/__init__.py� <genexpr>rs#����U�W�T�$��� 8� 8�$�?�@�W�s�&(���__main__�__mp_main__)�sys�r�dirr� startswith�__all__�globals�update�SUBDEBUG� SUBWARNING�modules)�xs0r�<module>rs������'�2�2�3� M�3��1�<�<��;L�1�3� M��� ���U�W�U�U� �� � ������!$���Z�!8�C�K�K� ����Ns �B �B PK:W�\j6�6��$__pycache__/__init__.cpython-312.pycnu�[���� T��h����ddlZddlmZeej�D�cgc]}|jd�r�|��c}Ze�jd�eD��dZ dZ dejvrejdejd <yycc}w) �N�)�context�_c#�TK�|] }|ttj|�f���"y�w)N)�getattrr�_default_context)�.0�names �1/usr/lib64/python3.12/multiprocessing/__init__.py� <genexpr>rs#����U�W�T�$��� 8� 8�$�?�@�W�s�&(���__main__�__mp_main__)�sys�r�dirr� startswith�__all__�globals�update�SUBDEBUG� SUBWARNING�modules)�xs0r�<module>rs������'�2�2�3� M�3��1�<�<��;L�1�3� M��� ���U�W�U�U� �� � ������!$���Z�!8�C�K�K� ����Ns �B �B PK:W�\��w7�7�,__pycache__/connection.cpython-312.opt-1.pycnu�[���� T��h�����gd�ZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddlmZddlm Z mZddlmZej"Z ddlZddlmZmZmZmZd Zd Ze j8�ZdZdgZe ed�rdZedgz Zej2dk(rd Zed gz Zefd�Z!d�Z"d�Z#d�Z$d�Z%Gd�d�Z&erGd�de&�Z'Gd�de&�Z(Gd�de)�Z*dCd�Z+ej2dk7rdDd�Z,ndDd�Z,Gd�de)�Z-d �Z.ej2dk(rGd!�d"e)�Z/d#�Z0d$Z1d%Z2d&Z3d'Z4e5hd(��Z6e7d)�e6D��Z8d*Z9d+Z:e9e:fZ;d,�Z<d-�Z=d.�Z>dEd/e?fd0�Z@d/e?fd1�ZAGd2�d3e)�ZBd4�ZCd5�ZDGd6�d7e*�ZEd8�ZFej2dk(r d9�ZGej�ej�hZJdFd:�ZKn*ddlLZLe eLd;�r eLj�ZNneLj�ZNdFd<�ZKej2dk(r3d=�ZPd>�ZQej�e(eP�d?�ZSd@�ZTej�e'eS�ydA�ZPdB�ZQej�e(eP�y#e$rej2dk(r�dZY���wxYw)G)�Client�Listener�Pipe�wait�N�)�util)�AuthenticationError�BufferTooShort)� reduction)� WAIT_OBJECT_0�WAIT_ABANDONED_0�WAIT_TIMEOUT�INFINITE�win32i g4@�AF_INET�AF_UNIX�AF_PIPEc�0�tj�|zS�N��time� monotonic)�timeouts �3/usr/lib64/python3.12/multiprocessing/connection.py� _init_timeoutr<s���>�>��g�%�%�c�0�tj�|kDSrr)�ts r�_check_timeoutr?s���>�>��a��rc��|dk(ry|dk(r)tjdtj���S|dk(r;tjdt j �t t�fzd��Std ��) z? Return an arbitrary free address for the given family r)� localhostrrz listener-)�prefix�dirrz\\.\pipe\pyc-%d-%d-�zunrecognized family) �tempfile�mktempr�get_temp_dir�os�getpid�next� _mmap_counter� ValueError��familys r�arbitrary_addressr/Fsy������ �9� ����k�t�7H�7H�7J�K�K� �9� ����&<� "� � ��T�-�-@�A�'B�GI�K� K��.�/�/rc��tjdk7r|dk(rtd|z��tjdk(r%|dk(rtt|�std|z��yyy)zD Checks if the family is valid for the current environment. rrzFamily %s is not recognized.rN)�sys�platformr,�hasattr�socketr-s r�_validate_familyr5Tsc���|�|�w��6�Y�#6��7�&�@�A�A� �|�|�w��6�Y�#6��v�v�&��;�f�D�E�E�'�$7�rc���t|�tk(ryt|�tur|jd�ryt|�tust j |�ryt d|z��)z] Return the types of the address This can be 'AF_INET', 'AF_UNIX', or 'AF_PIPE' rz\\rrzaddress type of %r unrecognized)�type�tuple�str� startswithr�is_abstract_socket_namespacer,)�addresss r�address_typer=`s\���G�}���� �g��#� �'�"4�"4�V�"<�� �g��#� ��!B�!B�7�!K���:�W�D�E�Erc��eZdZdZdd�Zd�Zd�Zd�Zd�Zd�Z e d��Ze d ��Ze d ��Z d�Zd�Zdd �Zd�Zdd�Zdd�Zd�Zdd�Zd�Zd�Zy)�_ConnectionBaseNc��|j�}|dkrtd��|s |std��||_||_||_y)Nrzinvalid handlez6at least one of `readable` and `writable` must be True)� __index__r,�_handle� _readable� _writable)�self�handle�readable�writables r�__init__z_ConnectionBase.__init__vsO���!�!�#���A�:��-�.�.����H�J� J����!���!��rc�>�|j�|j�yyr�rB�_close�rEs r�__del__z_ConnectionBase.__del__�s���<�<�#��K�K�M�$rc�2�|j�td��y)N�handle is closed)rB�OSErrorrMs r� _check_closedz_ConnectionBase._check_closed�s���<�<���,�-�-� rc�2�|jstd��y)Nzconnection is write-only)rCrQrMs r�_check_readablez_ConnectionBase._check_readable�s���~�~��4�5�5�rc�2�|jstd��y)Nzconnection is read-only)rDrQrMs r�_check_writablez_ConnectionBase._check_writable�s���~�~��3�4�4�rc�t�|jrd|_td��|j�td��)NFzbad message length)rDrC�closerQrMs r�_bad_message_lengthz#_ConnectionBase._bad_message_length�s5���>�>�"�D�N��*�+�+� �J�J�L��*�+�+rc��|jduS)z True if the connection is closedN�rBrMs r�closedz_ConnectionBase.closed�s���|�|�t�#�#rc��|jS)z"True if the connection is readable)rCrMs rrGz_ConnectionBase.readable�����~�~�rc��|jS)z"True if the connection is writable)rDrMs rrHz_ConnectionBase.writable�r^rc�:�|j�|jS)z+File descriptor or handle of the connection)rRrBrMs r�filenoz_ConnectionBase.fileno�s�������|�|�rc�f�|j� |j�d|_yy#d|_wxYw)zClose the connectionNrKrMs rrXz_ConnectionBase.close�s1���<�<�#� $���� �#��� $�� $���s�'� 0c�v�|j�|j�t|�}|jdkDr|j d�}|j }|dkrt d��||krt d��|�||z }n#|dkrt d��||z|kDrt d��|j||||z�y) z,Send the bytes data from a bytes-like objectr�Brzoffset is negativezbuffer length < offsetNzsize is negativezbuffer length < offset + size)rRrV� memoryview�itemsize�cast�nbytesr,�_send_bytes)rE�buf�offset�size�m�ns r� send_bytesz_ConnectionBase.send_bytes�s������������s�O���:�:��>����s��A� �H�H���A�:��1�2�2��v�:��5�6�6��<��v�:�D� �A�X��/�0�0� �d�]�Q� ��<�=�=�����6�&�4�-�0�1rc��|j�|j�|jtj |��y)zSend a (picklable) objectN)rRrVri�_ForkingPickler�dumps�rE�objs r�sendz_ConnectionBase.send�s3��������������.�.�s�3�4rc���|j�|j�|�|dkrtd��|j|�}|�|j �|j�S)z7 Receive bytes data as a bytes object. rznegative maxlength)rRrTr,�_recv_bytesrY�getvalue)rE� maxlengthrjs r� recv_bytesz_ConnectionBase.recv_bytes�sa�� ��������� �Y��]��1�2�2����y�)���;��$�$�&��|�|�~�rc���|j�|j�t|�5}|j}|t |�z}|dkrtd��||kDrtd��|j �}|j�}|||zkrt|j���|jd�|j|||z||z|z�|cddd�S#1swYyxYw)zq Receive bytes data into a writeable bytes-like object. Return the number of bytes read. rznegative offsetzoffset too largeN)rRrTrerf�lenr,rw�tellr rx�seek�readinto)rErjrkrmrf�bytesize�resultrls r�recv_bytes_intoz_ConnectionBase.recv_bytes_into�s��� �������� ��_���z�z�H��#�a�&�(�H���z� �!2�3�3��(�"� �!3�4�4��%�%�'�F��;�;�=�D��&�4�-�'�$�V�_�_�%6�7�7��K�K��N��O�O�A�f��0�%��}��9�;� <��!�_�_�s�B+C!�!C*c��|j�|j�|j�}tj |j��S)zReceive a (picklable) object)rRrTrwrq�loads� getbuffer)rErjs r�recvz_ConnectionBase.recv�s?������������� ���$�$�S�]�]�_�5�5rc�d�|j�|j�|j|�S)z/Whether there is any input available to be read)rRrT�_poll�rErs r�pollz_ConnectionBase.poll�s)�����������z�z�'�"�"rc��|Sr�rMs r� __enter__z_ConnectionBase.__enter__����rc�$�|j�yr�rX�rE�exc_type� exc_value�exc_tbs r�__exit__z_ConnectionBase.__exit__���� � �r)TT)rNr)r)g)�__name__� __module__�__qualname__rBrIrNrRrTrVrY�propertyr\rGrHrarXrorurzr�r�r�r�r�r�rrr?r?ss����G� "��.�6�5�,��$��$���������� $�2�(5���26�#��rr?c�P�eZdZdZdZdZejfd�Zd�Z d d�Z d�Zd�Zy) �PipeConnectionz� Connection class based on a Windows named pipe. Overlapped I/O is used, so the handles must have been created with FILE_FLAG_OVERLAPPED. FNc�d�|j}|�|j�||j�yr)�_send_ov�cancelrB)rE�_CloseHandle�ovs rrLzPipeConnection._closes%�����B��~�� � ������&rc��|j�td��tj|j|d��\}}||_ |tj k(r&tj|jgdt�}d|_|jd�\}}|tjk(rttjd��y#|j��xYw#d|_|jd�\}}wxYw)Nz/concurrent send_bytes() calls are not supportedT�� overlappedFrP)r�r,�_winapi� WriteFilerB�ERROR_IO_PENDING�WaitForMultipleObjects�eventrr��GetOverlappedResult�ERROR_OPERATION_ABORTEDrQ�errno�EPIPE)rErjr��err�waitres�nwrittens rrizPipeConnection._send_bytess����}�}�(� �"5�6�6��'�'����c�d�K�G�B���D�M� =��'�2�2�2�%�<�<���� �E�8�5�G�!%�� � "� 6� 6�t� <� ��#��g�5�5�5��e�k�k�+=�>�>� 6�� �� � ���� $�� � "� 6� 6�t� <� ��#�s�9C�C�C�C:c���|jrd|_tj�S|�dnt|d�} t j |j|d��\}} |tjk(r&t j|jgdt�}|jd�\}}|dk(r5tj�}|j|j��|S|tjk(r|j!||�S t+d��#|j��xYw#|jd�\}}|dk(r9tj�}|j|j��|ccYS|tjk(r|j!||�ccYSwxYw#t"$r)}|j$tj&k(rt(��d}~wwxYw)NF�Tr�rz.shouldn't get here; expected KeyboardInterrupt)�_got_empty_message�io�BytesIO�minr��ReadFilerBr�r�r�rr�r��writer��ERROR_MORE_DATA�_get_more_datarQ�winerror�ERROR_BROKEN_PIPE�EOFError�RuntimeError) rE�maxsize�bsizer�r�r��nread�f�es rrwzPipeConnection._recv_bytes6s����&�&�*/��'��z�z�|�#�&���C���4E���%�.�.�t�|�|�U�;?�A�G�B��D��'�":�":�:�&-�&D�&D�!#��� �E�8�'=�G�&(�%;�%;�D�%A� ��s��!�8� "� � ��A��G�G�B�L�L�N�3�#$�H� �G�$;�$;�;�#'�#6�#6�r�7�#C�C�<��O�P�P��!�� � ����%'�%;�%;�D�%A� ��s��!�8� "� � ��A��G�G�B�L�L�N�3�#$�H� �G�$;�$;�;�#'�#6�#6�r�7�#C�C�<�����z�z�W�%>�%>�>�&���� �s[�%F-�9D�A F-�&$F-�D*�*D-�-AF*�>F-�'F*�'F-�)F*�*F-�- G�6$G�Gc��|js%tj|j�ddk7ryt t|g|��S)NrT)r�r�� PeekNamedPiperB�boolrr�s rr�zPipeConnection._pollVs>���'�'��-�-�d�l�l�;�A�>�!�C����d�V�W�-�.�.rc��|j�}tj�}|j|�t j |j�d}|�!t|�|z|kDr|j�t j|j|d��\}}|jd�\}}|j|j��|S)NrTr�)r�r�r�r�r�r�rBr|rYr�r�)rEr�r�rjr��leftr��rbytess rr�zPipeConnection._get_more_data\s����,�,�.�C�� � ��A� �G�G�C�L��(�(����6�q�9�D��"�s�3�x�$���'@��(�(�*��&�&�t�|�|�T�d�K�G�B���0�0��6�K�F�C� �G�G�B�L�L�N�#��Hrr) r�r�r��__doc__r�r�r��CloseHandlerLrirwr�r�r�rrr�r�s8�� � #����&-�&9�&9� '� (�4 Q�@ /� rr�c���eZdZdZer(ejfd�ZejZ ejZn'ejfd�ZejZ ejZe fd�Zefd�Zd�Zd d�Zd �Zy)� Connectionzo Connection class based on an arbitrary file descriptor (Unix only), or a socket handle (Windows). c�(�||j�yrr[�rErLs rrLzConnection._closes����4�<�<� rc�(�||j�yrr[r�s rrLzConnection._closexr�rc�b�t|�} ||j|�}||z}|dk(ry||d}�$�Nr)r|rB)rErjr�� remainingrns r�_sendzConnection._send}sA����H� ���d�l�l�C�(�A���N�I��A�~���a�b�'�C�rc���tj�}|j}|}|dkDrK|||�}t|�}|dk(r||k(rt�td��|j |�||z}|dkDr�K|S)Nrzgot end of file during message)r�r�rBr|r�rQr�)rErl�readrjrFr��chunkrns r�_recvzConnection._recv�s|���j�j�l������� ��!�m����+�E��E� �A��A�v���$�"�N�!�"B�C�C��I�I�e����N�I��!�m�� rc��t|�}|dkDr`tjdd�}tjd|�}|j|�|j|�|j|�ytjd|�}|dkDr#|j|�|j|�y|j||z�y)Ni����!i����!Qi@)r|�struct�packr�)rErjrn� pre_header�headers rrizConnection._send_bytes�s�����H���z�>����T�2�.�J��[�[��q�)�F��J�J�z�"��J�J�v���J�J�s�O��[�[��q�)�F��5�y�� � �6�"�� � �3��� � �6�C�<�(rNc��|jd�}tjd|j��\}|dk(r7|jd�}tjd|j��\}|�||kDry|j|�S)N�r�r��r�)r�r��unpackrx)rEr�rjrls rrwzConnection._recv_bytes�sq���j�j��m��� � �d�C�L�L�N�3����2�:��*�*�Q�-�C��M�M�$�����7�E�D���4�'�>���z�z�$��rc�2�t|g|�}t|�Sr)rr�)rEr�rs rr�zConnection._poll�s���$���!���A�w�rr)r�r�r�r�r��_multiprocessing�closesocketrLru�_writer��_readr(rXr�r�r�r�rirwr�r�rrr�r�lso��� � 0� <� <� !�!�&�&�� �%�%�� "��� !���������%�� %�� )�. �rr�c�P�eZdZdZd d�Zd�Zd�Zed��Zed��Z d�Z d �Zy)rz� Returns a listener object. This is a wrapper for a bound socket which is 'listening' for connections, or for a Windows named pipe. Nc��|xs|xrt|�xst}|xst|�}t|�|dk(rt ||�|_nt |||�|_|�t|t�std��||_ y)Nr�authkey should be a byte string)r=�default_familyr/r5�PipeListener� _listener�SocketListener� isinstance�bytes� TypeError�_authkey)rEr<r.�backlog�authkeys rrIzListener.__init__�s����#�G�=��W�(=�#�"� ��6�.�v�6���� ��Y��)�'�7�;�D�N�+�G�V�W�E�D�N���z�'�5�'A��=�>�>��� rc���|j�td��|jj�}|j�,t ||j�t||j�|S)zz Accept a connection on the bound socket or named pipe of `self`. Returns a `Connection` object. zlistener is closed)r�rQ�acceptr��deliver_challenge�answer_challenge)rE�cs rr�zListener.accept�sW���>�>�!��.�/�/��N�N�!�!�#���=�=�$��a����/��Q�� � �.��rc�P�|j}|�d|_|j�yy)zA Close the bound socket or named pipe of `self`. N)r�rX)rE�listeners rrXzListener.close�s)���>�>����!�D�N��N�N�� rc�.�|jjSr)r��_addressrMs rr<zListener.address�s���~�~�&�&�&rc�.�|jjSr)r��_last_acceptedrMs r� last_acceptedzListener.last_accepted�s���~�~�,�,�,rc��|Srr�rMs rr�zListener.__enter__�r�rc�$�|j�yrr�r�s rr�zListener.__exit__�r�r)NNrN)r�r�r�r�rIr�rXr�r<rr�r�r�rrrr�sH��� � ���'��'��-��-��rrc���|xst|�}t|�|dk(rt|�}nt|�}|�t |t �st d��|�t||�t||�|S)z= Returns a connection to the address of a `Listener` rr�) r=r5� PipeClient�SocketClientr�r�r�r�r�)r<r.r�r�s rrr�sq��� ,�|�G�,�F��V�� ����w�����!����:�g�u�#=��9�:�:�����G�$��!�W�%��Hrc�N�|rotj�\}}|jd�|jd�t|j ��}t|j ��}||fStj�\}}t|d��}t|d��}||fS)�L Returns pair of connection objects at either end of a pipe TF�rH�rG)r4� socketpair�setblockingr��detachr(�pipe)�duplex�s1�s2�c1�c2�fd1�fd2s rrrs�����&�&�(�F�B���N�N�4� ��N�N�4� ��B�I�I�K�(�B��B�I�I�K�(�B��2�v� � �w�w�y�H�C���C�%�0�B��C�%�0�B��2�v� rc ��td�}|r>tj}tjtjz}t t }}n(tj}tj}dt }}tj||tjztjztjtjztjzd||tjtj�}tj||dtjtj tjtj�}tj"|tjdd�tj$|d��}|j'd�\} } t)||��}t)||��}||fS) rrrrNTr�rr )r/r��PIPE_ACCESS_DUPLEX�GENERIC_READ� GENERIC_WRITE�BUFSIZE�PIPE_ACCESS_INBOUND�CreateNamedPipe�FILE_FLAG_OVERLAPPED�FILE_FLAG_FIRST_PIPE_INSTANCE�PIPE_TYPE_MESSAGE�PIPE_READMODE_MESSAGE� PIPE_WAIT�NMPWAIT_WAIT_FOREVER�NULL� CreateFile� OPEN_EXISTING�SetNamedPipeHandleState�ConnectNamedPiper�r�) rr<�openmode�access�obsize�ibsize�h1�h2r��_r�rrs rrr(s`��$�I�.����1�1�H��)�)�G�,A�,A�A�F�$�g�F�F��2�2�H��*�*�F���F�F� � $� $��X�� <� <�<��1�1�2��%�%��(E�(E�E���� � �v�v�w�;�;��L�L���� � ��V�Q����g�.C�.C��(�(�'�,�,��� �'�'���-�-�t�T� ��-�-�b�T�B� ��/�/��5���3��B�� 0�� �B�� 0���2�v� rc�$�eZdZdZdd�Zd�Zd�Zy)r�zO Representation of a socket which is bound to an address and listening c���tjtt|��|_ tjdk(r9|jjtjtjd�|jjd�|jj|�|jj|�|jj�|_||_d|_|dk(rCt#j$|�s.t#j&|tj(|fd��|_yd|_y#t$r|jj��wxYw)N�posixrTrr��args�exitpriority)r4�getattr�_socketr(�name� setsockopt� SOL_SOCKET�SO_REUSEADDRr�bind�listen�getsocknamerrQrX�_familyrrr;�Finalize�unlink�_unlink)rEr<r.r�s rrIzSocketListener.__init__Xs���}�}�W�V�V�%<�=��� ��w�w�'�!����'�'��(9�(9�(.�(;�(;�Q�@��L�L�$�$�T�*��L�L���g�&��L�L����(� �L�L�4�4�6�D�M����"����Y��t�'H�'H��'Q��=�=��b�i�i�w�j�q��D�L� �D�L��� ��L�L��� �� �s�B<E�%E)c��|jj�\}|_|jd�t |j��S)NT)r9r�rrr�r�rE�ss rr�zSocketListener.acceptqs9��!%���!4�!4�!6���4�� � � �d���!�(�(�*�%�%rc�� |jj�|j}|�d|_|�yy#|j}|�d|_|�wwxYwr)r9rXrD)rErCs rrXzSocketListener.closevs[�� ��L�L��� ��\�\�F��!�#�����"���\�\�F��!�#�����"�s �:�AN)r)r�r�r�r�rIr�rXr�rrr�r�Ts��� �2&� rr�c��t|�}tjtt|��5}|jd�|j |�t|j ��cddd�S#1swYyxYw)zO Return a connection object connected to the socket given by `address` TN)r=r4r8r�connectr�r)r<r.rGs rr r �sU���'� "�F� ������/� 1�Q� � � �d�� � � �'���!�(�(�*�%� 2� 1� 1�s�;A4�4A=c�6�eZdZdZdd�Zdd�Zd�Zed��Zy) r�z0 Representation of a named pipe Nc��||_|jd��g|_d|_t j d|j�t j|tj|j|jfd��|_ y)NT)�firstz listener created with address=%rrr5) r�_new_handle� _handle_queuerr� sub_debugrBr��_finalize_pipe_listenerrX)rEr<r�s rrIzPipeListener.__init__�sl��#�D�M�"&�"2�"2��"2�">�!?�D��"&�D���N�N�=�t�}�}�M�����l�:�:��(�(�$�-�-�8�q��D�Jrc �~�tjtjz}|r|tjz}tj|j |tjtjztjztjtttjtj�Sr) r�rr r!rrr"r#r$�PIPE_UNLIMITED_INSTANCESrr%r&)rErM�flagss rrNzPipeListener._new_handle�s����.�.��1M�1M�M�E����>�>�>���*�*�� � �u��)�)�G�,I�,I�I��!�!�"��0�0�'�7��,�,�g�l�l�� rc�L�|jj|j��|jjd�} t j |d��} t j|jgdt�} |jd�\}}t|�S#|j�t j|��xYw#|jd�\}}wxYw#t$r2}|jtjk7r�Yd}~t|�Sd}~wwxYw)NrTr�F)rO�appendrN�popr�r*r�r�rr�r�r�rQr�� ERROR_NO_DATAr�)rErFr��resr1r�r�s rr�zPipeListener.accept�s������%�%�d�&6�&6�&8�9��'�'�+�+�A�.�F� $��-�-�f��F�� $�!�8�8���� �E�8�5�C� �3�3�D�9�F�A�s�!�&�)�)����I�I�K��'�'��/����3�3�D�9�F�A�s��� ��:�:��!6�!6�6��7�"�&�)�)��! �s0�C(�&B$�$(C�C�C%�( D#�1D�D#c�h�tjd|�|D]}tj|��y)Nz closing listener with address=%r)rrPr�r�)�queuer<rFs rrQz$PipeListener._finalize_pipe_listener�s)���N�N�=�w�G����#�#�F�+� rr)F) r�r�r�r�rIrNr��staticmethodrQr�rrr�r��s*�� � � � *�. � ,� � ,rr�c �.�t�} tj|d�tj|tjtj zdtjtjtjtj�} tj|tjdd�t!|�S#t$rB}|jtjtjfvst|�r�Yd}~nd}~wwxYw��)zU Return a connection object connected to the pipe given by `address` ��rN)rr�� WaitNamedPiper'rrr&r(r rQr��ERROR_SEM_TIMEOUT�ERROR_PIPE_BUSYrr)r#r�)r<r�hr�s rrr�s��� �O��� ��%�%�g�t�4��&�&��W�1�1�G�4I�4I�I��w�|�|�W�%:�%:��0�0�'�,�,���� �'�'� �w�,�,�d�D� ��a� � ��� ��:�:�g�&?�&?�&-�&=�&=�&?�?�BP�QR�BS��CT�� ��s�BC� D�8D � D�(s#CHALLENGE#s #WELCOME#s #FAILURE#>�md5�sha256�sha384�sha3_256�sha3_384c#�2K�|]}t|����y�wr)r|)�.0r1s r� <genexpr>rkFs����7�&6��c�!�f�&6�s���c��t|�tvrd|fS|jd�rG|jddtdz�x}dkDr(|d|}|t vr||dzd}|j d�|fStd |����) aReturns a digest name and the payload for a response hash. If a legacy protocol is detected based on the message length or contents the digest name returned will be empty to indicate legacy mode where MD5 and no digest prefix should be sent. r$�{�}r�rN�asciizRunsupported message length, missing digest prefix, or unsupported digest: message=)r|�_LEGACY_LENGTHSr:�find�_MAX_DIGEST_LEN�_ALLOWED_DIGESTS�decoder )�message�curly�digest�payloads r�_get_digest_name_and_payloadr|Qs����7�|��&� �7�{�����4� ��,�,�t�Q���(9�:� :��a�?���5�!���%�%��e�A�g�h�'�G��=�=��)�7�2�2� � /�&-�Z� 1�2�2rc��ddl}t|�d}|s" |j||d�j�S|j|||�j�}d|jd�|fzS#t$rd}Y�DwxYw)a�Create a MAC based on authkey and message The MAC algorithm defaults to HMAC-MD5, unless MD5 is not available or the message has a '{digest_name}' prefix. For legacy HMAC-MD5, the response is the raw MAC, otherwise the response is prefixed with '{digest_name}', e.g. b'{sha256}abcdefg...' Note: The MAC protects the entire message including the digest_name prefix. rN�md5�sha256�{%s}%srr)�hmacr|�newrzr,�encode)r�rxr��digest_name�responses r�_create_responser�ks����.�w�7��:�K�� #��8�8�G�W�e�4�;�;�=�=��x�x���+�6�=�=�?�H���*�*�7�3�X�>�>�>��� #�#�K� #�s� A.�.A<�;A<c �d�ddl}t|�\}}|xsd} |j|||�j�}t |�t |�k7r&td|�dt |��dt |�����|j||�std ��y#t$rtd|�d���wxYw) a`Verify MAC challenge If our message did not include a digest_name prefix, the client is allowed to select a stronger digest_name from _ALLOWED_DIGESTS. In case our message is prefixed, a client cannot downgrade to a weaker algorithm, because the MAC is calculated over the entire message including the '{digest_name}' prefix. rNr~zresponse_digest=z unsupportedz expected z of length z got zdigest received was wrong)r�r|r�rzr,r r|�compare_digest)r�rxr�r��response_digest�response_mac�expecteds r�_verify_challenger��s����$@��$J�!�O�\�%�.��O�E��8�8�G�W�o�>�E�E�G���8�}��L�)�)�!��O�.�k�#�h�-��I��<�(�)�+�,� ,����x��6�!�"=�>�>�7�� �E�!�%5�_�$6�l�"C�D�D�E�s�!B�B/r�c��t|t�s#tdjt |����tjt�}d|jd�|fz}|jt|z�|jd�} t|||�|jt�y#t$r|jt��wxYw)N� Authkey must be bytes, not {0!s}r�rr�)r�r�r,�formatr7r(�urandom�MESSAGE_LENGTHr�ro� _CHALLENGErzr��_WELCOMEr �_FAILURE)� connectionr�r�rxr�s rr�r��s����g�u�%��.�5�5�d�7�m�D�F� F��j�j��(�G��;�-�-�g�6��@�@�G����*�w�.�/��$�$�S�)�H�(��'�7�H�5� ���h�'�� �����h�'� ��s� B0�0 Cc���t|t�s#tdjt |����|jd�}|j t�std|����|tt�d}t|�tkrtdt|��d���t||�}|j|�|jd�}|tk7rtd��y)Nr�r�z,Protocol error, expected challenge: message=zchallenge too short: z byteszdigest sent was rejected)r�r�r,r�r7rzr:r�r r|�_MD5ONLY_MESSAGE_LENGTHr�ror�)r�r�rxrzr�s rr�r��s����g�u�%��.�5�5�d�7�m�D�F� F��#�#�C�(�G����j�)�!�?�w�j�A�C� C��c�*�o�&�'�G� �7�|�-�-�!�$9�#�g�,��v�"N�O�O� �g�w� /�F����&�!��$�$�S�)�H��8��!�"<�=�=�rc��eZdZd�Zd�Zd�Zy)�ConnectionWrapperc�n�||_||_||_dD]}t||�}t |||��y)N)rarXr�rzro)�_conn�_dumps�_loadsr8�setattr)rE�connrrr��attrrts rrIzConnectionWrapper.__init__�s:���� �������K�D��$��%�C��D�$��$�Lrc�\�|j|�}|jj|�yr)r�r�ro)rErtrGs rruzConnectionWrapper.send�s"���K�K����� � ���a� rc�X�|jj�}|j|�Sr)r�rzr�rFs rr�zConnectionWrapper.recv�s"���J�J�!�!�#���{�{�1�~�rN)r�r�r�rIrur�r�rrr�r��s��%�!�rr�c�T�tj|fdddd�jd�S)Nr�utf-8)� xmlrpclibrrr�)rts r� _xml_dumpsr��s&���?�?�C�6�4��t�Q�7�>�>�w�G�Grc�X�tj|jd��\\}}|S)Nr�)r�r�rw)rGrt�methods r� _xml_loadsr��s$���_�_�Q�X�X�g�%6�7�N�F�S�F��Jrc��eZdZd�Zy)�XmlListenerc�b�ddlmatj |�}t|tt�Sr�)� xmlrpc.client�clientr�rr�r�r�r�rss rr�zXmlListener.accept�s"��)��o�o�d�#�� ��j�*�=�=rN)r�r�r�r�r�rrr�r��s��>rr�c�J�ddlmatt |i|��t t�Sr�)r�r�r�r�rr�r�)r6�kwdss r� XmlClientr��s��%��V�T�2�T�2�J� �K�Krc��t|�}g}|r�tj|d|�}|tk(r |St|cxkrtt|�zkr nn |tz}nAt|cxkrtt|�zkrntd��|tz}ntd��|j||�||dzd}d}|r��|S)NFzShould not get hererr) �listr�r�rrr|r r�rV)�handlesr�L�readyrYs r�_exhaustive_waitr��s��� ��M������0�0��E�7�C�C��l�"�����#�>� ��A��(>�>��}�$��!�S�D�+;�c�!�f�+D�D�#�#8�9�9��'�'��"�#8�9�9��L�L��3�� ��#�a�%�&� �A��G���rc�V��|�t}n|dkrd}nt|dzdz�}t|�}i�g}t�}t�} |D]�} t |d�} tj|�dd�\}}|t jk(r!|j|�|�|j<�d|rDtj�dddk\r* |jd �\} }|st!|d �rd|_|j%|�d}��t+�j-�|�}|D]}|j/��|D]e} |jd�\} }|t j0k7s�,�|j}|j%|�|dk(s�Rt!|d �s�_d|_�g |j3�fd�|D��|D�cgc] }||vs�|��c}S#t$r"} d| j}}|tvr�Yd} ~ ���d} ~ wwxYw#t$r} | j}Yd} ~ ��>d} ~ wwxYw#t&$r|�|j)�<Y���wxYw#t$r } | j}|tvr�Yd} ~ ��d} ~ wwxYw#|D]}|j/��|D]�} |jd�\} }n+#t$r} | j}|tvr�Yd} ~ nd} ~ wwxYw|t j0k7s�X�|j}|j%|�|dk(s�~t!|d �s��d|_��wxYwcc}w)�� Wait till an object in object_list is ready/readable. Returns list of those objects in object_list which are ready/readable. Nrr^g�?raTrq)�rqFr�c3�(�K�|] }�|���y�wrr�)rjrb�waithandle_to_objs �rrkzwait.<locals>.<genexpr>Ss�����I�=�a�.�q�1�=�s�)r�intr��setr8r�r�rQr�� _ready_errorsr�rVr�r1�getwindowsversionr�r3r��add�AttributeErrorrAr��keysr�r��update)�object_listr�ov_list� ready_objects� ready_handles�orar�r�r�r1r�s @rrrs-����?��G� �q�[��G��'�D�.�3�.�/�G��;�'�������� ��� �6 8� ��$�$�Q��1�F� "�")�"2�"2�6�8�Q��"E���C� �g�6�6�6����r�*�67�)�"�(�(�3� �#�"7�"7�"9�"�1�"=��"G�1�)+�)?�)?��)F���3�$'�7�1�6J�+K�7;�� 4�%�)�)�!�,�"#��=!�@-�->�-C�-C�-E�w�O�M���� � �������3�3�D�9�F�A�s� �'�9�9�9�)�"�(�(�3�A�!�%�%�a�(��a�x�#�1�&:�;�37�A�0�� ���I�=�I�I�&�=�;�a�!�}�*<��;�=�=��_#�"�"&�� � �C���m�3�!�4��"�� $+�1�&'�j�j���1��-&�9�78�%�a�k�k�m�4�9��N���*�*�C��-�/��0������� � �������3�3�D�9�F�A�s�����*�*�C��-�/��0�����'�9�9�9�)�"�(�(�3�A�!�%�%�a�(��a�x�#�1�&:�;�37�A�0���">s��I4�H%�G�:AI4�H�AI4�I� L&� L&� G?�G:�4I4�:G?�?I4� H"�H�I4�H"�"I4�%I�I4�I�I4� I1�I,�,I1�4L#�J'�&L#�' K �0K �L#� K �L#�&%L#�L#� L#�PollSelectorc��t�5}|D]"}|j|tj��$|�t j �|z} |j |�}|r(|D��cgc]\}}|j��c}}cddd�S|�'t j �z }|dkr|cddd�S�ecc}}w#1swYyxYw)r�Nr)� _WaitSelector�register� selectors� EVENT_READrr�select�fileobj)r�r�selectorrt�deadliner��key�eventss rrrbs����_��"���!�!�#�y�';�';�<�#��"��>�>�+�g�5��� ����0���=B�C�U�M�S�&�C�K�K�U�C��_��*�"*�T�^�^�-=�"=��"�Q�;�#(��_���D��_�s$�AB8�%B2�;B8�B8�1B8�8Cc� �|j�}tj|tjtj�5}ddlm}|j|�}t||j|jffcddd�S#1swYyxYw)Nr)�resource_sharer)rar4�fromfdr�SOCK_STREAMr$r�� DupSocket�rebuild_connectionrGrH)r�rFrGr��dss r�reduce_connectionr�~s`������� �]�]�6�6�>�>�6�3E�3E� F�!�)� �*�*�1�-�B�%��D�M�M�4�=�=�'I�I�G� F� F�s�6B�B c�X�|j�}t|j�||�Sr�rr�)r�rGrH�socks rr�r��s"���y�y�{���$�+�+�-��8�<�<rc��|jrtjnd|jrtjndz}tj|j�|�}t||j|jffSr�) rGr��FILE_GENERIC_READrH�FILE_GENERIC_WRITEr� DupHandlera�rebuild_pipe_connection)r�r,�dhs r�reduce_pipe_connectionr��s^��04� � �7�,�,�1�15���7�-�-�A�G�� � � ������ 7��&��T�]�]�D�M�M�(J�J�Jrc�<�|j�}t|||�Sr)rr�)r�rGrHrFs rr�r��s��������f�h��9�9rc��tj|j��}t||j|j ffSr)r�DupFdrar�rGrH)r��dfs rr�r��s0�� �_�_�T�[�[�]� +��!�B�� � �t�}�}�#E�E�Erc�<�|j�}t|||�Srr�)r�rGrH�fds rr�r��s�� �Y�Y�[���"�h��1�1r)NN)T)rr)U�__all__r�r�r(r1r4r�rr%� itertoolsr�r$rr r �contextr�ForkingPicklerrqr�rr rr�ImportErrorr2r�CONNECTION_TIMEOUT�countr+r��familiesr3rrr/r5r=r?r�r��objectrrrr�r r�rr�r�r�r�� frozensetrv�maxrur��_MD5_DIGEST_LENrsr|r�r�r�r�r�r�r�r�r�r�r�r��ERROR_NETNAME_DELETEDr�rr�r�r��SelectSelectorr�r�r�r�r�r�rr�<module>r�s���3��� � � � � ������1���*�*����O�O������ ���!� ����;�� �6�9���N�����H��<�<�7���N�����H�-�&� �0� F� F�&T�T�n�]��]�@M��M�h;�v�;�| �*�<�<�7���&&�X)�V�)�X&��<�<�7��6,�v�6,�p!�>�� � �����r�@�B���7�&6�7�7������*�O�<��2�4?�8?�2(�5�(�*>�%�>�* �� �H��>�(�>�L��<�<�7���(�.�.��0M�0M�N�M�L>�`� �y�.�)�!�.�.� �!�0�0� �)�6�<�<�7��J�=��I���z�#4�5�K� :��I���~�'=�>�F�2��I���z�#4�5��s#�� �|�|�w�� ��G��s�H8�8I�IPK:W�\�2�"�"�,__pycache__/connection.cpython-312.opt-2.pycnu�[���� T��h�����gd�ZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddlmZddlm Z mZddlmZej"Z ddlZddlmZmZmZmZd Zd Ze j8�ZdZdgZe ed�rdZedgz Zej2dk(rd Zed gz Zefd�Z!d�Z"d�Z#d�Z$d�Z%Gd�d�Z&erGd�de&�Z'Gd�de&�Z(Gd�de)�Z*dCd�Z+ej2dk7rdDd�Z,ndDd�Z,Gd�de)�Z-d �Z.ej2dk(rGd!�d"e)�Z/d#�Z0d$Z1d%Z2d&Z3d'Z4e5hd(��Z6e7d)�e6D��Z8d*Z9d+Z:e9e:fZ;d,�Z<d-�Z=d.�Z>dEd/e?fd0�Z@d/e?fd1�ZAGd2�d3e)�ZBd4�ZCd5�ZDGd6�d7e*�ZEd8�ZFej2dk(r d9�ZGej�ej�hZJdFd:�ZKn*ddlLZLe eLd;�r eLj�ZNneLj�ZNdFd<�ZKej2dk(r3d=�ZPd>�ZQej�e(eP�d?�ZSd@�ZTej�e'eS�ydA�ZPdB�ZQej�e(eP�y#e$rej2dk(r�dZY���wxYw)G)�Client�Listener�Pipe�wait�N�)�util)�AuthenticationError�BufferTooShort)� reduction)� WAIT_OBJECT_0�WAIT_ABANDONED_0�WAIT_TIMEOUT�INFINITE�win32i g4@�AF_INET�AF_UNIX�AF_PIPEc�0�tj�|zS�N��time� monotonic)�timeouts �3/usr/lib64/python3.12/multiprocessing/connection.py� _init_timeoutr<s���>�>��g�%�%�c�0�tj�|kDSrr)�ts r�_check_timeoutr?s���>�>��a��rc�� |dk(ry|dk(r)tjdtj���S|dk(r;tjdt j �t t�fzd��Std ��) Nr)� localhostrrz listener-)�prefix�dirrz\\.\pipe\pyc-%d-%d-�zunrecognized family) �tempfile�mktempr�get_temp_dir�os�getpid�next� _mmap_counter� ValueError��familys r�arbitrary_addressr/Fs~������� �9� ����k�t�7H�7H�7J�K�K� �9� ����&<� "� � ��T�-�-@�A�'B�GI�K� K��.�/�/rc��� tjdk7r|dk(rtd|z��tjdk(r%|dk(rtt|�std|z��yyy)NrrzFamily %s is not recognized.r)�sys�platformr,�hasattr�socketr-s r�_validate_familyr5Tsh����|�|�w��6�Y�#6��7�&�@�A�A� �|�|�w��6�Y�#6��v�v�&��;�f�D�E�E�'�$7�rc��� t|�tk(ryt|�tur|jd�ryt|�tust j |�ryt d|z��)Nrz\\rrzaddress type of %r unrecognized)�type�tuple�str� startswithr�is_abstract_socket_namespacer,)�addresss r�address_typer=`sa��� �G�}���� �g��#� �'�"4�"4�V�"<�� �g��#� ��!B�!B�7�!K���:�W�D�E�Erc��eZdZdZdd�Zd�Zd�Zd�Zd�Zd�Z e d��Ze d ��Ze d ��Z d�Zd�Zdd �Zd�Zdd�Zdd�Zd�Zdd�Zd�Zd�Zy)�_ConnectionBaseNc��|j�}|dkrtd��|s |std��||_||_||_y)Nrzinvalid handlez6at least one of `readable` and `writable` must be True)� __index__r,�_handle� _readable� _writable)�self�handle�readable�writables r�__init__z_ConnectionBase.__init__vsO���!�!�#���A�:��-�.�.����H�J� J����!���!��rc�>�|j�|j�yyr�rB�_close�rEs r�__del__z_ConnectionBase.__del__�s���<�<�#��K�K�M�$rc�2�|j�td��y)N�handle is closed)rB�OSErrorrMs r� _check_closedz_ConnectionBase._check_closed�s���<�<���,�-�-� rc�2�|jstd��y)Nzconnection is write-only)rCrQrMs r�_check_readablez_ConnectionBase._check_readable�s���~�~��4�5�5�rc�2�|jstd��y)Nzconnection is read-only)rDrQrMs r�_check_writablez_ConnectionBase._check_writable�s���~�~��3�4�4�rc�t�|jrd|_td��|j�td��)NFzbad message length)rDrC�closerQrMs r�_bad_message_lengthz#_ConnectionBase._bad_message_length�s5���>�>�"�D�N��*�+�+� �J�J�L��*�+�+rc� � |jduSr�rBrMs r�closedz_ConnectionBase.closed�s��.��|�|�t�#�#rc�� |jSr)rCrMs rrGz_ConnectionBase.readable����0��~�~�rc�� |jSr)rDrMs rrHz_ConnectionBase.writable�r^rc�<� |j�|jSr)rRrBrMs r�filenoz_ConnectionBase.fileno�s��9������|�|�rc�h� |j� |j�d|_yy#d|_wxYwrrKrMs rrXz_ConnectionBase.close�s4��"��<�<�#� $���� �#��� $�� $���s�(� 1c�x� |j�|j�t|�}|jdkDr|j d�}|j }|dkrt d��||krt d��|�||z }n#|dkrt d��||z|kDrt d��|j||||z�y)Nr�Brzoffset is negativezbuffer length < offsetzsize is negativezbuffer length < offset + size)rRrV� memoryview�itemsize�cast�nbytesr,�_send_bytes)rE�buf�offset�size�m�ns r� send_bytesz_ConnectionBase.send_bytes�s���:����������s�O���:�:��>����s��A� �H�H���A�:��1�2�2��v�:��5�6�6��<��v�:�D� �A�X��/�0�0� �d�]�Q� ��<�=�=�����6�&�4�-�0�1rc�� |j�|j�|jtj |��yr)rRrVri�_ForkingPickler�dumps�rE�objs r�sendz_ConnectionBase.send�s6��'�������������.�.�s�3�4rc��� |j�|j�|�|dkrtd��|j|�}|�|j �|j�S)Nrznegative maxlength)rRrTr,�_recv_bytesrY�getvalue)rE� maxlengthrjs r� recv_bytesz_ConnectionBase.recv_bytes�sf�� � ��������� �Y��]��1�2�2����y�)���;��$�$�&��|�|�~�rc��� |j�|j�t|�5}|j}|t |�z}|dkrtd��||kDrtd��|j �}|j�}|||zkrt|j���|jd�|j|||z||z|z�|cddd�S#1swYyxYw)Nrznegative offsetzoffset too large)rRrTrerf�lenr,rw�tellr rx�seek�readinto)rErjrkrmrf�bytesize�resultrls r�recv_bytes_intoz_ConnectionBase.recv_bytes_into�s��� � �������� ��_���z�z�H��#�a�&�(�H���z� �!2�3�3��(�"� �!3�4�4��%�%�'�F��;�;�=�D��&�4�-�'�$�V�_�_�%6�7�7��K�K��N��O�O�A�f��0�%��}��9�;� <��!�_�_�s�B+C"�"C+c�� |j�|j�|j�}tj |j��Sr)rRrTrwrq�loads� getbuffer)rErjs r�recvz_ConnectionBase.recv�sB��*������������ ���$�$�S�]�]�_�5�5rc�f� |j�|j�|j|�Sr)rRrT�_poll�rErs r�pollz_ConnectionBase.poll�s,��=����������z�z�'�"�"rc��|Sr�rMs r� __enter__z_ConnectionBase.__enter__����rc�$�|j�yr�rX�rE�exc_type� exc_value�exc_tbs r�__exit__z_ConnectionBase.__exit__���� � �r)TT)rNr)r)g)�__name__� __module__�__qualname__rBrIrNrRrTrVrY�propertyr\rGrHrarXrorurzr�r�r�r�r�r�rrr?r?ss����G� "��.�6�5�,��$��$���������� $�2�(5���26�#��rr?c�N�eZdZ dZdZejfd�Zd�Zdd�Z d�Z d�Zy) �PipeConnectionFNc�d�|j}|�|j�||j�yr)�_send_ov�cancelrB)rE�_CloseHandle�ovs rrLzPipeConnection._closes%�����B��~�� � ������&rc��|j�td��tj|j|d��\}}||_ |tj k(r&tj|jgdt�}d|_|jd�\}}|tjk(rttjd��y#|j��xYw#d|_|jd�\}}wxYw)Nz/concurrent send_bytes() calls are not supportedT�� overlappedFrP)r�r,�_winapi� WriteFilerB�ERROR_IO_PENDING�WaitForMultipleObjects�eventrr��GetOverlappedResult�ERROR_OPERATION_ABORTEDrQ�errno�EPIPE)rErjr��err�waitres�nwrittens rrizPipeConnection._send_bytess����}�}�(� �"5�6�6��'�'����c�d�K�G�B���D�M� =��'�2�2�2�%�<�<���� �E�8�5�G�!%�� � "� 6� 6�t� <� ��#��g�5�5�5��e�k�k�+=�>�>� 6�� �� � ���� $�� � "� 6� 6�t� <� ��#�s�9C�C�C�C:c���|jrd|_tj�S|�dnt|d�} t j |j|d��\}} |tjk(r&t j|jgdt�}|jd�\}}|dk(r5tj�}|j|j��|S|tjk(r|j!||�S t+d��#|j��xYw#|jd�\}}|dk(r9tj�}|j|j��|ccYS|tjk(r|j!||�ccYSwxYw#t"$r)}|j$tj&k(rt(��d}~wwxYw)NF�Tr�rz.shouldn't get here; expected KeyboardInterrupt)�_got_empty_message�io�BytesIO�minr��ReadFilerBr�r�r�rr�r��writer��ERROR_MORE_DATA�_get_more_datarQ�winerror�ERROR_BROKEN_PIPE�EOFError�RuntimeError) rE�maxsize�bsizer�r�r��nread�f�es rrwzPipeConnection._recv_bytes6s����&�&�*/��'��z�z�|�#�&���C���4E���%�.�.�t�|�|�U�;?�A�G�B��D��'�":�":�:�&-�&D�&D�!#��� �E�8�'=�G�&(�%;�%;�D�%A� ��s��!�8� "� � ��A��G�G�B�L�L�N�3�#$�H� �G�$;�$;�;�#'�#6�#6�r�7�#C�C�<��O�P�P��!�� � ����%'�%;�%;�D�%A� ��s��!�8� "� � ��A��G�G�B�L�L�N�3�#$�H� �G�$;�$;�;�#'�#6�#6�r�7�#C�C�<�����z�z�W�%>�%>�>�&���� �s[�%F-�9D�A F-�&$F-�D*�*D-�-AF*�>F-�'F*�'F-�)F*�*F-�- G�6$G�Gc��|js%tj|j�ddk7ryt t|g|��S)NrT)r�r�� PeekNamedPiperB�boolrr�s rr�zPipeConnection._pollVs>���'�'��-�-�d�l�l�;�A�>�!�C����d�V�W�-�.�.rc��|j�}tj�}|j|�t j |j�d}|�!t|�|z|kDr|j�t j|j|d��\}}|jd�\}}|j|j��|S)NrTr�)r�r�r�r�r�r�rBr|rYr�r�)rEr�r�rjr��leftr��rbytess rr�zPipeConnection._get_more_data\s����,�,�.�C�� � ��A� �G�G�C�L��(�(����6�q�9�D��"�s�3�x�$���'@��(�(�*��&�&�t�|�|�T�d�K�G�B���0�0��6�K�F�C� �G�G�B�L�L�N�#��Hrr)r�r�r�r�r�r��CloseHandlerLrirwr�r�r�rrr�r�s8�� � #����&-�&9�&9� '� (�4 Q�@ /� rr�c���eZdZ er(ej fd�ZejZejZ n'ejfd�ZejZejZ efd�Ze fd�Zd�Zd d�Zd�Zy) � Connectionc�(�||j�yrr[�rErLs rrLzConnection._closes����4�<�<� rc�(�||j�yrr[r�s rrLzConnection._closexr�rc�b�t|�} ||j|�}||z}|dk(ry||d}�$�Nr)r|rB)rErjr�� remainingrns r�_sendzConnection._send}sA����H� ���d�l�l�C�(�A���N�I��A�~���a�b�'�C�rc���tj�}|j}|}|dkDrK|||�}t|�}|dk(r||k(rt�td��|j |�||z}|dkDr�K|S)Nrzgot end of file during message)r�r�rBr|r�rQr�)rErl�readrjrFr��chunkrns r�_recvzConnection._recv�s|���j�j�l������� ��!�m����+�E��E� �A��A�v���$�"�N�!�"B�C�C��I�I�e����N�I��!�m�� rc��t|�}|dkDr`tjdd�}tjd|�}|j|�|j|�|j|�ytjd|�}|dkDr#|j|�|j|�y|j||z�y)Ni����!i����!Qi@)r|�struct�packr�)rErjrn� pre_header�headers rrizConnection._send_bytes�s�����H���z�>����T�2�.�J��[�[��q�)�F��J�J�z�"��J�J�v���J�J�s�O��[�[��q�)�F��5�y�� � �6�"�� � �3��� � �6�C�<�(rNc��|jd�}tjd|j��\}|dk(r7|jd�}tjd|j��\}|�||kDry|j|�S)N�r�r��r�)r�r��unpackrx)rEr�rjrls rrwzConnection._recv_bytes�sq���j�j��m��� � �d�C�L�L�N�3����2�:��*�*�Q�-�C��M�M�$�����7�E�D���4�'�>���z�z�$��rc�2�t|g|�}t|�Sr)rr�)rEr�rs rr�zConnection._poll�s���$���!���A�w�rr)r�r�r�r��_multiprocessing�closesocketrLru�_writer��_readr(rXr�r�r�r�rirwr�r�rrr�r�lso��� � 0� <� <� !�!�&�&�� �%�%�� "��� !���������%�� %�� )�. �rr�c�N�eZdZ d d�Zd�Zd�Zed��Zed��Zd�Z d�Z y) rNc��|xs|xrt|�xst}|xst|�}t|�|dk(rt ||�|_nt |||�|_|�t|t�std��||_ y�Nrzauthkey should be a byte string)r=�default_familyr/r5�PipeListener� _listener�SocketListener� isinstance�bytes� TypeError�_authkey)rEr<r.�backlog�authkeys rrIzListener.__init__�s����#�G�=��W�(=�#�"� ��6�.�v�6���� ��Y��)�'�7�;�D�N�+�G�V�W�E�D�N���z�'�5�'A��=�>�>��� rc��� |j�td��|jj�}|j�,t ||j�t||j�|S)Nzlistener is closed)r�rQ�acceptr��deliver_challenge�answer_challenge)rE�cs rr�zListener.accept�s\�� � �>�>�!��.�/�/��N�N�!�!�#���=�=�$��a����/��Q�� � �.��rc�R� |j}|�d|_|j�yyr)r�rX)rE�listeners rrXzListener.close�s.�� ��>�>����!�D�N��N�N�� rc�.�|jjSr)r��_addressrMs rr<zListener.address�s���~�~�&�&�&rc�.�|jjSr)r��_last_acceptedrMs r� last_acceptedzListener.last_accepted�s���~�~�,�,�,rc��|Srr�rMs rr�zListener.__enter__�r�rc�$�|j�yrr�r�s rr�zListener.__exit__�r�r)NNrN)r�r�r�rIr�rXr�r<rr�r�r�rrrr�sH��� � ���'��'��-��-��rrc��� |xst|�}t|�|dk(rt|�}nt|�}|�t |t �st d��|�t||�t||�|Sr�) r=r5� PipeClient�SocketClientr�r�r�r�r�)r<r.r�r�s rrr�sv���� ,�|�G�,�F��V�� ����w�����!����:�g�u�#=��9�:�:�����G�$��!�W�%��Hrc�P� |rotj�\}}|jd�|jd�t|j ��}t|j ��}||fStj�\}}t|d��}t|d��}||fS)NTF�rH�rG)r4� socketpair�setblockingr��detachr(�pipe)�duplex�s1�s2�c1�c2�fd1�fd2s rrrs��� ���&�&�(�F�B���N�N�4� ��N�N�4� ��B�I�I�K�(�B��B�I�I�K�(�B��2�v� � �w�w�y�H�C���C�%�0�B��C�%�0�B��2�v� rc �� td�}|r>tj}tjtjz}t t }}n(tj}tj}dt }}tj||tjztjztjtjztjzd||tjtj�}tj||dtjtj tjtj�}tj"|tjdd�tj$|d��}|j'd�\} } t)||��}t)||��}||fS)NrrrTr�r r)r/r��PIPE_ACCESS_DUPLEX�GENERIC_READ� GENERIC_WRITE�BUFSIZE�PIPE_ACCESS_INBOUND�CreateNamedPipe�FILE_FLAG_OVERLAPPED�FILE_FLAG_FIRST_PIPE_INSTANCE�PIPE_TYPE_MESSAGE�PIPE_READMODE_MESSAGE� PIPE_WAIT�NMPWAIT_WAIT_FOREVER�NULL� CreateFile� OPEN_EXISTING�SetNamedPipeHandleState�ConnectNamedPiper�r�) rr<�openmode�access�obsize�ibsize�h1�h2r��_r�rrs rrr(se�� �$�I�.����1�1�H��)�)�G�,A�,A�A�F�$�g�F�F��2�2�H��*�*�F���F�F� � $� $��X�� <� <�<��1�1�2��%�%��(E�(E�E���� � �v�v�w�;�;��L�L���� � ��V�Q����g�.C�.C��(�(�'�,�,��� �'�'���-�-�t�T� ��-�-�b�T�B� ��/�/��5���3��B�� 0�� �B�� 0���2�v� rc�"�eZdZ dd�Zd�Zd�Zy)r�c���tjtt|��|_ tjdk(r9|jjtjtjd�|jjd�|jj|�|jj|�|jj�|_||_d|_|dk(rCt#j$|�s.t#j&|tj(|fd��|_yd|_y#t$r|jj��wxYw)N�posixrTrr��args�exitpriority)r4�getattr�_socketr(�name� setsockopt� SOL_SOCKET�SO_REUSEADDRr �bind�listen�getsocknamerrQrX�_familyrrr;�Finalize�unlink�_unlink)rEr<r.r�s rrIzSocketListener.__init__Xs���}�}�W�V�V�%<�=��� ��w�w�'�!����'�'��(9�(9�(.�(;�(;�Q�@��L�L�$�$�T�*��L�L���g�&��L�L����(� �L�L�4�4�6�D�M����"����Y��t�'H�'H��'Q��=�=��b�i�i�w�j�q��D�L� �D�L��� ��L�L��� �� �s�B<E�%E)c��|jj�\}|_|jd�t |j��S�NT)r7r�rr r�r�rE�ss rr�zSocketListener.acceptqs9��!%���!4�!4�!6���4�� � � �d���!�(�(�*�%�%rc�� |jj�|j}|�d|_|�yy#|j}|�d|_|�wwxYwr)r7rXrB)rErAs rrXzSocketListener.closevs[�� ��L�L��� ��\�\�F��!�#�����"���\�\�F��!�#�����"�s �:�AN)r)r�r�r�rIr�rXr�rrr�r�Ts��� �2&� rr�c�� t|�}tjtt|��5}|jd�|j |�t|j ��cddd�S#1swYyxYwrD)r=r4r6r �connectr�r)r<r.rFs rrr�sZ����'� "�F� ������/� 1�Q� � � �d�� � � �'���!�(�(�*�%� 2� 1� 1�s�;A5�5A>c�4�eZdZ dd�Zdd�Zd�Zed��Zy)r�Nc��||_|jd��g|_d|_t j d|j�t j|tj|j|jfd��|_ y)NT)�firstz listener created with address=%rrr3) r�_new_handle� _handle_queuerr� sub_debugr@r��_finalize_pipe_listenerrX)rEr<r�s rrIzPipeListener.__init__�sl��#�D�M�"&�"2�"2��"2�">�!?�D��"&�D���N�N�=�t�}�}�M�����l�:�:��(�(�$�-�-�8�q��D�Jrc �~�tjtjz}|r|tjz}tj|j |tjtjztjztjtttjtj�Sr) r�rrrrrr r!r"�PIPE_UNLIMITED_INSTANCESrr#r$)rErL�flagss rrMzPipeListener._new_handle�s����.�.��1M�1M�M�E����>�>�>���*�*�� � �u��)�)�G�,I�,I�I��!�!�"��0�0�'�7��,�,�g�l�l�� rc�L�|jj|j��|jjd�} t j |d��} t j|jgdt�} |jd�\}}t|�S#|j�t j|��xYw#|jd�\}}wxYw#t$r2}|jtjk7r�Yd}~t|�Sd}~wwxYw)NrTr�F)rN�appendrM�popr�r(r�r�rr�r�r�rQr�� ERROR_NO_DATAr�)rErFr��resr/r�r�s rr�zPipeListener.accept�s������%�%�d�&6�&6�&8�9��'�'�+�+�A�.�F� $��-�-�f��F�� $�!�8�8���� �E�8�5�C� �3�3�D�9�F�A�s�!�&�)�)����I�I�K��'�'��/����3�3�D�9�F�A�s��� ��:�:��!6�!6�6��7�"�&�)�)��! �s0�C(�&B$�$(C�C�C%�( D#�1D�D#c�h�tjd|�|D]}tj|��y)Nz closing listener with address=%r)rrOr�r�)�queuer<rFs rrPz$PipeListener._finalize_pipe_listener�s)���N�N�=�w�G����#�#�F�+� rr)F)r�r�r�rIrMr��staticmethodrPr�rrr�r��s*�� � � � *�. � ,� � ,rr�c �0� t�} tj|d�tj|tjtj zdtjtjtjtj�} tj|tjdd�t!|�S#t$rB}|jtjtjfvst|�r�Yd}~nd}~wwxYw��)N��r)rr�� WaitNamedPiper%rrr$r&rrQr��ERROR_SEM_TIMEOUT�ERROR_PIPE_BUSYrr'r!r�)r<r�hr�s rrr�s��� � �O��� ��%�%�g�t�4��&�&��W�1�1�G�4I�4I�I��w�|�|�W�%:�%:��0�0�'�,�,���� �'�'� �w�,�,�d�D� ��a� � ��� ��:�:�g�&?�&?�&-�&=�&=�&?�?�BP�QR�BS��CT�� ��s�BC� D�8D�D�(s#CHALLENGE#s #WELCOME#s #FAILURE#>�md5�sha256�sha384�sha3_256�sha3_384c#�2K�|]}t|����y�wr)r|)�.0r/s r� <genexpr>rjFs����7�&6��c�!�f�&6�s���c�� t|�tvrd|fS|jd�rG|jddtdz�x}dkDr(|d|}|t vr||dzd}|j d�|fStd|����) Nr$�{�}r�r�asciizRunsupported message length, missing digest prefix, or unsupported digest: message=)r|�_LEGACY_LENGTHSr:�find�_MAX_DIGEST_LEN�_ALLOWED_DIGESTS�decoder )�message�curly�digest�payloads r�_get_digest_name_and_payloadr{Qs�����7�|��&� �7�{�����4� ��,�,�t�Q���(9�:� :��a�?���5�!���%�%��e�A�g�h�'�G��=�=��)�7�2�2� � /�&-�Z� 1�2�2rc�� ddl}t|�d}|s" |j||d�j�S|j|||�j�}d|jd�|fzS#t$rd}Y�DwxYw)Nr�md5�sha256�{%s}%srq)�hmacr{�newryr,�encode)r�rwr��digest_name�responses r�_create_responser�ks�����.�w�7��:�K�� #��8�8�G�W�e�4�;�;�=�=��x�x���+�6�=�=�?�H���*�*�7�3�X�>�>�>��� #�#�K� #�s� A/�/A=�<A=c �f� ddl}t|�\}}|xsd} |j|||�j�}t |�t |�k7r&td|�dt |��dt |�����|j||�std��y#t$rtd|�d���wxYw) Nrr}zresponse_digest=z unsupportedz expected z of length z got zdigest received was wrong)r�r{r�ryr,r r|�compare_digest)r�rwr�r��response_digest�response_mac�expecteds r�_verify_challenger��s�����$@��$J�!�O�\�%�.��O�E��8�8�G�W�o�>�E�E�G���8�}��L�)�)�!��O�.�k�#�h�-��I��<�(�)�+�,� ,����x��6�!�"=�>�>�7�� �E�!�%5�_�$6�l�"C�D�D�E�s�!B�B0r�c��t|t�s#tdjt |����tjt�}d|jd�|fz}|jt|z�|jd�} t|||�|jt�y#t$r|jt��wxYw)N� Authkey must be bytes, not {0!s}rrq�)r�r�r,�formatr7r(�urandom�MESSAGE_LENGTHr�ro� _CHALLENGErzr��_WELCOMEr �_FAILURE)� connectionr�r�rwr�s rr�r��s����g�u�%��.�5�5�d�7�m�D�F� F��j�j��(�G��;�-�-�g�6��@�@�G����*�w�.�/��$�$�S�)�H�(��'�7�H�5� ���h�'�� �����h�'� ��s� B0�0 Cc���t|t�s#tdjt |����|jd�}|j t�std|����|tt�d}t|�tkrtdt|��d���t||�}|j|�|jd�}|tk7rtd��y)Nr�r�z,Protocol error, expected challenge: message=zchallenge too short: z byteszdigest sent was rejected)r�r�r,r�r7rzr:r�r r|�_MD5ONLY_MESSAGE_LENGTHr�ror�)r�r�rwryr�s rr�r��s����g�u�%��.�5�5�d�7�m�D�F� F��#�#�C�(�G����j�)�!�?�w�j�A�C� C��c�*�o�&�'�G� �7�|�-�-�!�$9�#�g�,��v�"N�O�O� �g�w� /�F����&�!��$�$�S�)�H��8��!�"<�=�=�rc��eZdZd�Zd�Zd�Zy)�ConnectionWrapperc�n�||_||_||_dD]}t||�}t |||��y)N)rarXr�rzro)�_conn�_dumps�_loadsr6�setattr)rE�connrrr��attrrts rrIzConnectionWrapper.__init__�s:���� �������K�D��$��%�C��D�$��$�Lrc�\�|j|�}|jj|�yr)r�r�ro)rErtrFs rruzConnectionWrapper.send�s"���K�K����� � ���a� rc�X�|jj�}|j|�Sr)r�rzr�rEs rr�zConnectionWrapper.recv�s"���J�J�!�!�#���{�{�1�~�rN)r�r�r�rIrur�r�rrr�r��s��%�!�rr�c�T�tj|fdddd�jd�S)Nr�utf-8)� xmlrpclibrrr�)rts r� _xml_dumpsr��s&���?�?�C�6�4��t�Q�7�>�>�w�G�Grc�X�tj|jd��\\}}|S)Nr�)r�r�rv)rFrt�methods r� _xml_loadsr��s$���_�_�Q�X�X�g�%6�7�N�F�S�F��Jrc��eZdZd�Zy)�XmlListenerc�b�ddlmatj |�}t|tt�Sr�)� xmlrpc.client�clientr�rr�r�r�r�rss rr�zXmlListener.accept�s"��)��o�o�d�#�� ��j�*�=�=rN)r�r�r�r�r�rrr�r��s��>rr�c�J�ddlmatt |i|��t t�Sr�)r�r�r�r�rr�r�)r4�kwdss r� XmlClientr��s��%��V�T�2�T�2�J� �K�Krc��t|�}g}|r�tj|d|�}|tk(r |St|cxkrtt|�zkr nn |tz}nAt|cxkrtt|�zkrntd��|tz}ntd��|j||�||dzd}d}|r��|S)NFzShould not get hererr) �listr�r�rrr|r r�rU)�handlesr�L�readyrXs r�_exhaustive_waitr��s��� ��M������0�0��E�7�C�C��l�"�����#�>� ��A��(>�>��}�$��!�S�D�+;�c�!�f�+D�D�#�#8�9�9��'�'��"�#8�9�9��L�L��3�� ��#�a�%�&� �A��G���rc�X�� |�t}n|dkrd}nt|dzdz�}t|�}i�g}t�}t�} |D]�} t |d�} tj|�dd�\}}|t jk(r!|j|�|�|j<�d|rDtj�dddk\r* |jd�\} }|st!|d �rd|_|j%|�d}��t+�j-�|�}|D]}|j/��|D]e} |jd�\} }|t j0k7s�,�|j}|j%|�|dk(s�Rt!|d �s�_d|_�g |j3�fd �|D��|D�cgc] }||vs�|��c}S#t$r"} d| j}}|tvr�Yd} ~ ���d} ~ wwxYw#t$r} | j}Yd} ~ ��>d} ~ wwxYw#t&$r|�|j)�<Y���wxYw#t$r } | j}|tvr�Yd} ~ ��d} ~ wwxYw#|D]}|j/��|D]�} |jd�\} }n+#t$r} | j}|tvr�Yd} ~ nd} ~ wwxYw|t j0k7s�X�|j}|j%|�|dk(s�~t!|d �s��d|_��wxYwcc}w)Nrr]g�?raTrp)�rpFr�c3�(�K�|] }�|���y�wrr�)rira�waithandle_to_objs �rrjzwait.<locals>.<genexpr>Ss�����I�=�a�.�q�1�=�s�)r�intr��setr6r�r�rQr�� _ready_errorsr�rUr�r1�getwindowsversionr�r3r��add�AttributeErrorrAr��keysr�r��update)�object_listr�ov_list� ready_objects� ready_handles�orar�r�r�r/r�s @rrrs2��� � �?��G� �q�[��G��'�D�.�3�.�/�G��;�'�������� ��� �6 8� ��$�$�Q��1�F� "�")�"2�"2�6�8�Q��"E���C� �g�6�6�6����r�*�67�)�"�(�(�3� �#�"7�"7�"9�"�1�"=��"G�1�)+�)?�)?��)F���3�$'�7�1�6J�+K�7;�� 4�%�)�)�!�,�"#��=!�@-�->�-C�-C�-E�w�O�M���� � �������3�3�D�9�F�A�s� �'�9�9�9�)�"�(�(�3�A�!�%�%�a�(��a�x�#�1�&:�;�37�A�0�� ���I�=�I�I�&�=�;�a�!�}�*<��;�=�=��_#�"�"&�� � �C���m�3�!�4��"�� $+�1�&'�j�j���1��-&�9�78�%�a�k�k�m�4�9��N���*�*�C��-�/��0������� � �������3�3�D�9�F�A�s�����*�*�C��-�/��0�����'�9�9�9�)�"�(�(�3�A�!�%�%�a�(��a�x�#�1�&:�;�37�A�0���">s�� I5�H&�G�;AI5�H� AI5�I � L'�L'� H�G;�5I5�;H�I5� H#�H�I5�H#�#I5�&I�I5�I�I5� I2�I-�-I2�5L$�J(�'L$�( K �1K �L$�K �L$�'%L$� L$� L$�PollSelectorc�� t�5}|D]"}|j|tj��$|�t j �|z} |j |�}|r(|D��cgc]\}}|j��c}}cddd�S|�'t j �z }|dkr|cddd�S�ecc}}w#1swYyxYwr�)� _WaitSelector�register� selectors� EVENT_READrr�select�fileobj)r�r�selectorrt�deadliner��key�eventss rrrbs��� � �_��"���!�!�#�y�';�';�<�#��"��>�>�+�g�5��� ����0���=B�C�U�M�S�&�C�K�K�U�C��_��*�"*�T�^�^�-=�"=��"�Q�;�#(��_���D��_�s$�AB9�&B3�<B9� B9�2B9�9Cc� �|j�}tj|tjtj�5}ddlm}|j|�}t||j|jffcddd�S#1swYyxYw)Nr)�resource_sharer)rar4�fromfdr�SOCK_STREAMr$r�� DupSocket�rebuild_connectionrGrH)r�rFrFr��dss r�reduce_connectionr�~s`������� �]�]�6�6�>�>�6�3E�3E� F�!�)� �*�*�1�-�B�%��D�M�M�4�=�=�'I�I�G� F� F�s�6B�B c�X�|j�}t|j�||�Sr�rr�)r�rGrH�socks rr�r��s"���y�y�{���$�+�+�-��8�<�<rc��|jrtjnd|jrtjndz}tj|j�|�}t||j|jffSr�) rGr��FILE_GENERIC_READrH�FILE_GENERIC_WRITEr� DupHandlera�rebuild_pipe_connection)r�r*�dhs r�reduce_pipe_connectionr��s^��04� � �7�,�,�1�15���7�-�-�A�G�� � � ������ 7��&��T�]�]�D�M�M�(J�J�Jrc�<�|j�}t|||�Sr)rr�)r�rGrHrFs rr�r��s��������f�h��9�9rc��tj|j��}t||j|j ffSr)r�DupFdrar�rGrH)r��dfs rr�r��s0�� �_�_�T�[�[�]� +��!�B�� � �t�}�}�#E�E�Erc�<�|j�}t|||�Srr�)r�rGrH�fds rr�r��s�� �Y�Y�[���"�h��1�1r)NN)T)r~r)U�__all__r�r�r(r1r4r�rr%� itertoolsr�r$rr r �contextr�ForkingPicklerrqr�rr rr�ImportErrorr2r�CONNECTION_TIMEOUT�countr+r��familiesr3rrr/r5r=r?r�r��objectrrrr�rr�rr�r�r�r�� frozensetru�maxrtr��_MD5_DIGEST_LENrrr{r�r�r�r�r�r�r�r�r�r�r�r��ERROR_NETNAME_DELETEDr�rr�r�r��SelectSelectorr�r�r�r�r�r�rr�<module>r�s���3��� � � � � ������1���*�*����O�O������ ���!� ����;�� �6�9���N�����H��<�<�7���N�����H�-�&� �0� F� F�&T�T�n�]��]�@M��M�h;�v�;�| �*�<�<�7���&&�X)�V�)�X&��<�<�7��6,�v�6,�p!�>�� � �����r�@�B���7�&6�7�7������*�O�<��2�4?�8?�2(�5�(�*>�%�>�* �� �H��>�(�>�L��<�<�7���(�.�.��0M�0M�N�M�L>�`� �y�.�)�!�.�.� �!�0�0� �)�6�<�<�7��J�=��I���z�#4�5�K� :��I���~�'=�>�F�2��I���z�#4�5��s#�� �|�|�w�� ��G��s�H8�8I�IPK:W�\2a+ȻȻ&__pycache__/connection.cpython-312.pycnu�[���� T��h�����gd�ZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddlmZddlm Z mZddlmZej"Z ddlZddlmZmZmZmZd Zd Ze j8�ZdZdgZe ed�rdZedgz Zej2dk(rd Zed gz Zefd�Z!d�Z"d�Z#d�Z$d�Z%Gd�d�Z&erGd�de&�Z'Gd�de&�Z(Gd�de)�Z*dCd�Z+ej2dk7rdDd�Z,ndDd�Z,Gd�de)�Z-d �Z.ej2dk(rGd!�d"e)�Z/d#�Z0d$Z1d%Z2d&Z3d'Z4e5hd(��Z6e7d)�e6D��Z8d*Z9d+Z:e9e:fZ;d,�Z<d-�Z=d.�Z>dEd/e?fd0�Z@d/e?fd1�ZAGd2�d3e)�ZBd4�ZCd5�ZDGd6�d7e*�ZEd8�ZFej2dk(r d9�ZGej�ej�hZJdFd:�ZKn*ddlLZLe eLd;�r eLj�ZNneLj�ZNdFd<�ZKej2dk(r3d=�ZPd>�ZQej�e(eP�d?�ZSd@�ZTej�e'eS�ydA�ZPdB�ZQej�e(eP�y#e$rej2dk(r�dZY���wxYw)G)�Client�Listener�Pipe�wait�N�)�util)�AuthenticationError�BufferTooShort)� reduction)� WAIT_OBJECT_0�WAIT_ABANDONED_0�WAIT_TIMEOUT�INFINITE�win32i g4@�AF_INET�AF_UNIX�AF_PIPEc�0�tj�|zS�N��time� monotonic)�timeouts �3/usr/lib64/python3.12/multiprocessing/connection.py� _init_timeoutr<s���>�>��g�%�%�c�0�tj�|kDSrr)�ts r�_check_timeoutr?s���>�>��a��rc��|dk(ry|dk(r)tjdtj���S|dk(r;tjdt j �t t�fzd��Std ��) z? Return an arbitrary free address for the given family r)� localhostrrz listener-)�prefix�dirrz\\.\pipe\pyc-%d-%d-�zunrecognized family) �tempfile�mktempr�get_temp_dir�os�getpid�next� _mmap_counter� ValueError��familys r�arbitrary_addressr/Fsy������ �9� ����k�t�7H�7H�7J�K�K� �9� ����&<� "� � ��T�-�-@�A�'B�GI�K� K��.�/�/rc��tjdk7r|dk(rtd|z��tjdk(r%|dk(rtt|�std|z��yyy)zD Checks if the family is valid for the current environment. rrzFamily %s is not recognized.rN)�sys�platformr,�hasattr�socketr-s r�_validate_familyr5Tsc���|�|�w��6�Y�#6��7�&�@�A�A� �|�|�w��6�Y�#6��v�v�&��;�f�D�E�E�'�$7�rc���t|�tk(ryt|�tur|jd�ryt|�tust j |�ryt d|z��)z] Return the types of the address This can be 'AF_INET', 'AF_UNIX', or 'AF_PIPE' rz\\rrzaddress type of %r unrecognized)�type�tuple�str� startswithr�is_abstract_socket_namespacer,)�addresss r�address_typer=`s\���G�}���� �g��#� �'�"4�"4�V�"<�� �g��#� ��!B�!B�7�!K���:�W�D�E�Erc��eZdZdZdd�Zd�Zd�Zd�Zd�Zd�Z e d��Ze d ��Ze d ��Z d�Zd�Zdd �Zd�Zdd�Zdd�Zd�Zdd�Zd�Zd�Zy)�_ConnectionBaseNc��|j�}|dkrtd��|s |std��||_||_||_y)Nrzinvalid handlez6at least one of `readable` and `writable` must be True)� __index__r,�_handle� _readable� _writable)�self�handle�readable�writables r�__init__z_ConnectionBase.__init__vsO���!�!�#���A�:��-�.�.����H�J� J����!���!��rc�>�|j�|j�yyr�rB�_close�rEs r�__del__z_ConnectionBase.__del__�s���<�<�#��K�K�M�$rc�2�|j�td��y)N�handle is closed)rB�OSErrorrMs r� _check_closedz_ConnectionBase._check_closed�s���<�<���,�-�-� rc�2�|jstd��y)Nzconnection is write-only)rCrQrMs r�_check_readablez_ConnectionBase._check_readable�s���~�~��4�5�5�rc�2�|jstd��y)Nzconnection is read-only)rDrQrMs r�_check_writablez_ConnectionBase._check_writable�s���~�~��3�4�4�rc�t�|jrd|_td��|j�td��)NFzbad message length)rDrC�closerQrMs r�_bad_message_lengthz#_ConnectionBase._bad_message_length�s5���>�>�"�D�N��*�+�+� �J�J�L��*�+�+rc��|jduS)z True if the connection is closedN�rBrMs r�closedz_ConnectionBase.closed�s���|�|�t�#�#rc��|jS)z"True if the connection is readable)rCrMs rrGz_ConnectionBase.readable�����~�~�rc��|jS)z"True if the connection is writable)rDrMs rrHz_ConnectionBase.writable�r^rc�:�|j�|jS)z+File descriptor or handle of the connection)rRrBrMs r�filenoz_ConnectionBase.fileno�s�������|�|�rc�f�|j� |j�d|_yy#d|_wxYw)zClose the connectionNrKrMs rrXz_ConnectionBase.close�s1���<�<�#� $���� �#��� $�� $���s�'� 0c�v�|j�|j�t|�}|jdkDr|j d�}|j }|dkrt d��||krt d��|�||z }n#|dkrt d��||z|kDrt d��|j||||z�y) z,Send the bytes data from a bytes-like objectr�Brzoffset is negativezbuffer length < offsetNzsize is negativezbuffer length < offset + size)rRrV� memoryview�itemsize�cast�nbytesr,�_send_bytes)rE�buf�offset�size�m�ns r� send_bytesz_ConnectionBase.send_bytes�s������������s�O���:�:��>����s��A� �H�H���A�:��1�2�2��v�:��5�6�6��<��v�:�D� �A�X��/�0�0� �d�]�Q� ��<�=�=�����6�&�4�-�0�1rc��|j�|j�|jtj |��y)zSend a (picklable) objectN)rRrVri�_ForkingPickler�dumps�rE�objs r�sendz_ConnectionBase.send�s3��������������.�.�s�3�4rc���|j�|j�|�|dkrtd��|j|�}|�|j �|j�S)z7 Receive bytes data as a bytes object. rznegative maxlength)rRrTr,�_recv_bytesrY�getvalue)rE� maxlengthrjs r� recv_bytesz_ConnectionBase.recv_bytes�sa�� ��������� �Y��]��1�2�2����y�)���;��$�$�&��|�|�~�rc���|j�|j�t|�5}|j}|t |�z}|dkrtd��||kDrtd��|j �}|j�}|||zkrt|j���|jd�|j|||z||z|z�|cddd�S#1swYyxYw)zq Receive bytes data into a writeable bytes-like object. Return the number of bytes read. rznegative offsetzoffset too largeN)rRrTrerf�lenr,rw�tellr rx�seek�readinto)rErjrkrmrf�bytesize�resultrls r�recv_bytes_intoz_ConnectionBase.recv_bytes_into�s��� �������� ��_���z�z�H��#�a�&�(�H���z� �!2�3�3��(�"� �!3�4�4��%�%�'�F��;�;�=�D��&�4�-�'�$�V�_�_�%6�7�7��K�K��N��O�O�A�f��0�%��}��9�;� <��!�_�_�s�B+C!�!C*c��|j�|j�|j�}tj |j��S)zReceive a (picklable) object)rRrTrwrq�loads� getbuffer)rErjs r�recvz_ConnectionBase.recv�s?������������� ���$�$�S�]�]�_�5�5rc�d�|j�|j�|j|�S)z/Whether there is any input available to be read)rRrT�_poll�rErs r�pollz_ConnectionBase.poll�s)�����������z�z�'�"�"rc��|Sr�rMs r� __enter__z_ConnectionBase.__enter__����rc�$�|j�yr�rX�rE�exc_type� exc_value�exc_tbs r�__exit__z_ConnectionBase.__exit__���� � �r)TT)rNr)r)g)�__name__� __module__�__qualname__rBrIrNrRrTrVrY�propertyr\rGrHrarXrorurzr�r�r�r�r�r�rrr?r?ss����G� "��.�6�5�,��$��$���������� $�2�(5���26�#��rr?c�P�eZdZdZdZdZejfd�Zd�Z d d�Z d�Zd�Zy) �PipeConnectionz� Connection class based on a Windows named pipe. Overlapped I/O is used, so the handles must have been created with FILE_FLAG_OVERLAPPED. FNc�d�|j}|�|j�||j�yr)�_send_ov�cancelrB)rE�_CloseHandle�ovs rrLzPipeConnection._closes%�����B��~�� � ������&rc�>�|j�td��tj|j|d��\}}||_ |tj k(r1tj|jgdt�}|tk(sJ�d|_|jd�\}}|tjk(rttjd��|dk(sJ�|t!|�k(sJ�y#|j��xYw#d|_|jd�\}}wxYw)Nz/concurrent send_bytes() calls are not supportedT�� overlappedFrPr)r�r,�_winapi� WriteFilerB�ERROR_IO_PENDING�WaitForMultipleObjects�eventrrr��GetOverlappedResult�ERROR_OPERATION_ABORTEDrQ�errno�EPIPEr|)rErjr��err�waitres�nwrittens rrizPipeConnection._send_bytess ���}�}�(� �"5�6�6��'�'����c�d�K�G�B���D�M� =��'�2�2�2�%�<�<���� �E�8�5�G�"�m�3�3�3� !%�� � "� 6� 6�t� <� ��#��g�5�5�5��e�k�k�+=�>�>��!�8�O�8��s�3�x�'�'�'�� �� � ���� $�� � "� 6� 6�t� <� ��#�s�AC)�)C<�<C?�?Dc���|jrd|_tj�S|�dnt|d�} t j |j|d��\}} |tjk(r1t j|jgdt�}|tk(sJ�|jd�\}}|dk(r5tj�}|j|j��|S|tj k(r|j#||�S t-d��#|j��xYw#|jd�\}}|dk(r9tj�}|j|j��|ccYS|tj k(r|j#||�ccYSwxYw#t$$r)}|j&tj(k(rt*��d}~wwxYw)NF�Tr�rz.shouldn't get here; expected KeyboardInterrupt)�_got_empty_message�io�BytesIO�minr��ReadFilerBr�r�r�rrr�r��writer��ERROR_MORE_DATA�_get_more_datarQ�winerror�ERROR_BROKEN_PIPE�EOFError�RuntimeError) rE�maxsize�bsizer�r�r��nread�f�es rrwzPipeConnection._recv_bytes6s����&�&�*/��'��z�z�|�#�&���C���4E���%�.�.�t�|�|�U�;?�A�G�B��D��'�":�":�:�&-�&D�&D�!#��� �E�8�'=�G�#*�m�#;�;�#;� &(�%;�%;�D�%A� ��s��!�8� "� � ��A��G�G�B�L�L�N�3�#$�H� �G�$;�$;�;�#'�#6�#6�r�7�#C�C�<��O�P�P��!�� � ����%'�%;�%;�D�%A� ��s��!�8� "� � ��A��G�G�B�L�L�N�3�#$�H� �G�$;�$;�;�#'�#6�#6�r�7�#C�C�<�����z�z�W�%>�%>�>�&���� �s\�%F8�AD"�#A F8�1$F8�"D5�5D8�8AF5� F8�'F5�2F8�4F5�5F8�8 G*�$G%�%G*c��|js%tj|j�ddk7ryt t|g|��S)NrT)r�r�� PeekNamedPiperB�boolrr�s rr�zPipeConnection._pollVs>���'�'��-�-�d�l�l�;�A�>�!�C����d�V�W�-�.�.rc���|j�}tj�}|j|�t j |j�d}|dkDsJ�|�!t|�|z|kDr|j�t j|j|d��\}}|jd�\}}|dk(sJ�||k(sJ�|j|j��|S)NrrTr�)r�r�r�r�r�r�rBr|rYr�r�)rEr�r�rjr��leftr��rbytess rr�zPipeConnection._get_more_data\s����,�,�.�C�� � ��A� �G�G�C�L��(�(����6�q�9�D��!�8�O�8��"�s�3�x�$���'@��(�(�*��&�&�t�|�|�T�d�K�G�B���0�0��6�K�F�C��!�8�O�8��T�>�!�>� �G�G�B�L�L�N�#��Hrr) r�r�r��__doc__r�r�r��CloseHandlerLrirwr�r�r�rrr�r�s8�� � #����&-�&9�&9� '� (�4 Q�@ /� rr�c���eZdZdZer(ejfd�ZejZ ejZn'ejfd�ZejZ ejZe fd�Zefd�Zd�Zd d�Zd �Zy)� Connectionzo Connection class based on an arbitrary file descriptor (Unix only), or a socket handle (Windows). c�(�||j�yrr[�rErLs rrLzConnection._closes����4�<�<� rc�(�||j�yrr[r�s rrLzConnection._closexr�rc�b�t|�} ||j|�}||z}|dk(ry||d}�$�Nr)r|rB)rErjr�� remainingrns r�_sendzConnection._send}sA����H� ���d�l�l�C�(�A���N�I��A�~���a�b�'�C�rc���tj�}|j}|}|dkDrK|||�}t|�}|dk(r||k(rt�td��|j |�||z}|dkDr�K|S)Nrzgot end of file during message)r�r�rBr|r�rQr�)rErl�readrjrFr��chunkrns r�_recvzConnection._recv�s|���j�j�l������� ��!�m����+�E��E� �A��A�v���$�"�N�!�"B�C�C��I�I�e����N�I��!�m�� rc��t|�}|dkDr`tjdd�}tjd|�}|j|�|j|�|j|�ytjd|�}|dkDr#|j|�|j|�y|j||z�y)Ni����!i����!Qi@)r|�struct�packr�)rErjrn� pre_header�headers rrizConnection._send_bytes�s�����H���z�>����T�2�.�J��[�[��q�)�F��J�J�z�"��J�J�v���J�J�s�O��[�[��q�)�F��5�y�� � �6�"�� � �3��� � �6�C�<�(rNc��|jd�}tjd|j��\}|dk(r7|jd�}tjd|j��\}|�||kDry|j|�S)N�r�r��r�)r�r��unpackrx)rEr�rjrls rrwzConnection._recv_bytes�sq���j�j��m��� � �d�C�L�L�N�3����2�:��*�*�Q�-�C��M�M�$�����7�E�D���4�'�>���z�z�$��rc�2�t|g|�}t|�Sr)rr�)rEr�rs rr�zConnection._poll�s���$���!���A�w�rr)r�r�r�r�r��_multiprocessing�closesocketrLru�_writer��_readr(rXr�r�r�r�rirwr�r�rrr�r�lso��� � 0� <� <� !�!�&�&�� �%�%�� "��� !���������%�� %�� )�. �rr�c�P�eZdZdZd d�Zd�Zd�Zed��Zed��Z d�Z d �Zy)rz� Returns a listener object. This is a wrapper for a bound socket which is 'listening' for connections, or for a Windows named pipe. Nc��|xs|xrt|�xst}|xst|�}t|�|dk(rt ||�|_nt |||�|_|�t|t�std��||_ y)Nr�authkey should be a byte string)r=�default_familyr/r5�PipeListener� _listener�SocketListener� isinstance�bytes� TypeError�_authkey)rEr<r.�backlog�authkeys rrIzListener.__init__�s����#�G�=��W�(=�#�"� ��6�.�v�6���� ��Y��)�'�7�;�D�N�+�G�V�W�E�D�N���z�'�5�'A��=�>�>��� rc���|j�td��|jj�}|j�,t ||j�t||j�|S)zz Accept a connection on the bound socket or named pipe of `self`. Returns a `Connection` object. zlistener is closed)r�rQ�acceptr��deliver_challenge�answer_challenge)rE�cs rr�zListener.accept�sW���>�>�!��.�/�/��N�N�!�!�#���=�=�$��a����/��Q�� � �.��rc�P�|j}|�d|_|j�yy)zA Close the bound socket or named pipe of `self`. N)r�rX)rE�listeners rrXzListener.close�s)���>�>����!�D�N��N�N�� rc�.�|jjSr)r��_addressrMs rr<zListener.address�s���~�~�&�&�&rc�.�|jjSr)r��_last_acceptedrMs r� last_acceptedzListener.last_accepted�s���~�~�,�,�,rc��|Srr�rMs rr�zListener.__enter__�r�rc�$�|j�yrr�r�s rr�zListener.__exit__�r�r)NNrN)r�r�r�r�rIr�rXr�r<rr�r�r�rrrr�sH��� � ���'��'��-��-��rrc���|xst|�}t|�|dk(rt|�}nt|�}|�t |t �st d��|�t||�t||�|S)z= Returns a connection to the address of a `Listener` rr�) r=r5� PipeClient�SocketClientr�r�r�r�r�)r<r.r�r�s rrr�sq��� ,�|�G�,�F��V�� ����w�����!����:�g�u�#=��9�:�:�����G�$��!�W�%��Hrc�N�|rotj�\}}|jd�|jd�t|j ��}t|j ��}||fStj�\}}t|d��}t|d��}||fS)�L Returns pair of connection objects at either end of a pipe TF�rH�rG)r4� socketpair�setblockingr��detachr(�pipe)�duplex�s1�s2�c1�c2�fd1�fd2s rrrs�����&�&�(�F�B���N�N�4� ��N�N�4� ��B�I�I�K�(�B��B�I�I�K�(�B��2�v� � �w�w�y�H�C���C�%�0�B��C�%�0�B��2�v� rc ��td�}|r>tj}tjtjz}t t }}n(tj}tj}dt }}tj||tjztjztjtjztjzd||tjtj�}tj||dtjtj tjtj�}tj"|tjdd�tj$|d��}|j'd�\} } | dk(sJ�t)||��}t)||��}||fS) rrrrNTr�rr )r/r��PIPE_ACCESS_DUPLEX�GENERIC_READ� GENERIC_WRITE�BUFSIZE�PIPE_ACCESS_INBOUND�CreateNamedPipe�FILE_FLAG_OVERLAPPED�FILE_FLAG_FIRST_PIPE_INSTANCE�PIPE_TYPE_MESSAGE�PIPE_READMODE_MESSAGE� PIPE_WAIT�NMPWAIT_WAIT_FOREVER�NULL� CreateFile� OPEN_EXISTING�SetNamedPipeHandleState�ConnectNamedPiper�r�) rr<�openmode�access�obsize�ibsize�h1�h2r��_r�rrs rrr(si��$�I�.����1�1�H��)�)�G�,A�,A�A�F�$�g�F�F��2�2�H��*�*�F���F�F� � $� $��X�� <� <�<��1�1�2��%�%��(E�(E�E���� � �v�v�w�;�;��L�L���� � ��V�Q����g�.C�.C��(�(�'�,�,��� �'�'���-�-�t�T� ��-�-�b�T�B� ��/�/��5���3��a�x��x� �B�� 0�� �B�� 0���2�v� rc�$�eZdZdZdd�Zd�Zd�Zy)r�zO Representation of a socket which is bound to an address and listening c���tjtt|��|_ tjdk(r9|jjtjtjd�|jjd�|jj|�|jj|�|jj�|_||_d|_|dk(rCt#j$|�s.t#j&|tj(|fd��|_yd|_y#t$r|jj��wxYw)N�posixrTrr��args�exitpriority)r4�getattr�_socketr(�name� setsockopt� SOL_SOCKET�SO_REUSEADDRr�bind�listen�getsocknamerrQrX�_familyrrr;�Finalize�unlink�_unlink)rEr<r.r�s rrIzSocketListener.__init__Xs���}�}�W�V�V�%<�=��� ��w�w�'�!����'�'��(9�(9�(.�(;�(;�Q�@��L�L�$�$�T�*��L�L���g�&��L�L����(� �L�L�4�4�6�D�M����"����Y��t�'H�'H��'Q��=�=��b�i�i�w�j�q��D�L� �D�L��� ��L�L��� �� �s�B<E�%E)c��|jj�\}|_|jd�t |j��S)NT)r9r�rrr�r�rE�ss rr�zSocketListener.acceptqs9��!%���!4�!4�!6���4�� � � �d���!�(�(�*�%�%rc�� |jj�|j}|�d|_|�yy#|j}|�d|_|�wwxYwr)r9rXrD)rErCs rrXzSocketListener.closevs[�� ��L�L��� ��\�\�F��!�#�����"���\�\�F��!�#�����"�s �:�AN)r)r�r�r�r�rIr�rXr�rrr�r�Ts��� �2&� rr�c��t|�}tjtt|��5}|jd�|j |�t|j ��cddd�S#1swYyxYw)zO Return a connection object connected to the socket given by `address` TN)r=r4r8r�connectr�r)r<r.rGs rr r �sU���'� "�F� ������/� 1�Q� � � �d�� � � �'���!�(�(�*�%� 2� 1� 1�s�;A4�4A=c�6�eZdZdZdd�Zdd�Zd�Zed��Zy) r�z0 Representation of a named pipe Nc��||_|jd��g|_d|_t j d|j�t j|tj|j|jfd��|_ y)NT)�firstz listener created with address=%rrr5) r�_new_handle� _handle_queuerr� sub_debugrBr��_finalize_pipe_listenerrX)rEr<r�s rrIzPipeListener.__init__�sl��#�D�M�"&�"2�"2��"2�">�!?�D��"&�D���N�N�=�t�}�}�M�����l�:�:��(�(�$�-�-�8�q��D�Jrc �~�tjtjz}|r|tjz}tj|j |tjtjztjztjtttjtj�Sr) r�rr r!rrr"r#r$�PIPE_UNLIMITED_INSTANCESrr%r&)rErM�flagss rrNzPipeListener._new_handle�s����.�.��1M�1M�M�E����>�>�>���*�*�� � �u��)�)�G�,I�,I�I��!�!�"��0�0�'�7��,�,�g�l�l�� rc�h�|jj|j��|jjd�} t j |d��} t j|jgdt�} |jd�\}}|dk(sJ�t|�S#|j�t j|��xYw#|jd�\}}|dk(sJ�wxYw#t$r2}|jtjk7r�Yd}~t|�Sd}~wwxYw)NrTr�F)rO�appendrN�popr�r*r�r�rr�r�r�rQr�� ERROR_NO_DATAr�)rErFr��resr1r�r�s rr�zPipeListener.accept�s�����%�%�d�&6�&6�&8�9��'�'�+�+�A�.�F� $��-�-�f��F�� $�!�8�8���� �E�8�5�C� �3�3�D�9�F�A�s��!�8�O�8�!�&�)�)����I�I�K��'�'��/����3�3�D�9�F�A�s��!�8�O�8��� ��:�:��!6�!6�6��7�"�&�)�)��! �s0�C6�&B+�+(C�C�C3�6 D1�?D,�,D1c�h�tjd|�|D]}tj|��y)Nz closing listener with address=%r)rrPr�r�)�queuer<rFs rrQz$PipeListener._finalize_pipe_listener�s)���N�N�=�w�G����#�#�F�+� rr)F) r�r�r�r�rIrNr��staticmethodrQr�rrr�r��s*�� � � � *�. � ,� � ,rr�c �.�t�} tj|d�tj|tjtj zdtjtjtjtj�} tj|tjdd�t!|�S#t$rB}|jtjtjfvst|�r�Yd}~nd}~wwxYw��)zU Return a connection object connected to the pipe given by `address` ��rN)rr�� WaitNamedPiper'rrr&r(r rQr��ERROR_SEM_TIMEOUT�ERROR_PIPE_BUSYrr)r#r�)r<r�hr�s rrr�s��� �O��� ��%�%�g�t�4��&�&��W�1�1�G�4I�4I�I��w�|�|�W�%:�%:��0�0�'�,�,���� �'�'� �w�,�,�d�D� ��a� � ��� ��:�:�g�&?�&?�&-�&=�&=�&?�?�BP�QR�BS��CT�� ��s�BC� D�8D � D�(s#CHALLENGE#s #WELCOME#s #FAILURE#>�md5�sha256�sha384�sha3_256�sha3_384c#�2K�|]}t|����y�wr)r|)�.0r1s r� <genexpr>rkFs����7�&6��c�!�f�&6�s���c��t|�tvrd|fS|jd�rG|jddtdz�x}dkDr(|d|}|t vr||dzd}|j d�|fStd |����) aReturns a digest name and the payload for a response hash. If a legacy protocol is detected based on the message length or contents the digest name returned will be empty to indicate legacy mode where MD5 and no digest prefix should be sent. r$�{�}r�rN�asciizRunsupported message length, missing digest prefix, or unsupported digest: message=)r|�_LEGACY_LENGTHSr:�find�_MAX_DIGEST_LEN�_ALLOWED_DIGESTS�decoder )�message�curly�digest�payloads r�_get_digest_name_and_payloadr|Qs����7�|��&� �7�{�����4� ��,�,�t�Q���(9�:� :��a�?���5�!���%�%��e�A�g�h�'�G��=�=��)�7�2�2� � /�&-�Z� 1�2�2rc��ddl}t|�d}|s" |j||d�j�S|j|||�j�}d|jd�|fzS#t$rd}Y�DwxYw)a�Create a MAC based on authkey and message The MAC algorithm defaults to HMAC-MD5, unless MD5 is not available or the message has a '{digest_name}' prefix. For legacy HMAC-MD5, the response is the raw MAC, otherwise the response is prefixed with '{digest_name}', e.g. b'{sha256}abcdefg...' Note: The MAC protects the entire message including the digest_name prefix. rN�md5�sha256�{%s}%srr)�hmacr|�newrzr,�encode)r�rxr��digest_name�responses r�_create_responser�ks����.�w�7��:�K�� #��8�8�G�W�e�4�;�;�=�=��x�x���+�6�=�=�?�H���*�*�7�3�X�>�>�>��� #�#�K� #�s� A.�.A<�;A<c �d�ddl}t|�\}}|xsd} |j|||�j�}t |�t |�k7r&td|�dt |��dt |�����|j||�std ��y#t$rtd|�d���wxYw) a`Verify MAC challenge If our message did not include a digest_name prefix, the client is allowed to select a stronger digest_name from _ALLOWED_DIGESTS. In case our message is prefixed, a client cannot downgrade to a weaker algorithm, because the MAC is calculated over the entire message including the '{digest_name}' prefix. rNr~zresponse_digest=z unsupportedz expected z of length z got zdigest received was wrong)r�r|r�rzr,r r|�compare_digest)r�rxr�r��response_digest�response_mac�expecteds r�_verify_challenger��s����$@��$J�!�O�\�%�.��O�E��8�8�G�W�o�>�E�E�G���8�}��L�)�)�!��O�.�k�#�h�-��I��<�(�)�+�,� ,����x��6�!�"=�>�>�7�� �E�!�%5�_�$6�l�"C�D�D�E�s�!B�B/r�c���t|t�s#tdjt |����t tkDsJd��tjt �}d|jd�|fz}|jt|z�|jd�} t|||�|jt�y#t$r|jt ��wxYw)N� Authkey must be bytes, not {0!s}zprotocol constraintr�rr�)r�r�r,�formatr7�MESSAGE_LENGTH�_MD5ONLY_MESSAGE_LENGTHr(�urandomr�ro� _CHALLENGErzr��_WELCOMEr �_FAILURE)� connectionr�r�rxr�s rr�r��s����g�u�%��.�5�5�d�7�m�D�F� F��3�3�J�5J�J�3��j�j��(�G��;�-�-�g�6��@�@�G����*�w�.�/��$�$�S�)�H�(��'�7�H�5� ���h�'�� �����h�'� ��s�! C� C$c���t|t�s#tdjt |����|jd�}|j t�std|����|tt�d}t|�tkrtdt|��d���t||�}|j|�|jd�}|tk7rtd��y)Nr�r�z,Protocol error, expected challenge: message=zchallenge too short: z byteszdigest sent was rejected)r�r�r,r�r7rzr:r�r r|r�r�ror�)r�r�rxrzr�s rr�r��s����g�u�%��.�5�5�d�7�m�D�F� F��#�#�C�(�G����j�)�!�?�w�j�A�C� C��c�*�o�&�'�G� �7�|�-�-�!�$9�#�g�,��v�"N�O�O� �g�w� /�F����&�!��$�$�S�)�H��8��!�"<�=�=�rc��eZdZd�Zd�Zd�Zy)�ConnectionWrapperc�n�||_||_||_dD]}t||�}t |||��y)N)rarXr�rzro)�_conn�_dumps�_loadsr8�setattr)rE�connrrr��attrrts rrIzConnectionWrapper.__init__�s:���� �������K�D��$��%�C��D�$��$�Lrc�\�|j|�}|jj|�yr)r�r�ro)rErtrGs rruzConnectionWrapper.send�s"���K�K����� � ���a� rc�X�|jj�}|j|�Sr)r�rzr�rFs rr�zConnectionWrapper.recv�s"���J�J�!�!�#���{�{�1�~�rN)r�r�r�rIrur�r�rrr�r��s��%�!�rr�c�T�tj|fdddd�jd�S)Nr�utf-8)� xmlrpclibrrr�)rts r� _xml_dumpsr��s&���?�?�C�6�4��t�Q�7�>�>�w�G�Grc�X�tj|jd��\\}}|S)Nr�)r�r�rw)rGrt�methods r� _xml_loadsr��s$���_�_�Q�X�X�g�%6�7�N�F�S�F��Jrc��eZdZd�Zy)�XmlListenerc�b�ddlmatj |�}t|tt�Sr�)� xmlrpc.client�clientr�rr�r�r�r�rss rr�zXmlListener.accept�s"��)��o�o�d�#�� ��j�*�=�=rN)r�r�r�r�r�rrr�r��s��>rr�c�J�ddlmatt |i|��t t�Sr�)r�r�r�r�rr�r�)r6�kwdss r� XmlClientr��s��%��V�T�2�T�2�J� �K�Krc��t|�}g}|r�tj|d|�}|tk(r |St|cxkrtt|�zkr nn |tz}nAt|cxkrtt|�zkrntd��|tz}ntd��|j||�||dzd}d}|r��|S)NFzShould not get hererr) �listr�r�rrr|r r�rV)�handlesr�L�readyrYs r�_exhaustive_waitr��s��� ��M������0�0��E�7�C�C��l�"�����#�>� ��A��(>�>��}�$��!�S�D�+;�c�!�f�+D�D�#�#8�9�9��'�'��"�#8�9�9��L�L��3�� ��#�a�%�&� �A��G���rc�V��|�t}n|dkrd}nt|dzdz�}t|�}i�g}t�}t�} |D]�} t |d�} tj|�dd�\}}|t jk(r!|j|�|�|j<�d|rDtj�dddk\r* |jd �\} }|st!|d �rd|_|j%|�d}��t+�j-�|�}|D]}|j/��|D]e} |jd�\} }|t j0k7s�,�|j}|j%|�|dk(s�Rt!|d �s�_d|_�g |j3�fd�|D��|D�cgc] }||vs�|��c}S#t$r"} d| j}}|tvr�Yd} ~ ���d} ~ wwxYw#t$r} | j}Yd} ~ ��>d} ~ wwxYw#t&$r|�|j)�<Y���wxYw#t$r } | j}|tvr�Yd} ~ ��d} ~ wwxYw#|D]}|j/��|D]�} |jd�\} }n+#t$r} | j}|tvr�Yd} ~ nd} ~ wwxYw|t j0k7s�X�|j}|j%|�|dk(s�~t!|d �s��d|_��wxYwcc}w)�� Wait till an object in object_list is ready/readable. Returns list of those objects in object_list which are ready/readable. Nrr^g�?raTrq)�rqFr�c3�(�K�|] }�|���y�wrr�)rjrb�waithandle_to_objs �rrkzwait.<locals>.<genexpr>Ss�����I�=�a�.�q�1�=�s�)r�intr��setr8r�r�rQr�� _ready_errorsr�rVr�r1�getwindowsversionr�r3r��add�AttributeErrorrAr��keysr�r��update)�object_listr�ov_list� ready_objects� ready_handles�orar�r�r�r1r�s @rrrs-����?��G� �q�[��G��'�D�.�3�.�/�G��;�'�������� ��� �6 8� ��$�$�Q��1�F� "�")�"2�"2�6�8�Q��"E���C� �g�6�6�6����r�*�67�)�"�(�(�3� �#�"7�"7�"9�"�1�"=��"G�1�)+�)?�)?��)F���3�$'�7�1�6J�+K�7;�� 4�%�)�)�!�,�"#��=!�@-�->�-C�-C�-E�w�O�M���� � �������3�3�D�9�F�A�s� �'�9�9�9�)�"�(�(�3�A�!�%�%�a�(��a�x�#�1�&:�;�37�A�0�� ���I�=�I�I�&�=�;�a�!�}�*<��;�=�=��_#�"�"&�� � �C���m�3�!�4��"�� $+�1�&'�j�j���1��-&�9�78�%�a�k�k�m�4�9��N���*�*�C��-�/��0������� � �������3�3�D�9�F�A�s�����*�*�C��-�/��0�����'�9�9�9�)�"�(�(�3�A�!�%�%�a�(��a�x�#�1�&:�;�37�A�0���">s��I4�H%�G�:AI4�H�AI4�I� L&� L&� G?�G:�4I4�:G?�?I4� H"�H�I4�H"�"I4�%I�I4�I�I4� I1�I,�,I1�4L#�J'�&L#�' K �0K �L#� K �L#�&%L#�L#� L#�PollSelectorc��t�5}|D]"}|j|tj��$|�t j �|z} |j |�}|r(|D��cgc]\}}|j��c}}cddd�S|�'t j �z }|dkr|cddd�S�ecc}}w#1swYyxYw)r�Nr)� _WaitSelector�register� selectors� EVENT_READrr�select�fileobj)r�r�selectorrt�deadliner��key�eventss rrrbs����_��"���!�!�#�y�';�';�<�#��"��>�>�+�g�5��� ����0���=B�C�U�M�S�&�C�K�K�U�C��_��*�"*�T�^�^�-=�"=��"�Q�;�#(��_���D��_�s$�AB8�%B2�;B8�B8�1B8�8Cc� �|j�}tj|tjtj�5}ddlm}|j|�}t||j|jffcddd�S#1swYyxYw)Nr)�resource_sharer)rar4�fromfdr�SOCK_STREAMr$r�� DupSocket�rebuild_connectionrGrH)r�rFrGr��dss r�reduce_connectionr�~s`������� �]�]�6�6�>�>�6�3E�3E� F�!�)� �*�*�1�-�B�%��D�M�M�4�=�=�'I�I�G� F� F�s�6B�B c�X�|j�}t|j�||�Sr�rr�)r�rGrH�socks rr�r��s"���y�y�{���$�+�+�-��8�<�<rc��|jrtjnd|jrtjndz}tj|j�|�}t||j|jffSr�) rGr��FILE_GENERIC_READrH�FILE_GENERIC_WRITEr� DupHandlera�rebuild_pipe_connection)r�r,�dhs r�reduce_pipe_connectionr��s^��04� � �7�,�,�1�15���7�-�-�A�G�� � � ������ 7��&��T�]�]�D�M�M�(J�J�Jrc�<�|j�}t|||�Sr)rr�)r�rGrHrFs rr�r��s��������f�h��9�9rc��tj|j��}t||j|j ffSr)r�DupFdrar�rGrH)r��dfs rr�r��s0�� �_�_�T�[�[�]� +��!�B�� � �t�}�}�#E�E�Erc�<�|j�}t|||�Srr�)r�rGrH�fds rr�r��s�� �Y�Y�[���"�h��1�1r)NN)T)rr)U�__all__r�r�r(r1r4r�rr%� itertoolsr�r$rr r �contextr�ForkingPicklerrqr�rr rr�ImportErrorr2r�CONNECTION_TIMEOUT�countr+r��familiesr3rrr/r5r=r?r�r��objectrrrr�r r�rr�r�r�r�� frozensetrv�maxrur��_MD5_DIGEST_LENrsr|r�r�r�r�r�r�r�r�r�r�r�r��ERROR_NETNAME_DELETEDr�rr�r�r��SelectSelectorr�r�r�r�r�r�rr�<module>r�s���3��� � � � � ������1���*�*����O�O������ ���!� ����;�� �6�9���N�����H��<�<�7���N�����H�-�&� �0� F� F�&T�T�n�]��]�@M��M�h;�v�;�| �*�<�<�7���&&�X)�V�)�X&��<�<�7��6,�v�6,�p!�>�� � �����r�@�B���7�&6�7�7������*�O�<��2�4?�8?�2(�5�(�*>�%�>�* �� �H��>�(�>�L��<�<�7���(�.�.��0M�0M�N�M�L>�`� �y�.�)�!�.�.� �!�0�0� �)�6�<�<�7��J�=��I���z�#4�5�K� :��I���~�'=�>�F�2��I���z�#4�5��s#�� �|�|�w�� ��G��s�H8�8I�IPK:W�\�mh�B�B)__pycache__/context.cpython-312.opt-1.pycnu�[���� T��h�-����ddlZddlZddlZddlmZddlmZdZGd�de�ZGd�d e�Z Gd �de�Z Gd�d e�ZGd�de�Z Gd�dej�ZGd�de �Zej"dk7r�Gd�dej�ZGd�dej�ZGd�dej�ZGd�de �ZGd�de �ZGd�d e �Ze�e�e�d!�Zej"d"k(reed#�Zn@eed$�Zn4Gd%�dej�ZGd&�de �Zd#e�iZeed#�Zd'�Zej6�Zd(�Zd)�Zd*�Zy)+�N�)�process)� reduction�c��eZdZy)�ProcessErrorN��__name__� __module__�__qualname__r��0/usr/lib64/python3.12/multiprocessing/context.pyrr���r rc��eZdZy)�BufferTooShortNr rr rrrrr rc��eZdZy)�TimeoutErrorNr rr rrrrr rc��eZdZy)�AuthenticationErrorNr rr rrrrr rc��eZdZeZeZeZeZeej�Z eej�Z eej�Zd�Zd�Z d"d�Zd�Zd�Zd#d�Zd$d �Zd$d �Zd�Zd%d�Zd&d �Zd&d�Zd�Z d'd�Zd�Zd�Zdd�d�Zdd�d�Zd�Zd�Zd#d�Z d�Z!d�Z"d�Z#d#d�Z$d(d�Z%d(d�Z&e'd��Z(e(jRd ��Z(d!�Z*y))�BaseContextc�H�tj�}|�td��|S)z(Returns the number of CPUs in the systemzcannot determine number of cpus)�os� cpu_count�NotImplementedError)�self�nums rrzBaseContext.cpu_count)s#���l�l�n���;�%�&G�H�H��Jr c�`�ddlm}||j���}|j�|S)z�Returns 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)rr�ms r�ManagerzBaseContext.Manager1s(�� *��D�,�,�.�/�� ��� ��r Tc��ddlm}||�S)z1Returns two connection object connected by a piper)�Pipe)� connectionr()r�duplexr(s rr(zBaseContext.Pipe<s��$��F�|�r c�<�ddlm}||j���S)z#Returns a non-recursive lock objectr)�Lockr )�synchronizer,r#)rr,s rr,zBaseContext.LockAs��%���(�(�*�+�+r c�<�ddlm}||j���S)zReturns a recursive lock objectr)�RLockr )r-r/r#)rr/s rr/zBaseContext.RLockF���&���)�)�+�,�,r Nc�>�ddlm}|||j���S)zReturns a condition objectr)� Conditionr )r-r2r#)r�lockr2s rr2zBaseContext.ConditionKs��*���4�#3�#3�#5�6�6r c�>�ddlm}|||j���S)zReturns a semaphore objectr)� Semaphorer )r-r5r#)r�valuer5s rr5zBaseContext.SemaphorePs��*���D�$4�$4�$6�7�7r c�>�ddlm}|||j���S)z"Returns a bounded semaphore objectr)�BoundedSemaphorer )r-r8r#)rr6r8s rr8zBaseContext.BoundedSemaphoreUs��1���4�+;�+;�+=�>�>r c�<�ddlm}||j���S)zReturns an event objectr)�Eventr )r-r:r#)rr:s rr:zBaseContext.EventZr0r c�B�ddlm}|||||j���S)zReturns a barrier objectr)�Barrierr )r-r<r#)r�parties�action�timeoutr<s rr<zBaseContext.Barrier_s��(��w���T�5E�5E�5G�H�Hr c�>�ddlm}|||j���S)�Returns a queue objectr)�Queuer )�queuesrBr#)r�maxsizerBs rrBzBaseContext.Queueds��!��W�$�"2�"2�"4�5�5r c�>�ddlm}|||j���S)rAr)� JoinableQueuer )rCrFr#)rrDrFs rrFzBaseContext.JoinableQueueis��)��W�$�*:�*:�*<�=�=r c�<�ddlm}||j���S)rAr)�SimpleQueuer )rCrHr#)rrHs rrHzBaseContext.SimpleQueuens��'��t�/�/�1�2�2r c�D�ddlm}||||||j���S)zReturns a process pool objectr)�Pool)�context)�poolrJr#)r� processes�initializer�initargs�maxtasksperchildrJs rrJzBaseContext.Poolss)�� ��I�{�H�6F� �,�,�.�0� 0r c� �ddlm}||g|���S)zReturns a shared objectr)�RawValue)�sharedctypesrR)r�typecode_or_type�argsrRs rrRzBaseContext.RawValuezs��*��(�0�4�0�0r c� �ddlm}|||�S)zReturns a shared arrayr)�RawArray)rSrW)rrT�size_or_initializerrWs rrWzBaseContext.RawArrays��*��(�*=�>�>r )r3c�D�ddlm}||g|��||j�d��S)z$Returns a synchronized shared objectr)�Value�r3r!)rSrZr#)rrTr3rUrZs rrZzBaseContext.Value�s/��'��%�-��-�4��)�)�+�-� -r c�B�ddlm}|||||j���S)z#Returns a synchronized shared arrayr)�Arrayr[)rSr]r#)rrTrXr3r]s rr]zBaseContext.Array�s&��'��%�':���)�)�+�-� -r c�j�tjdk(r ttdd�rddlm}|�yyy)z�Check 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�spawnra)rras rrazBaseContext.freeze_support�s-���<�<�7�"�w�s�H�e�'D�-���(E�"r c��ddlm}|�S)zZReturn package logger -- if it does not already exist then it is created. r)� get_logger)�utilrg)rrgs rrgzBaseContext.get_logger�s�� %��|�r c��ddlm}||�S)z8Turn on logging and add a handler which prints to stderrr)� log_to_stderr)rhrj)r�levelrjs rrjzBaseContext.log_to_stderr�s��'��U�#�#r c��ddlm}y)zVInstall support for sending connections and sockets between processes r)r)N)�r))rr)s r�allow_connection_picklingz%BaseContext.allow_connection_pickling�s�� !r c� �ddlm}||�y)z�Sets 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)rerp)r� executablerps rrpzBaseContext.set_executable�s�� *��z�"r c� �ddlm}||�y)zkSet list of module names to try to load in forkserver process. This is really just a hint. r)�set_forkserver_preloadN)� forkserverrs)r�module_namesrss rrsz"BaseContext.set_forkserver_preload�s�� 7��|�,r c�z�|�|S t|}|j�|S#t$rtd|z�d�wxYw)Nzcannot find context for %r)�_concrete_contexts�KeyError� ValueError�_check_available)r�methodr!s rr#zBaseContext.get_context�sU���>��K� N�$�V�,�C� ����� ��� N��9�F�B�C��M� N�s� !�:c��|jS�N)�_name�r� allow_nones r�get_start_methodzBaseContext.get_start_method�s���z�z�r c��td��)Nz+cannot set start method of concrete context)ry�rr{�forces r�set_start_methodzBaseContext.set_start_method�s���F�G�Gr c�4�t�jd�S)z_Controls how objects will be reduced to a form that can be shared with other processes.r)�globals�get�rs r�reducerzBaseContext.reducer�s���y�}�}�[�)�)r c��|t�d<y)Nr)r�)rrs rr�zBaseContext.reducer�s��!*�� �+�r c��yr}rr�s rrzzBaseContext._check_available�s��r )Tr})r)NN)r)NNrN�F)+r rrrrrr�staticmethodr�current_process�parent_process�active_childrenrr&r(r,r/r2r5r8r:r<rBrFrHrJrRrWrZr]rargrjrnrprsr#r�r��propertyr��setterrzrr rrrs���L�#�N��L�-��"�7�#:�#:�;�O�!�'�"8�"8�9�N�"�7�#:�#:�;�O�� �� ,� -� 7� 8� ?� -� I� 6� >� 3� ?A�"�0�1� ?� 37�-�DH�-���$� !�#�-���H��*��*� �^�^�+��+� r rc�0�eZdZdZed��Zed��Zy)�ProcessNc�\�tj�jj|�Sr})�_default_contextr#r��_Popen)�process_objs rr�zProcess._Popen�s"���+�+�-�5�5�<�<�[�I�Ir c�Z�tj�jj�Sr})r�r#r��_after_forkrr rr�zProcess._after_fork�s ���+�+�-�5�5�A�A�C�Cr �r rr� _start_methodr�r�r�rr rr�r��s1���M��J��J��D��Dr r�c�@��eZdZeZd�Zd�fd� Zdd�Zdd�Zd�Z�xZ S)�DefaultContextc� �||_d|_yr})r��_actual_context)rrKs r�__init__zDefaultContext.__init__�s�� '���#��r c�x��|�)|j�|j|_|jSt�|� |�Sr})r�r��superr#)rr{� __class__s �rr#zDefaultContext.get_context�s>����>��#�#�+�'+�'<�'<��$��'�'�'��7�&�v�.�.r c�z�|j� |std��|� |rd|_y|j|�|_y)Nzcontext has already been set)r��RuntimeErrorr#r�s rr�zDefaultContext.set_start_method�sA�����+�E��=�>�>��>�e�#'�D� ��#�/�/��7��r c�n�|j�|ry|j|_|jjSr})r�r�r~rs rr�zDefaultContext.get_start_method�s4�����'���#'�#8�#8�D� ��#�#�)�)�)r c��tjdk(rdgStjdk(rddgnddg}tjr|j d�|S)z=Returns a list of the supported start methods, default first.r_re�darwin�forkrt)rbrcr�HAVE_SEND_HANDLE�append)r�methodss r�get_all_start_methodsz$DefaultContext.get_all_start_methodssM���<�<�7�"��9��+.�<�<�8�+C�w��'�&�RY�IZ�G��)�)����|�,��Nr r}r�) r rrr�r�r#r�r�r�� __classcell__)r�s@rr�r��s!����G�$�/�8�*�r r�r_c� �eZdZdZed��Zy)�ForkProcessr�c��ddlm}||�S�Nr)�Popen)� popen_forkr��r�r�s rr�zForkProcess._Popens��)���%�%r N�r rrr�r�r�rr rr�r�s��� � � &� � &r r�c�0�eZdZdZed��Zed��Zy)�SpawnProcessrec��ddlm}||�Sr�)�popen_spawn_posixr�r�s rr�zSpawnProcess._Popen���0���%�%r c��yr}rrr rr�zSpawnProcess._after_fork#��� r Nr�rr rr�r��-��� � � &� � &� � � � r r�c� �eZdZdZed��Zy)�ForkServerProcessrtc��ddlm}||�Sr�)�popen_forkserverr�r�s rr�zForkServerProcess._Popen*s��/���%�%r Nr�rr rr�r�(s��$� � � &� � &r r�c��eZdZdZeZy)�ForkContextr�N)r rrr~r�r�rr rr�r�/s�����r r�c��eZdZdZeZy��SpawnContextreN�r rrr~r�r�rr rr�r�3������r r�c��eZdZdZeZd�Zy)�ForkServerContextrtc�:�tjstd��y)Nz%forkserver start method not available)rr�ryr�s rrzz"ForkServerContext._check_available:s���-�-� �!H�I�I�.r N)r rrr~r�r�rzrr rr�r�7s����#�� Jr r�)r�rertr�rer�c�0�eZdZdZed��Zed��Zy)r�rec��ddlm}||�Sr�)�popen_spawn_win32r�r�s rr�zSpawnProcess._PopenNr�r c��yr}rrr rr�zSpawnProcess._after_forkSr�r Nr�rr rr�r�Lr�r c��eZdZdZeZyr�r�rr rr�r�Xr�r c�(�t|t_yr})rwr�r�)r{s r�_force_start_methodr�es��'9�&�'A��$r c�$�ttdd�S)N�spawning_popen)rd�_tlsrr r�get_spawning_popenr�ns���4�)�4�0�0r c��|t_yr})r�r�)�popens r�set_spawning_popenr�qs ���D�r c�Z�t��!tdt|�jz��y)NzF%s objects should only be shared between processes through inheritance)r�r��typer )�objs r�assert_spawningr�ts4����#�� #�%)�#�Y�%7�%7� 8�� �$r ) rrb� threadingrmrr�__all__� Exceptionrrrr�objectr�BaseProcessr�r�rcr�r�r�r�r�r�rwr�r��localr�r�r�r�rr r�<module>r�s��� � ���� �� �9� � �\� � �<� � �,� �x �&�x �|D�g�!�!�D�&�[�&�Z�<�<�7��&�g�)�)�&� �w�*�*� �&�G�/�/�&��k���{��J�K�J�� ���'�)��� �|�|�x��*�*<�W�*E�F��)�*<�V�*D�E�� �w�*�*� ��{�� �����&�&8��&A�B��B��y�����1� �r PK:W�\���9=9=)__pycache__/context.cpython-312.opt-2.pycnu�[���� T��h�-����ddlZddlZddlZddlmZddlmZdZGd�de�ZGd�d e�Z Gd �de�Z Gd�d e�ZGd�de�Z Gd�dej�ZGd�de �Zej"dk7r�Gd�dej�ZGd�dej�ZGd�dej�ZGd�de �ZGd�de �ZGd�d e �Ze�e�e�d!�Zej"d"k(reed#�Zn@eed$�Zn4Gd%�dej�ZGd&�de �Zd#e�iZeed#�Zd'�Zej6�Zd(�Zd)�Zd*�Zy)+�N�)�process)� reduction�c��eZdZy)�ProcessErrorN��__name__� __module__�__qualname__r��0/usr/lib64/python3.12/multiprocessing/context.pyrr���r rc��eZdZy)�BufferTooShortNr rr rrrrr rc��eZdZy)�TimeoutErrorNr rr rrrrr rc��eZdZy)�AuthenticationErrorNr rr rrrrr rc��eZdZeZeZeZeZeej�Z eej�Z eej�Zd�Zd�Z d"d�Zd�Zd�Zd#d�Zd$d �Zd$d �Zd�Zd%d�Zd&d �Zd&d�Zd�Z d'd�Zd�Zd�Zdd�d�Zdd�d�Zd�Zd�Zd#d�Z d�Z!d�Z"d�Z#d#d�Z$d(d�Z%d(d�Z&e'd��Z(e(jRd ��Z(d!�Z*y))�BaseContextc�J� tj�}|�td��|S)Nzcannot determine number of cpus)�os� cpu_count�NotImplementedError)�self�nums rrzBaseContext.cpu_count)s&��6��l�l�n���;�%�&G�H�H��Jr c�b� ddlm}||j���}|j�|S)Nr)�SyncManager��ctx)�managersr�get_context�start)rr�ms r�ManagerzBaseContext.Manager1s-�� � *��D�,�,�.�/�� ��� ��r Tc� � ddlm}||�S)Nr)�Pipe)� connectionr()r�duplexr(s rr(zBaseContext.Pipe<s��?�$��F�|�r c�>� ddlm}||j���S)Nr)�Lockr )�synchronizer,r#)rr,s rr,zBaseContext.LockAs��1�%���(�(�*�+�+r c�>� ddlm}||j���S)Nr)�RLockr )r-r/r#)rr/s rr/zBaseContext.RLockFs��-�&���)�)�+�,�,r Nc�@� ddlm}|||j���S)Nr)� Conditionr )r-r1r#)r�lockr1s rr1zBaseContext.ConditionKs��(�*���4�#3�#3�#5�6�6r c�@� ddlm}|||j���S)Nr)� Semaphorer )r-r4r#)r�valuer4s rr4zBaseContext.SemaphorePs��(�*���D�$4�$4�$6�7�7r c�@� ddlm}|||j���S)Nr)�BoundedSemaphorer )r-r7r#)rr5r7s rr7zBaseContext.BoundedSemaphoreUs��0�1���4�+;�+;�+=�>�>r c�>� ddlm}||j���S)Nr)�Eventr )r-r9r#)rr9s rr9zBaseContext.EventZs��%�&���)�)�+�,�,r c�D� ddlm}|||||j���S)Nr)�Barrierr )r-r;r#)r�parties�action�timeoutr;s rr;zBaseContext.Barrier_s"��&�(��w���T�5E�5E�5G�H�Hr c�@� ddlm}|||j���S)Nr)�Queuer )�queuesr@r#)r�maxsizer@s rr@zBaseContext.Queueds��$�!��W�$�"2�"2�"4�5�5r c�@� ddlm}|||j���S)Nr)� JoinableQueuer )rArDr#)rrBrDs rrDzBaseContext.JoinableQueueis��$�)��W�$�*:�*:�*<�=�=r c�>� ddlm}||j���S)Nr)�SimpleQueuer )rArFr#)rrFs rrFzBaseContext.SimpleQueuens��$�'��t�/�/�1�2�2r c�F� ddlm}||||||j���S)Nr)�Pool)�context)�poolrHr#)r� processes�initializer�initargs�maxtasksperchildrHs rrHzBaseContext.Poolss*��+���I�{�H�6F� �,�,�.�0� 0r c�"� ddlm}||g|���S)Nr)�RawValue)�sharedctypesrP)r�typecode_or_type�argsrPs rrPzBaseContext.RawValuezs��%�*��(�0�4�0�0r c�"� ddlm}|||�S)Nr)�RawArray)rQrU)rrR�size_or_initializerrUs rrUzBaseContext.RawArrays��$�*��(�*=�>�>r )r2c�F� ddlm}||g|��||j�d��S)Nr)�Value�r2r!)rQrXr#)rrRr2rSrXs rrXzBaseContext.Value�s2��2�'��%�-��-�4��)�)�+�-� -r c�D� ddlm}|||||j���S)Nr)�ArrayrY)rQr[r#)rrRrVr2r[s rr[zBaseContext.Array�s)��1�'��%�':���)�)�+�-� -r c�l� tjdk(r ttdd�rddlm}|�yyy)N�win32�frozenFr)�freeze_support)�sys�platform�getattr�spawnr_)rr_s rr_zBaseContext.freeze_support�s2�� ��<�<�7�"�w�s�H�e�'D�-���(E�"r c�� ddlm}|�S)Nr)� get_logger)�utilre)rres rrezBaseContext.get_logger�s�� � %��|�r c� � ddlm}||�S)Nr)� log_to_stderr)rfrh)r�levelrhs rrhzBaseContext.log_to_stderr�s��F�'��U�#�#r c�� ddlm}y)Nr)r))�r))rr)s r�allow_connection_picklingz%BaseContext.allow_connection_pickling�s�� � !r c�"� ddlm}||�y)Nr)�set_executable)rcrn)r� executablerns rrnzBaseContext.set_executable�s�� � *��z�"r c�"� ddlm}||�y)Nr)�set_forkserver_preload)� forkserverrq)r�module_namesrqs rrqz"BaseContext.set_forkserver_preload�s�� � 7��|�,r c�z�|�|S t|}|j�|S#t$rtd|z�d�wxYw)Nzcannot find context for %r)�_concrete_contexts�KeyError� ValueError�_check_available)r�methodr!s rr#zBaseContext.get_context�sU���>��K� N�$�V�,�C� ����� ��� N��9�F�B�C��M� N�s� !�:c��|jS�N)�_name�r� allow_nones r�get_start_methodzBaseContext.get_start_method�s���z�z�r c��td��)Nz+cannot set start method of concrete context)rw�rry�forces r�set_start_methodzBaseContext.set_start_method�s���F�G�Gr c�6� t�jd�S�Nr)�globals�get�rs r�reducerzBaseContext.reducer�s�� (��y�}�}�[�)�)r c��|t�d<yr�)r�)rrs rr�zBaseContext.reducer�s��!*�� �+�r c��yr{rr�s rrxzBaseContext._check_available�s��r )Tr{)r)NN)r)NNrN�F)+r rrrrrr�staticmethodr�current_process�parent_process�active_childrenrr&r(r,r/r1r4r7r9r;r@rDrFrHrPrUrXr[r_rerhrlrnrqr#rr��propertyr��setterrxrr rrrs���L�#�N��L�-��"�7�#:�#:�;�O�!�'�"8�"8�9�N�"�7�#:�#:�;�O�� �� ,� -� 7� 8� ?� -� I� 6� >� 3� ?A�"�0�1� ?� 37�-�DH�-���$� !�#�-���H��*��*� �^�^�+��+� r rc�0�eZdZdZed��Zed��Zy)�ProcessNc�\�tj�jj|�Sr{)�_default_contextr#r��_Popen)�process_objs rr�zProcess._Popen�s"���+�+�-�5�5�<�<�[�I�Ir c�Z�tj�jj�Sr{)r�r#r��_after_forkrr rr�zProcess._after_fork�s ���+�+�-�5�5�A�A�C�Cr �r rr� _start_methodr�r�r�rr rr�r��s1���M��J��J��D��Dr r�c�@��eZdZeZd�Zd�fd� Zdd�Zdd�Zd�Z�xZ S)�DefaultContextc� �||_d|_yr{)r��_actual_context)rrIs r�__init__zDefaultContext.__init__�s�� '���#��r c�x��|�)|j�|j|_|jSt�|� |�Sr{)r�r��superr#)rry� __class__s �rr#zDefaultContext.get_context�s>����>��#�#�+�'+�'<�'<��$��'�'�'��7�&�v�.�.r c�z�|j� |std��|� |rd|_y|j|�|_y)Nzcontext has already been set)r��RuntimeErrorr#r�s rr�zDefaultContext.set_start_method�sA�����+�E��=�>�>��>�e�#'�D� ��#�/�/��7��r c�n�|j�|ry|j|_|jjSr{)r�r�r|r}s rrzDefaultContext.get_start_method�s4�����'���#'�#8�#8�D� ��#�#�)�)�)r c�� tjdk(rdgStjdk(rddgnddg}tjr|j d�|S)Nr]rc�darwin�forkrr)r`rar�HAVE_SEND_HANDLE�append)r�methodss r�get_all_start_methodsz$DefaultContext.get_all_start_methodssP��K��<�<�7�"��9��+.�<�<�8�+C�w��'�&�RY�IZ�G��)�)����|�,��Nr r{r�) r rrr�r�r#r�rr�� __classcell__)r�s@rr�r��s!����G�$�/�8�*�r r�r]c� �eZdZdZed��Zy)�ForkProcessr�c��ddlm}||�S�Nr)�Popen)� popen_forkr��r�r�s rr�zForkProcess._Popens��)���%�%r N�r rrr�r�r�rr rr�r�s��� � � &� � &r r�c�0�eZdZdZed��Zed��Zy)�SpawnProcessrcc��ddlm}||�Sr�)�popen_spawn_posixr�r�s rr�zSpawnProcess._Popen���0���%�%r c��yr{rrr rr�zSpawnProcess._after_fork#��� r Nr�rr rr�r��-��� � � &� � &� � � � r r�c� �eZdZdZed��Zy)�ForkServerProcessrrc��ddlm}||�Sr�)�popen_forkserverr�r�s rr�zForkServerProcess._Popen*s��/���%�%r Nr�rr rr�r�(s��$� � � &� � &r r�c��eZdZdZeZy)�ForkContextr�N)r rrr|r�r�rr rr�r�/s�����r r�c��eZdZdZeZy��SpawnContextrcN�r rrr|r�r�rr rr�r�3������r r�c��eZdZdZeZd�Zy)�ForkServerContextrrc�:�tjstd��y)Nz%forkserver start method not available)rr�rwr�s rrxz"ForkServerContext._check_available:s���-�-� �!H�I�I�.r N)r rrr|r�r�rxrr rr�r�7s����#�� Jr r�)r�rcrrr�rcr�c�0�eZdZdZed��Zed��Zy)r�rcc��ddlm}||�Sr�)�popen_spawn_win32r�r�s rr�zSpawnProcess._PopenNr�r c��yr{rrr rr�zSpawnProcess._after_forkSr�r Nr�rr rr�r�Lr�r c��eZdZdZeZyr�r�rr rr�r�Xr�r c�(�t|t_yr{)rur�r�)rys r�_force_start_methodr�es��'9�&�'A��$r c�$�ttdd�S)N�spawning_popen)rb�_tlsrr r�get_spawning_popenr�ns���4�)�4�0�0r c��|t_yr{)r�r�)�popens r�set_spawning_popenr�qs ���D�r c�Z�t��!tdt|�jz��y)NzF%s objects should only be shared between processes through inheritance)r�r��typer )�objs r�assert_spawningr�ts4����#�� #�%)�#�Y�%7�%7� 8�� �$r ) rr`� threadingrkrr�__all__� Exceptionrrrr�objectr�BaseProcessr�r�rar�r�r�r�r�r�rur�r��localr�r�r�r�rr r�<module>r�s��� � ���� �� �9� � �\� � �<� � �,� �x �&�x �|D�g�!�!�D�&�[�&�Z�<�<�7��&�g�)�)�&� �w�*�*� �&�G�/�/�&��k���{��J�K�J�� ���'�)��� �|�|�x��*�*<�W�*E�F��)�*<�V�*D�E�� �w�*�*� ��{�� �����&�&8��&A�B��B��y�����1� �r PK:W�\�q�J��0dummy/__pycache__/__init__.cpython-312.opt-1.pycnu�[���� T��h���L�gd�ZddlZddlZddlZddlZddlmZddlmZmZm Z m Z ddlmZmZm Z ddlmZGd�d ej �ZeZej&Zej*�e�_d �Zd�ZGd�d e�ZeZeZdd�ZGd�de�Zd�Zd�Z dd�Z!eZ"y))�Process�current_process�active_children�freeze_support�Lock�RLock� Semaphore�BoundedSemaphore� Condition�Event�Barrier�Queue�Manager�Pipe�Pool� JoinableQueue�N�)r)rrrr )rr r)r c�4�eZdZddddifd�Zd�Zed��Zy)�DummyProcessN�c��tjj||||||�d|_t j �|_d|_t�|_ y)NF) � threading�Thread�__init__�_pid�weakref�WeakKeyDictionary� _children� _start_calledr�_parent)�self�group�target�name�args�kwargss �7/usr/lib64/python3.12/multiprocessing/dummy/__init__.pyrzDummyProcess.__init__$sI�����!�!�$��v�t�T�6�J��� � �2�2�4���"���&�(���c�4�|jt�ur-tdj|jt����d|_t|jd�rd|jj|<tjj|�y)Nz,Parent is {0!r} but current_process is {1!r}Tr) r r�RuntimeError�formatr�hasattrrrr�start�r!s r'r-zDummyProcess.start+sx���<�<��0�0��>�E�E��L�L�/�"3�5�6� 6�"����4�<�<��-�+/�D�L�L�"�"�4�(������t�$r(c�>�|jr|j�syy)Nr)r�is_aliver.s r'�exitcodezDummyProcess.exitcode5s�����d�m�m�o��r()�__name__� __module__�__qualname__rr-�propertyr1rr(r'rr"s+��!�$�T��2�)�%����r(rc��t�j}t|�D]%}|j�r�|j |d��'t|�S�N)rr�listr0�pop)�children�ps r'rrDsA��� �*�*�H� �(�^���z�z�|��L�L��D�!����>�r(c��yr7rrr(r'rrK���r(c��eZdZd�Zd�Zy)� Namespacec�:�|jj|�yr7)�__dict__�update)r!�kwdss r'rzNamespace.__init__Ss��� � ���T�"r(c�&�t|jj��}g}|D]-\}}|jd�r�|j |�d|����/|j�|jj�ddj|��d�S)N�_�=�(�, �)) r8rA�items� startswith�append�sort� __class__r2�join)r!rJ�tempr$�values r'�__repr__zNamespace.__repr__Usq���T�]�]�(�(�*�+���� �K�D�%��?�?�3�'����t�U�3�4�!� � � ���>�>�2�2�D�I�I�d�O�D�Dr(N)r2r3r4rrRrr(r'r?r?Rs ��#�Er(r?c�.�tj||�Sr7)�array)�typecode�sequence�locks r'�ArrayrXas���;�;�x��*�*r(c�N�eZdZdd�Zed��Zejd��Zd�Zy)�Valuec� �||_||_yr7)� _typecode�_value)r!rUrQrWs r'rzValue.__init__es��!�����r(c��|jSr7�r]r.s r'rQzValue.valueis���{�{�r(c��||_yr7r_)r!rQs r'rQzValue.valuems ����r(c�h�dt|�j�d|j�d|j�d�S)N�<rGrHz)>)�typer2r\r]r.s r'rRzValue.__repr__qs!��#�D�z�2�2�4�>�>�$�+�+�N�Nr(N�T)r2r3r4rr5rQ�setterrRrr(r'rZrZds9��������\�\����Or(rZc�0�tjtSr7)�sys�modulesr2rr(r'rrts���;�;�x� � r(c��yr7rrr(r'�shutdownrjwr=r(c�"�ddlm}||||�S)N�)� ThreadPool)�poolrm)� processes�initializer�initargsrms r'rrzs��!��i��h�7�7r(rd)NNr)#�__all__rrgrrT� connectionrrrrr rr r�queuer rrr�current_threadrrrrr�objectr?�dictr8rXrZrrjrrrr(r'�<module>rxs������ ����>�>�/�/���9�#�#��<���*�*��7�g�7�7�9����� � E�� E�����+�O�F�O� !� �8�� r(PK:W�\�q�J��0dummy/__pycache__/__init__.cpython-312.opt-2.pycnu�[���� T��h���L�gd�ZddlZddlZddlZddlZddlmZddlmZmZm Z m Z ddlmZmZm Z ddlmZGd�d ej �ZeZej&Zej*�e�_d �Zd�ZGd�d e�ZeZeZdd�ZGd�de�Zd�Zd�Z dd�Z!eZ"y))�Process�current_process�active_children�freeze_support�Lock�RLock� Semaphore�BoundedSemaphore� Condition�Event�Barrier�Queue�Manager�Pipe�Pool� JoinableQueue�N�)r)rrrr )rr r)r c�4�eZdZddddifd�Zd�Zed��Zy)�DummyProcessN�c��tjj||||||�d|_t j �|_d|_t�|_ y)NF) � threading�Thread�__init__�_pid�weakref�WeakKeyDictionary� _children� _start_calledr�_parent)�self�group�target�name�args�kwargss �7/usr/lib64/python3.12/multiprocessing/dummy/__init__.pyrzDummyProcess.__init__$sI�����!�!�$��v�t�T�6�J��� � �2�2�4���"���&�(���c�4�|jt�ur-tdj|jt����d|_t|jd�rd|jj|<tjj|�y)Nz,Parent is {0!r} but current_process is {1!r}Tr) r r�RuntimeError�formatr�hasattrrrr�start�r!s r'r-zDummyProcess.start+sx���<�<��0�0��>�E�E��L�L�/�"3�5�6� 6�"����4�<�<��-�+/�D�L�L�"�"�4�(������t�$r(c�>�|jr|j�syy)Nr)r�is_aliver.s r'�exitcodezDummyProcess.exitcode5s�����d�m�m�o��r()�__name__� __module__�__qualname__rr-�propertyr1rr(r'rr"s+��!�$�T��2�)�%����r(rc��t�j}t|�D]%}|j�r�|j |d��'t|�S�N)rr�listr0�pop)�children�ps r'rrDsA��� �*�*�H� �(�^���z�z�|��L�L��D�!����>�r(c��yr7rrr(r'rrK���r(c��eZdZd�Zd�Zy)� Namespacec�:�|jj|�yr7)�__dict__�update)r!�kwdss r'rzNamespace.__init__Ss��� � ���T�"r(c�&�t|jj��}g}|D]-\}}|jd�r�|j |�d|����/|j�|jj�ddj|��d�S)N�_�=�(�, �)) r8rA�items� startswith�append�sort� __class__r2�join)r!rJ�tempr$�values r'�__repr__zNamespace.__repr__Usq���T�]�]�(�(�*�+���� �K�D�%��?�?�3�'����t�U�3�4�!� � � ���>�>�2�2�D�I�I�d�O�D�Dr(N)r2r3r4rrRrr(r'r?r?Rs ��#�Er(r?c�.�tj||�Sr7)�array)�typecode�sequence�locks r'�ArrayrXas���;�;�x��*�*r(c�N�eZdZdd�Zed��Zejd��Zd�Zy)�Valuec� �||_||_yr7)� _typecode�_value)r!rUrQrWs r'rzValue.__init__es��!�����r(c��|jSr7�r]r.s r'rQzValue.valueis���{�{�r(c��||_yr7r_)r!rQs r'rQzValue.valuems ����r(c�h�dt|�j�d|j�d|j�d�S)N�<rGrHz)>)�typer2r\r]r.s r'rRzValue.__repr__qs!��#�D�z�2�2�4�>�>�$�+�+�N�Nr(N�T)r2r3r4rr5rQ�setterrRrr(r'rZrZds9��������\�\����Or(rZc�0�tjtSr7)�sys�modulesr2rr(r'rrts���;�;�x� � r(c��yr7rrr(r'�shutdownrjwr=r(c�"�ddlm}||||�S)N�)� ThreadPool)�poolrm)� processes�initializer�initargsrms r'rrzs��!��i��h�7�7r(rd)NNr)#�__all__rrgrrT� connectionrrrrr rr r�queuer rrr�current_threadrrrrr�objectr?�dictr8rXrZrrjrrrr(r'�<module>rxs������ ����>�>�/�/���9�#�#��<���*�*��7�g�7�7�9����� � E�� E�����+�O�F�O� !� �8�� r(PK:W�\�q�J��*dummy/__pycache__/__init__.cpython-312.pycnu�[���� T��h���L�gd�ZddlZddlZddlZddlZddlmZddlmZmZm Z m Z ddlmZmZm Z ddlmZGd�d ej �ZeZej&Zej*�e�_d �Zd�ZGd�d e�ZeZeZdd�ZGd�de�Zd�Zd�Z dd�Z!eZ"y))�Process�current_process�active_children�freeze_support�Lock�RLock� Semaphore�BoundedSemaphore� Condition�Event�Barrier�Queue�Manager�Pipe�Pool� JoinableQueue�N�)r)rrrr )rr r)r c�4�eZdZddddifd�Zd�Zed��Zy)�DummyProcessN�c��tjj||||||�d|_t j �|_d|_t�|_ y)NF) � threading�Thread�__init__�_pid�weakref�WeakKeyDictionary� _children� _start_calledr�_parent)�self�group�target�name�args�kwargss �7/usr/lib64/python3.12/multiprocessing/dummy/__init__.pyrzDummyProcess.__init__$sI�����!�!�$��v�t�T�6�J��� � �2�2�4���"���&�(���c�4�|jt�ur-tdj|jt����d|_t|jd�rd|jj|<tjj|�y)Nz,Parent is {0!r} but current_process is {1!r}Tr) r r�RuntimeError�formatr�hasattrrrr�start�r!s r'r-zDummyProcess.start+sx���<�<��0�0��>�E�E��L�L�/�"3�5�6� 6�"����4�<�<��-�+/�D�L�L�"�"�4�(������t�$r(c�>�|jr|j�syy)Nr)r�is_aliver.s r'�exitcodezDummyProcess.exitcode5s�����d�m�m�o��r()�__name__� __module__�__qualname__rr-�propertyr1rr(r'rr"s+��!�$�T��2�)�%����r(rc��t�j}t|�D]%}|j�r�|j |d��'t|�S�N)rr�listr0�pop)�children�ps r'rrDsA��� �*�*�H� �(�^���z�z�|��L�L��D�!����>�r(c��yr7rrr(r'rrK���r(c��eZdZd�Zd�Zy)� Namespacec�:�|jj|�yr7)�__dict__�update)r!�kwdss r'rzNamespace.__init__Ss��� � ���T�"r(c�&�t|jj��}g}|D]-\}}|jd�r�|j |�d|����/|j�|jj�ddj|��d�S)N�_�=�(�, �)) r8rA�items� startswith�append�sort� __class__r2�join)r!rJ�tempr$�values r'�__repr__zNamespace.__repr__Usq���T�]�]�(�(�*�+���� �K�D�%��?�?�3�'����t�U�3�4�!� � � ���>�>�2�2�D�I�I�d�O�D�Dr(N)r2r3r4rrRrr(r'r?r?Rs ��#�Er(r?c�.�tj||�Sr7)�array)�typecode�sequence�locks r'�ArrayrXas���;�;�x��*�*r(c�N�eZdZdd�Zed��Zejd��Zd�Zy)�Valuec� �||_||_yr7)� _typecode�_value)r!rUrQrWs r'rzValue.__init__es��!�����r(c��|jSr7�r]r.s r'rQzValue.valueis���{�{�r(c��||_yr7r_)r!rQs r'rQzValue.valuems ����r(c�h�dt|�j�d|j�d|j�d�S)N�<rGrHz)>)�typer2r\r]r.s r'rRzValue.__repr__qs!��#�D�z�2�2�4�>�>�$�+�+�N�Nr(N�T)r2r3r4rr5rQ�setterrRrr(r'rZrZds9��������\�\����Or(rZc�0�tjtSr7)�sys�modulesr2rr(r'rrts���;�;�x� � r(c��yr7rrr(r'�shutdownrjwr=r(c�"�ddlm}||||�S)N�)� ThreadPool)�poolrm)� processes�initializer�initargsrms r'rrzs��!��i��h�7�7r(rd)NNr)#�__all__rrgrrT� connectionrrrrr rr r�queuer rrr�current_threadrrrrr�objectr?�dictr8rXrZrrjrrrr(r'�<module>rxs������ ����>�>�/�/���9�#�#��<���*�*��7�g�7�7�9����� � E�� E�����+�O�F�O� !� �8�� r(PK:W�\��;� � 2dummy/__pycache__/connection.cpython-312.opt-1.pycnu�[���� T��h>��X�gd�ZddlmZdgZGd�de�Zd�Zd d�ZGd�d e�Zy))�Client�Listener�Pipe�)�QueueNc�<�eZdZdd�Zd�Zd�Zed��Zd�Zd�Z y) rNc�$�t|�|_y�N)r�_backlog_queue)�self�address�family�backlogs �9/usr/lib64/python3.12/multiprocessing/dummy/connection.py�__init__zListener.__init__s��#�G�n���c�B�t|jj��Sr )� Connectionr �get�rs r�acceptzListener.accepts���4�.�.�2�2�4�5�5rc��d|_yr �r rs r�closezListener.closes ��"��rc��|jSr rrs rrzListener.addresss���"�"�"rc��|Sr �rs r� __enter__zListener.__enter__!����rc�$�|j�yr �r�r�exc_type� exc_value�exc_tbs r�__exit__zListener.__exit__$���� � �r)NN�) �__name__� __module__�__qualname__rrr�propertyrrr%rrrrrs/��-�6�#��#��#��rrc�h�t�t�}}|j||f�t||�Sr )r�putr)r�_in�_outs rrr(s,�������C��K�K��s����c�4� � rc�Z�t�t�}}t||�t||�fSr )rr)�duplex�a�bs rrr.s(���7�E�G�q�A��a���Z��1�-�-�-rc�,�eZdZd�Zdd�Zd�Zd�Zd�Zy)rc��||_||_|jx|_|_|j x|_|_yr )r/r.r-�send� send_bytesr�recv� recv_bytes)rr.r/s rrzConnection.__init__5s4���� ����&*�h�h�.�� �D�O�&)�g�g�-�� �D�Orc�$�|jj�dkDry|dkry|jj5|jjj|�ddd�|jj�dkDS#1swY�&xYw)NrT�F)r.�qsize� not_empty�wait)r�timeouts r�pollzConnection.poll;sk���8�8�>�>��a����c�>�� �X�X� � ��H�H���#�#�G�,� ��x�x�~�~��!�#�#� � �s�&B�Bc��yr rrs rrzConnection.closeDs��rc��|Sr rrs rrzConnection.__enter__Grrc�$�|j�yr r r!s rr%zConnection.__exit__Jr&rN)r;)r(r)r*rr@rrr%rrrrr3s��.�$� ��rr)T) �__all__�queuer�families�objectrrrrrrr�<module>rHs:��+��� �6���v��,!�.� ��rPK:W�\��;� � 2dummy/__pycache__/connection.cpython-312.opt-2.pycnu�[���� T��h>��X�gd�ZddlmZdgZGd�de�Zd�Zd d�ZGd�d e�Zy))�Client�Listener�Pipe�)�QueueNc�<�eZdZdd�Zd�Zd�Zed��Zd�Zd�Z y) rNc�$�t|�|_y�N)r�_backlog_queue)�self�address�family�backlogs �9/usr/lib64/python3.12/multiprocessing/dummy/connection.py�__init__zListener.__init__s��#�G�n���c�B�t|jj��Sr )� Connectionr �get�rs r�acceptzListener.accepts���4�.�.�2�2�4�5�5rc��d|_yr �r rs r�closezListener.closes ��"��rc��|jSr rrs rrzListener.addresss���"�"�"rc��|Sr �rs r� __enter__zListener.__enter__!����rc�$�|j�yr �r�r�exc_type� exc_value�exc_tbs r�__exit__zListener.__exit__$���� � �r)NN�) �__name__� __module__�__qualname__rrr�propertyrrr%rrrrrs/��-�6�#��#��#��rrc�h�t�t�}}|j||f�t||�Sr )r�putr)r�_in�_outs rrr(s,�������C��K�K��s����c�4� � rc�Z�t�t�}}t||�t||�fSr )rr)�duplex�a�bs rrr.s(���7�E�G�q�A��a���Z��1�-�-�-rc�,�eZdZd�Zdd�Zd�Zd�Zd�Zy)rc��||_||_|jx|_|_|j x|_|_yr )r/r.r-�send� send_bytesr�recv� recv_bytes)rr.r/s rrzConnection.__init__5s4���� ����&*�h�h�.�� �D�O�&)�g�g�-�� �D�Orc�$�|jj�dkDry|dkry|jj5|jjj|�ddd�|jj�dkDS#1swY�&xYw)NrT�F)r.�qsize� not_empty�wait)r�timeouts r�pollzConnection.poll;sk���8�8�>�>��a����c�>�� �X�X� � ��H�H���#�#�G�,� ��x�x�~�~��!�#�#� � �s�&B�Bc��yr rrs rrzConnection.closeDs��rc��|Sr rrs rrzConnection.__enter__Grrc�$�|j�yr r r!s rr%zConnection.__exit__Jr&rN)r;)r(r)r*rr@rrr%rrrrr3s��.�$� ��rr)T) �__all__�queuer�families�objectrrrrrrr�<module>rHs:��+��� �6���v��,!�.� ��rPK:W�\��;� � ,dummy/__pycache__/connection.cpython-312.pycnu�[���� T��h>��X�gd�ZddlmZdgZGd�de�Zd�Zd d�ZGd�d e�Zy))�Client�Listener�Pipe�)�QueueNc�<�eZdZdd�Zd�Zd�Zed��Zd�Zd�Z y) rNc�$�t|�|_y�N)r�_backlog_queue)�self�address�family�backlogs �9/usr/lib64/python3.12/multiprocessing/dummy/connection.py�__init__zListener.__init__s��#�G�n���c�B�t|jj��Sr )� Connectionr �get�rs r�acceptzListener.accepts���4�.�.�2�2�4�5�5rc��d|_yr �r rs r�closezListener.closes ��"��rc��|jSr rrs rrzListener.addresss���"�"�"rc��|Sr �rs r� __enter__zListener.__enter__!����rc�$�|j�yr �r�r�exc_type� exc_value�exc_tbs r�__exit__zListener.__exit__$���� � �r)NN�) �__name__� __module__�__qualname__rrr�propertyrrr%rrrrrs/��-�6�#��#��#��rrc�h�t�t�}}|j||f�t||�Sr )r�putr)r�_in�_outs rrr(s,�������C��K�K��s����c�4� � rc�Z�t�t�}}t||�t||�fSr )rr)�duplex�a�bs rrr.s(���7�E�G�q�A��a���Z��1�-�-�-rc�,�eZdZd�Zdd�Zd�Zd�Zd�Zy)rc��||_||_|jx|_|_|j x|_|_yr )r/r.r-�send� send_bytesr�recv� recv_bytes)rr.r/s rrzConnection.__init__5s4���� ����&*�h�h�.�� �D�O�&)�g�g�-�� �D�Orc�$�|jj�dkDry|dkry|jj5|jjj|�ddd�|jj�dkDS#1swY�&xYw)NrT�F)r.�qsize� not_empty�wait)r�timeouts r�pollzConnection.poll;sk���8�8�>�>��a����c�>�� �X�X� � ��H�H���#�#�G�,� ��x�x�~�~��!�#�#� � �s�&B�Bc��yr rrs rrzConnection.closeDs��rc��|Sr rrs rrzConnection.__enter__Grrc�$�|j�yr r r!s rr%zConnection.__exit__Jr&rN)r;)r(r)r*rr@rrr%rrrrr3s��.�$� ��rr)T) �__all__�queuer�families�objectrrrrrrr�<module>rHs:��+��� �6���v��,!�.� ��rPK:W�\��se��dummy/__init__.pynu�[���# # Support for the API of the multiprocessing package using threads # # multiprocessing/dummy/__init__.py # # Copyright (c) 2006-2008, R Oudkerk # Licensed to PSF under a Contributor Agreement. # __all__ = [ 'Process', 'current_process', 'active_children', 'freeze_support', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Condition', 'Event', 'Barrier', 'Queue', 'Manager', 'Pipe', 'Pool', 'JoinableQueue' ] # # Imports # import threading import sys import weakref import array from .connection import Pipe from threading import Lock, RLock, Semaphore, BoundedSemaphore from threading import Event, Condition, Barrier from queue import Queue # # # class DummyProcess(threading.Thread): def __init__(self, group=None, target=None, name=None, args=(), kwargs={}): threading.Thread.__init__(self, group, target, name, args, kwargs) self._pid = None self._children = weakref.WeakKeyDictionary() self._start_called = False self._parent = current_process() def start(self): if self._parent is not current_process(): raise RuntimeError( "Parent is {0!r} but current_process is {1!r}".format( self._parent, current_process())) self._start_called = True if hasattr(self._parent, '_children'): self._parent._children[self] = None threading.Thread.start(self) @property def exitcode(self): if self._start_called and not self.is_alive(): return 0 else: return None # # # Process = DummyProcess current_process = threading.current_thread current_process()._children = weakref.WeakKeyDictionary() def active_children(): children = current_process()._children for p in list(children): if not p.is_alive(): children.pop(p, None) return list(children) def freeze_support(): pass # # # class Namespace(object): def __init__(self, /, **kwds): self.__dict__.update(kwds) def __repr__(self): items = list(self.__dict__.items()) temp = [] for name, value in items: if not name.startswith('_'): temp.append('%s=%r' % (name, value)) temp.sort() return '%s(%s)' % (self.__class__.__name__, ', '.join(temp)) dict = dict list = list def Array(typecode, sequence, lock=True): return array.array(typecode, sequence) class Value(object): def __init__(self, typecode, value, lock=True): self._typecode = typecode self._value = value @property def value(self): return self._value @value.setter def value(self, value): self._value = value def __repr__(self): return '<%s(%r, %r)>'%(type(self).__name__,self._typecode,self._value) def Manager(): return sys.modules[__name__] def shutdown(): pass def Pool(processes=None, initializer=None, initargs=()): from ..pool import ThreadPool return ThreadPool(processes, initializer, initargs) JoinableQueue = Queue PK:W�\��_T>>dummy/connection.pynu�[���# # Analogue of `multiprocessing.connection` which uses queues instead of sockets # # multiprocessing/dummy/connection.py # # Copyright (c) 2006-2008, R Oudkerk # Licensed to PSF under a Contributor Agreement. # __all__ = [ 'Client', 'Listener', 'Pipe' ] from queue import Queue families = [None] class Listener(object): def __init__(self, address=None, family=None, backlog=1): self._backlog_queue = Queue(backlog) def accept(self): return Connection(*self._backlog_queue.get()) def close(self): self._backlog_queue = None @property def address(self): return self._backlog_queue def __enter__(self): return self def __exit__(self, exc_type, exc_value, exc_tb): self.close() def Client(address): _in, _out = Queue(), Queue() address.put((_out, _in)) return Connection(_in, _out) def Pipe(duplex=True): a, b = Queue(), Queue() return Connection(a, b), Connection(b, a) class Connection(object): def __init__(self, _in, _out): self._out = _out self._in = _in self.send = self.send_bytes = _out.put self.recv = self.recv_bytes = _in.get def poll(self, timeout=0.0): if self._in.qsize() > 0: return True if timeout <= 0.0: return False with self._in.not_empty: self._in.not_empty.wait(timeout) return self._in.qsize() > 0 def close(self): pass def __enter__(self): return self def __exit__(self, exc_type, exc_value, exc_tb): self.close() PK:W�\'�u���__init__.pynu�[���# # Package analogous to 'threading.py' but using processes # # multiprocessing/__init__.py # # This package is intended to duplicate the functionality (and much of # the API) of threading.py but uses processes instead of threads. A # subpackage 'multiprocessing.dummy' has the same API but is a simple # wrapper for 'threading'. # # Copyright (c) 2006-2008, R Oudkerk # Licensed to PSF under a Contributor Agreement. # import sys from . import context # # Copy stuff from default context # __all__ = [x for x in dir(context._default_context) if not x.startswith('_')] globals().update((name, getattr(context._default_context, name)) for name in __all__) # # XXX These should not really be documented or public. # SUBDEBUG = 5 SUBWARNING = 25 # # Alias for main module -- will be reset by bootstrapping child processes # if '__main__' in sys.modules: sys.modules['__mp_main__'] = sys.modules['__main__'] PK:W�\{r����� connection.pynu�[���# # A higher level module for using sockets (or Windows named pipes) # # multiprocessing/connection.py # # Copyright (c) 2006-2008, R Oudkerk # Licensed to PSF under a Contributor Agreement. # __all__ = [ 'Client', 'Listener', 'Pipe', 'wait' ] import errno import io import os import sys import socket import struct import time import tempfile import itertools import _multiprocessing from . import util from . import AuthenticationError, BufferTooShort from .context import reduction _ForkingPickler = reduction.ForkingPickler try: import _winapi from _winapi import WAIT_OBJECT_0, WAIT_ABANDONED_0, WAIT_TIMEOUT, INFINITE except ImportError: if sys.platform == 'win32': raise _winapi = None # # # BUFSIZE = 8192 # A very generous timeout when it comes to local connections... CONNECTION_TIMEOUT = 20. _mmap_counter = itertools.count() default_family = 'AF_INET' families = ['AF_INET'] if hasattr(socket, 'AF_UNIX'): default_family = 'AF_UNIX' families += ['AF_UNIX'] if sys.platform == 'win32': default_family = 'AF_PIPE' families += ['AF_PIPE'] def _init_timeout(timeout=CONNECTION_TIMEOUT): return time.monotonic() + timeout def _check_timeout(t): return time.monotonic() > t # # # def arbitrary_address(family): ''' Return an arbitrary free address for the given family ''' if family == 'AF_INET': return ('localhost', 0) elif family == 'AF_UNIX': return tempfile.mktemp(prefix='listener-', dir=util.get_temp_dir()) elif family == 'AF_PIPE': return tempfile.mktemp(prefix=r'\\.\pipe\pyc-%d-%d-' % (os.getpid(), next(_mmap_counter)), dir="") else: raise ValueError('unrecognized family') def _validate_family(family): ''' Checks if the family is valid for the current environment. ''' if sys.platform != 'win32' and family == 'AF_PIPE': raise ValueError('Family %s is not recognized.' % family) if sys.platform == 'win32' and family == 'AF_UNIX': # double check if not hasattr(socket, family): raise ValueError('Family %s is not recognized.' % family) def address_type(address): ''' Return the types of the address This can be 'AF_INET', 'AF_UNIX', or 'AF_PIPE' ''' if type(address) == tuple: return 'AF_INET' elif type(address) is str and address.startswith('\\\\'): return 'AF_PIPE' elif type(address) is str or util.is_abstract_socket_namespace(address): return 'AF_UNIX' else: raise ValueError('address type of %r unrecognized' % address) # # Connection classes # class _ConnectionBase: _handle = None def __init__(self, handle, readable=True, writable=True): handle = handle.__index__() if handle < 0: raise ValueError("invalid handle") if not readable and not writable: raise ValueError( "at least one of `readable` and `writable` must be True") self._handle = handle self._readable = readable self._writable = writable # XXX should we use util.Finalize instead of a __del__? def __del__(self): if self._handle is not None: self._close() def _check_closed(self): if self._handle is None: raise OSError("handle is closed") def _check_readable(self): if not self._readable: raise OSError("connection is write-only") def _check_writable(self): if not self._writable: raise OSError("connection is read-only") def _bad_message_length(self): if self._writable: self._readable = False else: self.close() raise OSError("bad message length") @property def closed(self): """True if the connection is closed""" return self._handle is None @property def readable(self): """True if the connection is readable""" return self._readable @property def writable(self): """True if the connection is writable""" return self._writable def fileno(self): """File descriptor or handle of the connection""" self._check_closed() return self._handle def close(self): """Close the connection""" if self._handle is not None: try: self._close() finally: self._handle = None def send_bytes(self, buf, offset=0, size=None): """Send the bytes data from a bytes-like object""" self._check_closed() self._check_writable() m = memoryview(buf) if m.itemsize > 1: m = m.cast('B') n = m.nbytes if offset < 0: raise ValueError("offset is negative") if n < offset: raise ValueError("buffer length < offset") if size is None: size = n - offset elif size < 0: raise ValueError("size is negative") elif offset + size > n: raise ValueError("buffer length < offset + size") self._send_bytes(m[offset:offset + size]) def send(self, obj): """Send a (picklable) object""" self._check_closed() self._check_writable() self._send_bytes(_ForkingPickler.dumps(obj)) def recv_bytes(self, maxlength=None): """ Receive bytes data as a bytes object. """ self._check_closed() self._check_readable() if maxlength is not None and maxlength < 0: raise ValueError("negative maxlength") buf = self._recv_bytes(maxlength) if buf is None: self._bad_message_length() return buf.getvalue() def recv_bytes_into(self, buf, offset=0): """ Receive bytes data into a writeable bytes-like object. Return the number of bytes read. """ self._check_closed() self._check_readable() with memoryview(buf) as m: # Get bytesize of arbitrary buffer itemsize = m.itemsize bytesize = itemsize * len(m) if offset < 0: raise ValueError("negative offset") elif offset > bytesize: raise ValueError("offset too large") result = self._recv_bytes() size = result.tell() if bytesize < offset + size: raise BufferTooShort(result.getvalue()) # Message can fit in dest result.seek(0) result.readinto(m[offset // itemsize : (offset + size) // itemsize]) return size def recv(self): """Receive a (picklable) object""" self._check_closed() self._check_readable() buf = self._recv_bytes() return _ForkingPickler.loads(buf.getbuffer()) def poll(self, timeout=0.0): """Whether there is any input available to be read""" self._check_closed() self._check_readable() return self._poll(timeout) def __enter__(self): return self def __exit__(self, exc_type, exc_value, exc_tb): self.close() if _winapi: class PipeConnection(_ConnectionBase): """ Connection class based on a Windows named pipe. Overlapped I/O is used, so the handles must have been created with FILE_FLAG_OVERLAPPED. """ _got_empty_message = False _send_ov = None def _close(self, _CloseHandle=_winapi.CloseHandle): ov = self._send_ov if ov is not None: # Interrupt WaitForMultipleObjects() in _send_bytes() ov.cancel() _CloseHandle(self._handle) def _send_bytes(self, buf): if self._send_ov is not None: # A connection should only be used by a single thread raise ValueError("concurrent send_bytes() calls " "are not supported") ov, err = _winapi.WriteFile(self._handle, buf, overlapped=True) self._send_ov = ov try: if err == _winapi.ERROR_IO_PENDING: waitres = _winapi.WaitForMultipleObjects( [ov.event], False, INFINITE) assert waitres == WAIT_OBJECT_0 except: ov.cancel() raise finally: self._send_ov = None nwritten, err = ov.GetOverlappedResult(True) if err == _winapi.ERROR_OPERATION_ABORTED: # close() was called by another thread while # WaitForMultipleObjects() was waiting for the overlapped # operation. raise OSError(errno.EPIPE, "handle is closed") assert err == 0 assert nwritten == len(buf) def _recv_bytes(self, maxsize=None): if self._got_empty_message: self._got_empty_message = False return io.BytesIO() else: bsize = 128 if maxsize is None else min(maxsize, 128) try: ov, err = _winapi.ReadFile(self._handle, bsize, overlapped=True) try: if err == _winapi.ERROR_IO_PENDING: waitres = _winapi.WaitForMultipleObjects( [ov.event], False, INFINITE) assert waitres == WAIT_OBJECT_0 except: ov.cancel() raise finally: nread, err = ov.GetOverlappedResult(True) if err == 0: f = io.BytesIO() f.write(ov.getbuffer()) return f elif err == _winapi.ERROR_MORE_DATA: return self._get_more_data(ov, maxsize) except OSError as e: if e.winerror == _winapi.ERROR_BROKEN_PIPE: raise EOFError else: raise raise RuntimeError("shouldn't get here; expected KeyboardInterrupt") def _poll(self, timeout): if (self._got_empty_message or _winapi.PeekNamedPipe(self._handle)[0] != 0): return True return bool(wait([self], timeout)) def _get_more_data(self, ov, maxsize): buf = ov.getbuffer() f = io.BytesIO() f.write(buf) left = _winapi.PeekNamedPipe(self._handle)[1] assert left > 0 if maxsize is not None and len(buf) + left > maxsize: self._bad_message_length() ov, err = _winapi.ReadFile(self._handle, left, overlapped=True) rbytes, err = ov.GetOverlappedResult(True) assert err == 0 assert rbytes == left f.write(ov.getbuffer()) return f class Connection(_ConnectionBase): """ Connection class based on an arbitrary file descriptor (Unix only), or a socket handle (Windows). """ if _winapi: def _close(self, _close=_multiprocessing.closesocket): _close(self._handle) _write = _multiprocessing.send _read = _multiprocessing.recv else: def _close(self, _close=os.close): _close(self._handle) _write = os.write _read = os.read def _send(self, buf, write=_write): remaining = len(buf) while True: n = write(self._handle, buf) remaining -= n if remaining == 0: break buf = buf[n:] def _recv(self, size, read=_read): buf = io.BytesIO() handle = self._handle remaining = size while remaining > 0: chunk = read(handle, remaining) n = len(chunk) if n == 0: if remaining == size: raise EOFError else: raise OSError("got end of file during message") buf.write(chunk) remaining -= n return buf def _send_bytes(self, buf): n = len(buf) if n > 0x7fffffff: pre_header = struct.pack("!i", -1) header = struct.pack("!Q", n) self._send(pre_header) self._send(header) self._send(buf) else: # For wire compatibility with 3.7 and lower header = struct.pack("!i", n) if n > 16384: # The payload is large so Nagle's algorithm won't be triggered # and we'd better avoid the cost of concatenation. self._send(header) self._send(buf) else: # Issue #20540: concatenate before sending, to avoid delays due # to Nagle's algorithm on a TCP socket. # Also note we want to avoid sending a 0-length buffer separately, # to avoid "broken pipe" errors if the other end closed the pipe. self._send(header + buf) def _recv_bytes(self, maxsize=None): buf = self._recv(4) size, = struct.unpack("!i", buf.getvalue()) if size == -1: buf = self._recv(8) size, = struct.unpack("!Q", buf.getvalue()) if maxsize is not None and size > maxsize: return None return self._recv(size) def _poll(self, timeout): r = wait([self], timeout) return bool(r) # # Public functions # class Listener(object): ''' Returns a listener object. This is a wrapper for a bound socket which is 'listening' for connections, or for a Windows named pipe. ''' def __init__(self, address=None, family=None, backlog=1, authkey=None): family = family or (address and address_type(address)) \ or default_family address = address or arbitrary_address(family) _validate_family(family) if family == 'AF_PIPE': self._listener = PipeListener(address, backlog) else: self._listener = SocketListener(address, family, backlog) if authkey is not None and not isinstance(authkey, bytes): raise TypeError('authkey should be a byte string') self._authkey = authkey def accept(self): ''' Accept a connection on the bound socket or named pipe of `self`. Returns a `Connection` object. ''' if self._listener is None: raise OSError('listener is closed') c = self._listener.accept() if self._authkey is not None: deliver_challenge(c, self._authkey) answer_challenge(c, self._authkey) return c def close(self): ''' Close the bound socket or named pipe of `self`. ''' listener = self._listener if listener is not None: self._listener = None listener.close() @property def address(self): return self._listener._address @property def last_accepted(self): return self._listener._last_accepted def __enter__(self): return self def __exit__(self, exc_type, exc_value, exc_tb): self.close() def Client(address, family=None, authkey=None): ''' Returns a connection to the address of a `Listener` ''' family = family or address_type(address) _validate_family(family) if family == 'AF_PIPE': c = PipeClient(address) else: c = SocketClient(address) if authkey is not None and not isinstance(authkey, bytes): raise TypeError('authkey should be a byte string') if authkey is not None: answer_challenge(c, authkey) deliver_challenge(c, authkey) return c if sys.platform != 'win32': def Pipe(duplex=True): ''' Returns pair of connection objects at either end of a pipe ''' if duplex: s1, s2 = socket.socketpair() s1.setblocking(True) s2.setblocking(True) c1 = Connection(s1.detach()) c2 = Connection(s2.detach()) else: fd1, fd2 = os.pipe() c1 = Connection(fd1, writable=False) c2 = Connection(fd2, readable=False) return c1, c2 else: def Pipe(duplex=True): ''' Returns pair of connection objects at either end of a pipe ''' address = arbitrary_address('AF_PIPE') if duplex: openmode = _winapi.PIPE_ACCESS_DUPLEX access = _winapi.GENERIC_READ | _winapi.GENERIC_WRITE obsize, ibsize = BUFSIZE, BUFSIZE else: openmode = _winapi.PIPE_ACCESS_INBOUND access = _winapi.GENERIC_WRITE obsize, ibsize = 0, BUFSIZE h1 = _winapi.CreateNamedPipe( address, openmode | _winapi.FILE_FLAG_OVERLAPPED | _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE, _winapi.PIPE_TYPE_MESSAGE | _winapi.PIPE_READMODE_MESSAGE | _winapi.PIPE_WAIT, 1, obsize, ibsize, _winapi.NMPWAIT_WAIT_FOREVER, # default security descriptor: the handle cannot be inherited _winapi.NULL ) h2 = _winapi.CreateFile( address, access, 0, _winapi.NULL, _winapi.OPEN_EXISTING, _winapi.FILE_FLAG_OVERLAPPED, _winapi.NULL ) _winapi.SetNamedPipeHandleState( h2, _winapi.PIPE_READMODE_MESSAGE, None, None ) overlapped = _winapi.ConnectNamedPipe(h1, overlapped=True) _, err = overlapped.GetOverlappedResult(True) assert err == 0 c1 = PipeConnection(h1, writable=duplex) c2 = PipeConnection(h2, readable=duplex) return c1, c2 # # Definitions for connections based on sockets # class SocketListener(object): ''' Representation of a socket which is bound to an address and listening ''' def __init__(self, address, family, backlog=1): self._socket = socket.socket(getattr(socket, family)) try: # SO_REUSEADDR has different semantics on Windows (issue #2550). if os.name == 'posix': self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self._socket.setblocking(True) self._socket.bind(address) self._socket.listen(backlog) self._address = self._socket.getsockname() except OSError: self._socket.close() raise self._family = family self._last_accepted = None if family == 'AF_UNIX' and not util.is_abstract_socket_namespace(address): # Linux abstract socket namespaces do not need to be explicitly unlinked self._unlink = util.Finalize( self, os.unlink, args=(address,), exitpriority=0 ) else: self._unlink = None def accept(self): s, self._last_accepted = self._socket.accept() s.setblocking(True) return Connection(s.detach()) def close(self): try: self._socket.close() finally: unlink = self._unlink if unlink is not None: self._unlink = None unlink() def SocketClient(address): ''' Return a connection object connected to the socket given by `address` ''' family = address_type(address) with socket.socket( getattr(socket, family) ) as s: s.setblocking(True) s.connect(address) return Connection(s.detach()) # # Definitions for connections based on named pipes # if sys.platform == 'win32': class PipeListener(object): ''' Representation of a named pipe ''' def __init__(self, address, backlog=None): self._address = address self._handle_queue = [self._new_handle(first=True)] self._last_accepted = None util.sub_debug('listener created with address=%r', self._address) self.close = util.Finalize( self, PipeListener._finalize_pipe_listener, args=(self._handle_queue, self._address), exitpriority=0 ) def _new_handle(self, first=False): flags = _winapi.PIPE_ACCESS_DUPLEX | _winapi.FILE_FLAG_OVERLAPPED if first: flags |= _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE return _winapi.CreateNamedPipe( self._address, flags, _winapi.PIPE_TYPE_MESSAGE | _winapi.PIPE_READMODE_MESSAGE | _winapi.PIPE_WAIT, _winapi.PIPE_UNLIMITED_INSTANCES, BUFSIZE, BUFSIZE, _winapi.NMPWAIT_WAIT_FOREVER, _winapi.NULL ) def accept(self): self._handle_queue.append(self._new_handle()) handle = self._handle_queue.pop(0) try: ov = _winapi.ConnectNamedPipe(handle, overlapped=True) except OSError as e: if e.winerror != _winapi.ERROR_NO_DATA: raise # ERROR_NO_DATA can occur if a client has already connected, # written data and then disconnected -- see Issue 14725. else: try: res = _winapi.WaitForMultipleObjects( [ov.event], False, INFINITE) except: ov.cancel() _winapi.CloseHandle(handle) raise finally: _, err = ov.GetOverlappedResult(True) assert err == 0 return PipeConnection(handle) @staticmethod def _finalize_pipe_listener(queue, address): util.sub_debug('closing listener with address=%r', address) for handle in queue: _winapi.CloseHandle(handle) def PipeClient(address): ''' Return a connection object connected to the pipe given by `address` ''' t = _init_timeout() while 1: try: _winapi.WaitNamedPipe(address, 1000) h = _winapi.CreateFile( address, _winapi.GENERIC_READ | _winapi.GENERIC_WRITE, 0, _winapi.NULL, _winapi.OPEN_EXISTING, _winapi.FILE_FLAG_OVERLAPPED, _winapi.NULL ) except OSError as e: if e.winerror not in (_winapi.ERROR_SEM_TIMEOUT, _winapi.ERROR_PIPE_BUSY) or _check_timeout(t): raise else: break else: raise _winapi.SetNamedPipeHandleState( h, _winapi.PIPE_READMODE_MESSAGE, None, None ) return PipeConnection(h) # # Authentication stuff # MESSAGE_LENGTH = 40 # MUST be > 20 _CHALLENGE = b'#CHALLENGE#' _WELCOME = b'#WELCOME#' _FAILURE = b'#FAILURE#' # multiprocessing.connection Authentication Handshake Protocol Description # (as documented for reference after reading the existing code) # ============================================================================= # # On Windows: native pipes with "overlapped IO" are used to send the bytes, # instead of the length prefix SIZE scheme described below. (ie: the OS deals # with message sizes for us) # # Protocol error behaviors: # # On POSIX, any failure to receive the length prefix into SIZE, for SIZE greater # than the requested maxsize to receive, or receiving fewer than SIZE bytes # results in the connection being closed and auth to fail. # # On Windows, receiving too few bytes is never a low level _recv_bytes read # error, receiving too many will trigger an error only if receive maxsize # value was larger than 128 OR the if the data arrived in smaller pieces. # # Serving side Client side # ------------------------------ --------------------------------------- # 0. Open a connection on the pipe. # 1. Accept connection. # 2. Random 20+ bytes -> MESSAGE # Modern servers always send # more than 20 bytes and include # a {digest} prefix on it with # their preferred HMAC digest. # Legacy ones send ==20 bytes. # 3. send 4 byte length (net order) # prefix followed by: # b'#CHALLENGE#' + MESSAGE # 4. Receive 4 bytes, parse as network byte # order integer. If it is -1, receive an # additional 8 bytes, parse that as network # byte order. The result is the length of # the data that follows -> SIZE. # 5. Receive min(SIZE, 256) bytes -> M1 # 6. Assert that M1 starts with: # b'#CHALLENGE#' # 7. Strip that prefix from M1 into -> M2 # 7.1. Parse M2: if it is exactly 20 bytes in # length this indicates a legacy server # supporting only HMAC-MD5. Otherwise the # 7.2. preferred digest is looked up from an # expected "{digest}" prefix on M2. No prefix # or unsupported digest? <- AuthenticationError # 7.3. Put divined algorithm name in -> D_NAME # 8. Compute HMAC-D_NAME of AUTHKEY, M2 -> C_DIGEST # 9. Send 4 byte length prefix (net order) # followed by C_DIGEST bytes. # 10. Receive 4 or 4+8 byte length # prefix (#4 dance) -> SIZE. # 11. Receive min(SIZE, 256) -> C_D. # 11.1. Parse C_D: legacy servers # accept it as is, "md5" -> D_NAME # 11.2. modern servers check the length # of C_D, IF it is 16 bytes? # 11.2.1. "md5" -> D_NAME # and skip to step 12. # 11.3. longer? expect and parse a "{digest}" # prefix into -> D_NAME. # Strip the prefix and store remaining # bytes in -> C_D. # 11.4. Don't like D_NAME? <- AuthenticationError # 12. Compute HMAC-D_NAME of AUTHKEY, # MESSAGE into -> M_DIGEST. # 13. Compare M_DIGEST == C_D: # 14a: Match? Send length prefix & # b'#WELCOME#' # <- RETURN # 14b: Mismatch? Send len prefix & # b'#FAILURE#' # <- CLOSE & AuthenticationError # 15. Receive 4 or 4+8 byte length prefix (net # order) again as in #4 into -> SIZE. # 16. Receive min(SIZE, 256) bytes -> M3. # 17. Compare M3 == b'#WELCOME#': # 17a. Match? <- RETURN # 17b. Mismatch? <- CLOSE & AuthenticationError # # If this RETURNed, the connection remains open: it has been authenticated. # # Length prefixes are used consistently. Even on the legacy protocol, this # was good fortune and allowed us to evolve the protocol by using the length # of the opening challenge or length of the returned digest as a signal as # to which protocol the other end supports. _ALLOWED_DIGESTS = frozenset( {b'md5', b'sha256', b'sha384', b'sha3_256', b'sha3_384'}) _MAX_DIGEST_LEN = max(len(_) for _ in _ALLOWED_DIGESTS) # Old hmac-md5 only server versions from Python <=3.11 sent a message of this # length. It happens to not match the length of any supported digest so we can # use a message of this length to indicate that we should work in backwards # compatible md5-only mode without a {digest_name} prefix on our response. _MD5ONLY_MESSAGE_LENGTH = 20 _MD5_DIGEST_LEN = 16 _LEGACY_LENGTHS = (_MD5ONLY_MESSAGE_LENGTH, _MD5_DIGEST_LEN) def _get_digest_name_and_payload(message): # type: (bytes) -> tuple[str, bytes] """Returns a digest name and the payload for a response hash. If a legacy protocol is detected based on the message length or contents the digest name returned will be empty to indicate legacy mode where MD5 and no digest prefix should be sent. """ # modern message format: b"{digest}payload" longer than 20 bytes # legacy message format: 16 or 20 byte b"payload" if len(message) in _LEGACY_LENGTHS: # Either this was a legacy server challenge, or we're processing # a reply from a legacy client that sent an unprefixed 16-byte # HMAC-MD5 response. All messages using the modern protocol will # be longer than either of these lengths. return '', message if (message.startswith(b'{') and (curly := message.find(b'}', 1, _MAX_DIGEST_LEN+2)) > 0): digest = message[1:curly] if digest in _ALLOWED_DIGESTS: payload = message[curly+1:] return digest.decode('ascii'), payload raise AuthenticationError( 'unsupported message length, missing digest prefix, ' f'or unsupported digest: {message=}') def _create_response(authkey, message): """Create a MAC based on authkey and message The MAC algorithm defaults to HMAC-MD5, unless MD5 is not available or the message has a '{digest_name}' prefix. For legacy HMAC-MD5, the response is the raw MAC, otherwise the response is prefixed with '{digest_name}', e.g. b'{sha256}abcdefg...' Note: The MAC protects the entire message including the digest_name prefix. """ import hmac digest_name = _get_digest_name_and_payload(message)[0] # The MAC protects the entire message: digest header and payload. if not digest_name: # Legacy server without a {digest} prefix on message. # Generate a legacy non-prefixed HMAC-MD5 reply. try: return hmac.new(authkey, message, 'md5').digest() except ValueError: # HMAC-MD5 is not available (FIPS mode?), fall back to # HMAC-SHA2-256 modern protocol. The legacy server probably # doesn't support it and will reject us anyways. :shrug: digest_name = 'sha256' # Modern protocol, indicate the digest used in the reply. response = hmac.new(authkey, message, digest_name).digest() return b'{%s}%s' % (digest_name.encode('ascii'), response) def _verify_challenge(authkey, message, response): """Verify MAC challenge If our message did not include a digest_name prefix, the client is allowed to select a stronger digest_name from _ALLOWED_DIGESTS. In case our message is prefixed, a client cannot downgrade to a weaker algorithm, because the MAC is calculated over the entire message including the '{digest_name}' prefix. """ import hmac response_digest, response_mac = _get_digest_name_and_payload(response) response_digest = response_digest or 'md5' try: expected = hmac.new(authkey, message, response_digest).digest() except ValueError: raise AuthenticationError(f'{response_digest=} unsupported') if len(expected) != len(response_mac): raise AuthenticationError( f'expected {response_digest!r} of length {len(expected)} ' f'got {len(response_mac)}') if not hmac.compare_digest(expected, response_mac): raise AuthenticationError('digest received was wrong') def deliver_challenge(connection, authkey: bytes, digest_name='sha256'): if not isinstance(authkey, bytes): raise ValueError( "Authkey must be bytes, not {0!s}".format(type(authkey))) assert MESSAGE_LENGTH > _MD5ONLY_MESSAGE_LENGTH, "protocol constraint" message = os.urandom(MESSAGE_LENGTH) message = b'{%s}%s' % (digest_name.encode('ascii'), message) # Even when sending a challenge to a legacy client that does not support # digest prefixes, they'll take the entire thing as a challenge and # respond to it with a raw HMAC-MD5. connection.send_bytes(_CHALLENGE + message) response = connection.recv_bytes(256) # reject large message try: _verify_challenge(authkey, message, response) except AuthenticationError: connection.send_bytes(_FAILURE) raise else: connection.send_bytes(_WELCOME) def answer_challenge(connection, authkey: bytes): if not isinstance(authkey, bytes): raise ValueError( "Authkey must be bytes, not {0!s}".format(type(authkey))) message = connection.recv_bytes(256) # reject large message if not message.startswith(_CHALLENGE): raise AuthenticationError( f'Protocol error, expected challenge: {message=}') message = message[len(_CHALLENGE):] if len(message) < _MD5ONLY_MESSAGE_LENGTH: raise AuthenticationError(f'challenge too short: {len(message)} bytes') digest = _create_response(authkey, message) connection.send_bytes(digest) response = connection.recv_bytes(256) # reject large message if response != _WELCOME: raise AuthenticationError('digest sent was rejected') # # Support for using xmlrpclib for serialization # class ConnectionWrapper(object): def __init__(self, conn, dumps, loads): self._conn = conn self._dumps = dumps self._loads = loads for attr in ('fileno', 'close', 'poll', 'recv_bytes', 'send_bytes'): obj = getattr(conn, attr) setattr(self, attr, obj) def send(self, obj): s = self._dumps(obj) self._conn.send_bytes(s) def recv(self): s = self._conn.recv_bytes() return self._loads(s) def _xml_dumps(obj): return xmlrpclib.dumps((obj,), None, None, None, 1).encode('utf-8') def _xml_loads(s): (obj,), method = xmlrpclib.loads(s.decode('utf-8')) return obj class XmlListener(Listener): def accept(self): global xmlrpclib import xmlrpc.client as xmlrpclib obj = Listener.accept(self) return ConnectionWrapper(obj, _xml_dumps, _xml_loads) def XmlClient(*args, **kwds): global xmlrpclib import xmlrpc.client as xmlrpclib return ConnectionWrapper(Client(*args, **kwds), _xml_dumps, _xml_loads) # # Wait # if sys.platform == 'win32': def _exhaustive_wait(handles, timeout): # Return ALL handles which are currently signalled. (Only # returning the first signalled might create starvation issues.) L = list(handles) ready = [] while L: res = _winapi.WaitForMultipleObjects(L, False, timeout) if res == WAIT_TIMEOUT: break elif WAIT_OBJECT_0 <= res < WAIT_OBJECT_0 + len(L): res -= WAIT_OBJECT_0 elif WAIT_ABANDONED_0 <= res < WAIT_ABANDONED_0 + len(L): res -= WAIT_ABANDONED_0 else: raise RuntimeError('Should not get here') ready.append(L[res]) L = L[res+1:] timeout = 0 return ready _ready_errors = {_winapi.ERROR_BROKEN_PIPE, _winapi.ERROR_NETNAME_DELETED} def wait(object_list, timeout=None): ''' Wait till an object in object_list is ready/readable. Returns list of those objects in object_list which are ready/readable. ''' if timeout is None: timeout = INFINITE elif timeout < 0: timeout = 0 else: timeout = int(timeout * 1000 + 0.5) object_list = list(object_list) waithandle_to_obj = {} ov_list = [] ready_objects = set() ready_handles = set() try: for o in object_list: try: fileno = getattr(o, 'fileno') except AttributeError: waithandle_to_obj[o.__index__()] = o else: # start an overlapped read of length zero try: ov, err = _winapi.ReadFile(fileno(), 0, True) except OSError as e: ov, err = None, e.winerror if err not in _ready_errors: raise if err == _winapi.ERROR_IO_PENDING: ov_list.append(ov) waithandle_to_obj[ov.event] = o else: # If o.fileno() is an overlapped pipe handle and # err == 0 then there is a zero length message # in the pipe, but it HAS NOT been consumed... if ov and sys.getwindowsversion()[:2] >= (6, 2): # ... except on Windows 8 and later, where # the message HAS been consumed. try: _, err = ov.GetOverlappedResult(False) except OSError as e: err = e.winerror if not err and hasattr(o, '_got_empty_message'): o._got_empty_message = True ready_objects.add(o) timeout = 0 ready_handles = _exhaustive_wait(waithandle_to_obj.keys(), timeout) finally: # request that overlapped reads stop for ov in ov_list: ov.cancel() # wait for all overlapped reads to stop for ov in ov_list: try: _, err = ov.GetOverlappedResult(True) except OSError as e: err = e.winerror if err not in _ready_errors: raise if err != _winapi.ERROR_OPERATION_ABORTED: o = waithandle_to_obj[ov.event] ready_objects.add(o) if err == 0: # If o.fileno() is an overlapped pipe handle then # a zero length message HAS been consumed. if hasattr(o, '_got_empty_message'): o._got_empty_message = True ready_objects.update(waithandle_to_obj[h] for h in ready_handles) return [o for o in object_list if o in ready_objects] else: import selectors # poll/select have the advantage of not requiring any extra file # descriptor, contrarily to epoll/kqueue (also, they require a single # syscall). if hasattr(selectors, 'PollSelector'): _WaitSelector = selectors.PollSelector else: _WaitSelector = selectors.SelectSelector def wait(object_list, timeout=None): ''' Wait till an object in object_list is ready/readable. Returns list of those objects in object_list which are ready/readable. ''' with _WaitSelector() as selector: for obj in object_list: selector.register(obj, selectors.EVENT_READ) if timeout is not None: deadline = time.monotonic() + timeout while True: ready = selector.select(timeout) if ready: return [key.fileobj for (key, events) in ready] else: if timeout is not None: timeout = deadline - time.monotonic() if timeout < 0: return ready # # Make connection and socket objects shareable if possible # if sys.platform == 'win32': def reduce_connection(conn): handle = conn.fileno() with socket.fromfd(handle, socket.AF_INET, socket.SOCK_STREAM) as s: from . import resource_sharer ds = resource_sharer.DupSocket(s) return rebuild_connection, (ds, conn.readable, conn.writable) def rebuild_connection(ds, readable, writable): sock = ds.detach() return Connection(sock.detach(), readable, writable) reduction.register(Connection, reduce_connection) def reduce_pipe_connection(conn): access = ((_winapi.FILE_GENERIC_READ if conn.readable else 0) | (_winapi.FILE_GENERIC_WRITE if conn.writable else 0)) dh = reduction.DupHandle(conn.fileno(), access) return rebuild_pipe_connection, (dh, conn.readable, conn.writable) def rebuild_pipe_connection(dh, readable, writable): handle = dh.detach() return PipeConnection(handle, readable, writable) reduction.register(PipeConnection, reduce_pipe_connection) else: def reduce_connection(conn): df = reduction.DupFd(conn.fileno()) return rebuild_connection, (df, conn.readable, conn.writable) def rebuild_connection(df, readable, writable): fd = df.detach() return Connection(fd, readable, writable) reduction.register(Connection, reduce_connection) PK:W�\4���-�- context.pynu�[���import os import sys import threading from . import process from . import reduction __all__ = () # # Exceptions # class ProcessError(Exception): pass class BufferTooShort(ProcessError): pass class TimeoutError(ProcessError): pass class AuthenticationError(ProcessError): pass # # Base type for contexts. Bound methods of an instance of this type are included in __all__ of __init__.py # class BaseContext(object): ProcessError = ProcessError BufferTooShort = BufferTooShort TimeoutError = TimeoutError AuthenticationError = AuthenticationError current_process = staticmethod(process.current_process) parent_process = staticmethod(process.parent_process) active_children = staticmethod(process.active_children) def cpu_count(self): '''Returns the number of CPUs in the system''' num = os.cpu_count() if num is None: raise NotImplementedError('cannot determine number of cpus') else: return num def Manager(self): '''Returns a manager associated with a running server process The managers methods such as `Lock()`, `Condition()` and `Queue()` can be used to create shared objects. ''' from .managers import SyncManager m = SyncManager(ctx=self.get_context()) m.start() return m def Pipe(self, duplex=True): '''Returns two connection object connected by a pipe''' from .connection import Pipe return Pipe(duplex) def Lock(self): '''Returns a non-recursive lock object''' from .synchronize import Lock return Lock(ctx=self.get_context()) def RLock(self): '''Returns a recursive lock object''' from .synchronize import RLock return RLock(ctx=self.get_context()) def Condition(self, lock=None): '''Returns a condition object''' from .synchronize import Condition return Condition(lock, ctx=self.get_context()) def Semaphore(self, value=1): '''Returns a semaphore object''' from .synchronize import Semaphore return Semaphore(value, ctx=self.get_context()) def BoundedSemaphore(self, value=1): '''Returns a bounded semaphore object''' from .synchronize import BoundedSemaphore return BoundedSemaphore(value, ctx=self.get_context()) def Event(self): '''Returns an event object''' from .synchronize import Event return Event(ctx=self.get_context()) def Barrier(self, parties, action=None, timeout=None): '''Returns a barrier object''' from .synchronize import Barrier return Barrier(parties, action, timeout, ctx=self.get_context()) def Queue(self, maxsize=0): '''Returns a queue object''' from .queues import Queue return Queue(maxsize, ctx=self.get_context()) def JoinableQueue(self, maxsize=0): '''Returns a queue object''' from .queues import JoinableQueue return JoinableQueue(maxsize, ctx=self.get_context()) def SimpleQueue(self): '''Returns a queue object''' from .queues import SimpleQueue return SimpleQueue(ctx=self.get_context()) def Pool(self, processes=None, initializer=None, initargs=(), maxtasksperchild=None): '''Returns a process pool object''' from .pool import Pool return Pool(processes, initializer, initargs, maxtasksperchild, context=self.get_context()) def RawValue(self, typecode_or_type, *args): '''Returns a shared object''' from .sharedctypes import RawValue return RawValue(typecode_or_type, *args) def RawArray(self, typecode_or_type, size_or_initializer): '''Returns a shared array''' from .sharedctypes import RawArray return RawArray(typecode_or_type, size_or_initializer) def Value(self, typecode_or_type, *args, lock=True): '''Returns a synchronized shared object''' from .sharedctypes import Value return Value(typecode_or_type, *args, lock=lock, ctx=self.get_context()) def Array(self, typecode_or_type, size_or_initializer, *, lock=True): '''Returns a synchronized shared array''' from .sharedctypes import Array return Array(typecode_or_type, size_or_initializer, lock=lock, ctx=self.get_context()) def freeze_support(self): '''Check whether this is a fake forked process in a frozen executable. If so then run code specified by commandline and exit. ''' if sys.platform == 'win32' and getattr(sys, 'frozen', False): from .spawn import freeze_support freeze_support() def get_logger(self): '''Return package logger -- if it does not already exist then it is created. ''' from .util import get_logger return get_logger() def log_to_stderr(self, level=None): '''Turn on logging and add a handler which prints to stderr''' from .util import log_to_stderr return log_to_stderr(level) def allow_connection_pickling(self): '''Install support for sending connections and sockets between processes ''' # This is undocumented. In previous versions of multiprocessing # its only effect was to make socket objects inheritable on Windows. from . import connection def set_executable(self, executable): '''Sets 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. ''' from .spawn import set_executable set_executable(executable) def set_forkserver_preload(self, module_names): '''Set list of module names to try to load in forkserver process. This is really just a hint. ''' from .forkserver import set_forkserver_preload set_forkserver_preload(module_names) def get_context(self, method=None): if method is None: return self try: ctx = _concrete_contexts[method] except KeyError: raise ValueError('cannot find context for %r' % method) from None ctx._check_available() return ctx def get_start_method(self, allow_none=False): return self._name def set_start_method(self, method, force=False): raise ValueError('cannot set start method of concrete context') @property def reducer(self): '''Controls how objects will be reduced to a form that can be shared with other processes.''' return globals().get('reduction') @reducer.setter def reducer(self, reduction): globals()['reduction'] = reduction def _check_available(self): pass # # Type of default context -- underlying context can be set at most once # class Process(process.BaseProcess): _start_method = None @staticmethod def _Popen(process_obj): return _default_context.get_context().Process._Popen(process_obj) @staticmethod def _after_fork(): return _default_context.get_context().Process._after_fork() class DefaultContext(BaseContext): Process = Process def __init__(self, context): self._default_context = context self._actual_context = None def get_context(self, method=None): if method is None: if self._actual_context is None: self._actual_context = self._default_context return self._actual_context else: return super().get_context(method) def set_start_method(self, method, force=False): if self._actual_context is not None and not force: raise RuntimeError('context has already been set') if method is None and force: self._actual_context = None return self._actual_context = self.get_context(method) def get_start_method(self, allow_none=False): if self._actual_context is None: if allow_none: return None self._actual_context = self._default_context return self._actual_context._name def get_all_start_methods(self): """Returns a list of the supported start methods, default first.""" if sys.platform == 'win32': return ['spawn'] else: methods = ['spawn', 'fork'] if sys.platform == 'darwin' else ['fork', 'spawn'] if reduction.HAVE_SEND_HANDLE: methods.append('forkserver') return methods # # Context types for fixed start method # if sys.platform != 'win32': class ForkProcess(process.BaseProcess): _start_method = 'fork' @staticmethod def _Popen(process_obj): from .popen_fork import Popen return Popen(process_obj) class SpawnProcess(process.BaseProcess): _start_method = 'spawn' @staticmethod def _Popen(process_obj): from .popen_spawn_posix import Popen return Popen(process_obj) @staticmethod def _after_fork(): # process is spawned, nothing to do pass class ForkServerProcess(process.BaseProcess): _start_method = 'forkserver' @staticmethod def _Popen(process_obj): from .popen_forkserver import Popen return Popen(process_obj) class ForkContext(BaseContext): _name = 'fork' Process = ForkProcess class SpawnContext(BaseContext): _name = 'spawn' Process = SpawnProcess class ForkServerContext(BaseContext): _name = 'forkserver' Process = ForkServerProcess def _check_available(self): if not reduction.HAVE_SEND_HANDLE: raise ValueError('forkserver start method not available') _concrete_contexts = { 'fork': ForkContext(), 'spawn': SpawnContext(), 'forkserver': ForkServerContext(), } if sys.platform == 'darwin': # bpo-33725: running arbitrary code after fork() is no longer reliable # on macOS since macOS 10.14 (Mojave). Use spawn by default instead. _default_context = DefaultContext(_concrete_contexts['spawn']) else: _default_context = DefaultContext(_concrete_contexts['fork']) else: class SpawnProcess(process.BaseProcess): _start_method = 'spawn' @staticmethod def _Popen(process_obj): from .popen_spawn_win32 import Popen return Popen(process_obj) @staticmethod def _after_fork(): # process is spawned, nothing to do pass class SpawnContext(BaseContext): _name = 'spawn' Process = SpawnProcess _concrete_contexts = { 'spawn': SpawnContext(), } _default_context = DefaultContext(_concrete_contexts['spawn']) # # Force the start method # def _force_start_method(method): _default_context._actual_context = _concrete_contexts[method] # # Check that the current thread is spawning a child process # _tls = threading.local() def get_spawning_popen(): return getattr(_tls, 'spawning_popen', None) def set_spawning_popen(popen): _tls.spawning_popen = popen def assert_spawning(obj): if get_spawning_popen() is None: raise RuntimeError( '%s objects should only be shared between processes' ' through inheritance' % type(obj).__name__ ) PK:W�\B�R�/�/ forkserver.pynu�[���import errno import os import selectors import signal import socket import struct import sys import threading import warnings from . import connection from . import process from .context import reduction from . import resource_tracker from . import spawn from . import util __all__ = ['ensure_running', 'get_inherited_fds', 'connect_to_new_process', 'set_forkserver_preload'] # # # MAXFDS_TO_SEND = 256 SIGNED_STRUCT = struct.Struct('q') # large enough for pid_t # # Forkserver class # class ForkServer(object): def __init__(self): self._forkserver_address = None self._forkserver_alive_fd = None self._forkserver_pid = None self._inherited_fds = None self._lock = threading.Lock() self._preload_modules = ['__main__'] def _stop(self): # Method used by unit tests to stop the server with self._lock: self._stop_unlocked() def _stop_unlocked(self): if self._forkserver_pid is None: return # close the "alive" file descriptor asks the server to stop os.close(self._forkserver_alive_fd) self._forkserver_alive_fd = None os.waitpid(self._forkserver_pid, 0) self._forkserver_pid = None if not util.is_abstract_socket_namespace(self._forkserver_address): os.unlink(self._forkserver_address) self._forkserver_address = None def set_forkserver_preload(self, modules_names): '''Set list of module names to try to load in forkserver process.''' if not all(type(mod) is str for mod in modules_names): raise TypeError('module_names must be a list of strings') self._preload_modules = modules_names def get_inherited_fds(self): '''Return list of fds inherited from parent process. This returns None if the current process was not started by fork server. ''' return self._inherited_fds def connect_to_new_process(self, fds): '''Request forkserver to create a child process. Returns a pair of fds (status_r, data_w). The calling process can read the child process's pid and (eventually) its returncode from status_r. The calling process should write to data_w the pickled preparation and process data. ''' self.ensure_running() if len(fds) + 4 >= MAXFDS_TO_SEND: raise ValueError('too many fds') with socket.socket(socket.AF_UNIX) as client: client.connect(self._forkserver_address) parent_r, child_w = os.pipe() child_r, parent_w = os.pipe() allfds = [child_r, child_w, self._forkserver_alive_fd, resource_tracker.getfd()] allfds += fds try: reduction.sendfds(client, allfds) return parent_r, parent_w except: os.close(parent_r) os.close(parent_w) raise finally: os.close(child_r) os.close(child_w) def ensure_running(self): '''Make sure that a fork server is running. This can be called from any process. Note that usually a child process will just reuse the forkserver started by its parent, so ensure_running() will do nothing. ''' with self._lock: resource_tracker.ensure_running() if self._forkserver_pid is not None: # forkserver was launched before, is it still running? pid, status = os.waitpid(self._forkserver_pid, os.WNOHANG) if not pid: # still alive return # dead, launch it again os.close(self._forkserver_alive_fd) self._forkserver_address = None self._forkserver_alive_fd = None self._forkserver_pid = None cmd = ('from multiprocessing.forkserver import main; ' + 'main(%d, %d, %r, **%r)') if self._preload_modules: desired_keys = {'main_path', 'sys_path'} data = spawn.get_preparation_data('ignore') data = {x: y for x, y in data.items() if x in desired_keys} else: data = {} with socket.socket(socket.AF_UNIX) as listener: address = connection.arbitrary_address('AF_UNIX') listener.bind(address) if not util.is_abstract_socket_namespace(address): os.chmod(address, 0o600) listener.listen() # all client processes own the write end of the "alive" pipe; # when they all terminate the read end becomes ready. alive_r, alive_w = os.pipe() try: fds_to_pass = [listener.fileno(), alive_r] cmd %= (listener.fileno(), alive_r, self._preload_modules, data) exe = spawn.get_executable() args = [exe] + util._args_from_interpreter_flags() args += ['-c', cmd] pid = util.spawnv_passfds(exe, args, fds_to_pass) except: os.close(alive_w) raise finally: os.close(alive_r) self._forkserver_address = address self._forkserver_alive_fd = alive_w self._forkserver_pid = pid # # # def main(listener_fd, alive_r, preload, main_path=None, sys_path=None): '''Run forkserver.''' if preload: if sys_path is not None: sys.path[:] = sys_path if '__main__' in preload and main_path is not None: process.current_process()._inheriting = True try: spawn.import_main_path(main_path) finally: del process.current_process()._inheriting for modname in preload: try: __import__(modname) except ImportError: pass util._close_stdin() sig_r, sig_w = os.pipe() os.set_blocking(sig_r, False) os.set_blocking(sig_w, False) def sigchld_handler(*_unused): # Dummy signal handler, doesn't do anything pass handlers = { # unblocking SIGCHLD allows the wakeup fd to notify our event loop signal.SIGCHLD: sigchld_handler, # protect the process from ^C signal.SIGINT: signal.SIG_IGN, } old_handlers = {sig: signal.signal(sig, val) for (sig, val) in handlers.items()} # calling os.write() in the Python signal handler is racy signal.set_wakeup_fd(sig_w) # map child pids to client fds pid_to_fd = {} with socket.socket(socket.AF_UNIX, fileno=listener_fd) as listener, \ selectors.DefaultSelector() as selector: _forkserver._forkserver_address = listener.getsockname() selector.register(listener, selectors.EVENT_READ) selector.register(alive_r, selectors.EVENT_READ) selector.register(sig_r, selectors.EVENT_READ) while True: try: while True: rfds = [key.fileobj for (key, events) in selector.select()] if rfds: break if alive_r in rfds: # EOF because no more client processes left assert os.read(alive_r, 1) == b'', "Not at EOF?" raise SystemExit if sig_r in rfds: # Got SIGCHLD os.read(sig_r, 65536) # exhaust while True: # Scan for child processes try: pid, sts = os.waitpid(-1, os.WNOHANG) except ChildProcessError: break if pid == 0: break child_w = pid_to_fd.pop(pid, None) if child_w is not None: returncode = os.waitstatus_to_exitcode(sts) # Send exit code to client process try: write_signed(child_w, returncode) except BrokenPipeError: # client vanished pass os.close(child_w) else: # This shouldn't happen really warnings.warn('forkserver: waitpid returned ' 'unexpected pid %d' % pid) if listener in rfds: # Incoming fork request with listener.accept()[0] as s: # Receive fds from client fds = reduction.recvfds(s, MAXFDS_TO_SEND + 1) if len(fds) > MAXFDS_TO_SEND: raise RuntimeError( "Too many ({0:n}) fds to send".format( len(fds))) child_r, child_w, *fds = fds s.close() pid = os.fork() if pid == 0: # Child code = 1 try: listener.close() selector.close() unused_fds = [alive_r, child_w, sig_r, sig_w] unused_fds.extend(pid_to_fd.values()) code = _serve_one(child_r, fds, unused_fds, old_handlers) except Exception: sys.excepthook(*sys.exc_info()) sys.stderr.flush() finally: os._exit(code) else: # Send pid to client process try: write_signed(child_w, pid) except BrokenPipeError: # client vanished pass pid_to_fd[pid] = child_w os.close(child_r) for fd in fds: os.close(fd) except OSError as e: if e.errno != errno.ECONNABORTED: raise def _serve_one(child_r, fds, unused_fds, handlers): # close unnecessary stuff and reset signal handlers signal.set_wakeup_fd(-1) for sig, val in handlers.items(): signal.signal(sig, val) for fd in unused_fds: os.close(fd) (_forkserver._forkserver_alive_fd, resource_tracker._resource_tracker._fd, *_forkserver._inherited_fds) = fds # Run process object received over pipe parent_sentinel = os.dup(child_r) code = spawn._main(child_r, parent_sentinel) return code # # Read and write signed numbers # def read_signed(fd): data = b'' length = SIGNED_STRUCT.size while len(data) < length: s = os.read(fd, length - len(data)) if not s: raise EOFError('unexpected EOF') data += s return SIGNED_STRUCT.unpack(data)[0] def write_signed(fd, n): msg = SIGNED_STRUCT.pack(n) while msg: nbytes = os.write(fd, msg) if nbytes == 0: raise RuntimeError('should not get here') msg = msg[nbytes:] # # # _forkserver = ForkServer() ensure_running = _forkserver.ensure_running get_inherited_fds = _forkserver.get_inherited_fds connect_to_new_process = _forkserver.connect_to_new_process set_forkserver_preload = _forkserver.set_forkserver_preload PK:W�\���}j-j-heap.pynu�[���# # Module which supports allocation of memory from an mmap # # multiprocessing/heap.py # # Copyright (c) 2006-2008, R Oudkerk # Licensed to PSF under a Contributor Agreement. # import bisect from collections import defaultdict import mmap import os import sys import tempfile import threading from .context import reduction, assert_spawning from . import util __all__ = ['BufferWrapper'] # # Inheritable class which wraps an mmap, and from which blocks can be allocated # if sys.platform == 'win32': import _winapi class Arena(object): """ A shared memory area backed by anonymous memory (Windows). """ _rand = tempfile._RandomNameSequence() def __init__(self, size): self.size = size for i in range(100): name = 'pym-%d-%s' % (os.getpid(), next(self._rand)) buf = mmap.mmap(-1, size, tagname=name) if _winapi.GetLastError() == 0: break # We have reopened a preexisting mmap. buf.close() else: raise FileExistsError('Cannot find name for new mmap') self.name = name self.buffer = buf self._state = (self.size, self.name) def __getstate__(self): assert_spawning(self) return self._state def __setstate__(self, state): self.size, self.name = self._state = state # Reopen existing mmap self.buffer = mmap.mmap(-1, self.size, tagname=self.name) # XXX Temporarily preventing buildbot failures while determining # XXX the correct long-term fix. See issue 23060 #assert _winapi.GetLastError() == _winapi.ERROR_ALREADY_EXISTS else: class Arena(object): """ A shared memory area backed by a temporary file (POSIX). """ if sys.platform == 'linux': _dir_candidates = ['/dev/shm'] else: _dir_candidates = [] def __init__(self, size, fd=-1): self.size = size self.fd = fd if fd == -1: # Arena is created anew (if fd != -1, it means we're coming # from rebuild_arena() below) self.fd, name = tempfile.mkstemp( prefix='pym-%d-'%os.getpid(), dir=self._choose_dir(size)) os.unlink(name) util.Finalize(self, os.close, (self.fd,)) os.ftruncate(self.fd, size) self.buffer = mmap.mmap(self.fd, self.size) def _choose_dir(self, size): # Choose a non-storage backed directory if possible, # to improve performance for d in self._dir_candidates: st = os.statvfs(d) if st.f_bavail * st.f_frsize >= size: # enough free space? return d return util.get_temp_dir() def reduce_arena(a): if a.fd == -1: raise ValueError('Arena is unpicklable because ' 'forking was enabled when it was created') return rebuild_arena, (a.size, reduction.DupFd(a.fd)) def rebuild_arena(size, dupfd): return Arena(size, dupfd.detach()) reduction.register(Arena, reduce_arena) # # Class allowing allocation of chunks of memory from arenas # class Heap(object): # Minimum malloc() alignment _alignment = 8 _DISCARD_FREE_SPACE_LARGER_THAN = 4 * 1024 ** 2 # 4 MB _DOUBLE_ARENA_SIZE_UNTIL = 4 * 1024 ** 2 def __init__(self, size=mmap.PAGESIZE): self._lastpid = os.getpid() self._lock = threading.Lock() # Current arena allocation size self._size = size # A sorted list of available block sizes in arenas self._lengths = [] # Free block management: # - map each block size to a list of `(Arena, start, stop)` blocks self._len_to_seq = {} # - map `(Arena, start)` tuple to the `(Arena, start, stop)` block # starting at that offset self._start_to_block = {} # - map `(Arena, stop)` tuple to the `(Arena, start, stop)` block # ending at that offset self._stop_to_block = {} # Map arenas to their `(Arena, start, stop)` blocks in use self._allocated_blocks = defaultdict(set) self._arenas = [] # List of pending blocks to free - see comment in free() below self._pending_free_blocks = [] # Statistics self._n_mallocs = 0 self._n_frees = 0 @staticmethod def _roundup(n, alignment): # alignment must be a power of 2 mask = alignment - 1 return (n + mask) & ~mask def _new_arena(self, size): # Create a new arena with at least the given *size* length = self._roundup(max(self._size, size), mmap.PAGESIZE) # We carve larger and larger arenas, for efficiency, until we # reach a large-ish size (roughly L3 cache-sized) if self._size < self._DOUBLE_ARENA_SIZE_UNTIL: self._size *= 2 util.info('allocating a new mmap of length %d', length) arena = Arena(length) self._arenas.append(arena) return (arena, 0, length) def _discard_arena(self, arena): # Possibly delete the given (unused) arena length = arena.size # Reusing an existing arena is faster than creating a new one, so # we only reclaim space if it's large enough. if length < self._DISCARD_FREE_SPACE_LARGER_THAN: return blocks = self._allocated_blocks.pop(arena) assert not blocks del self._start_to_block[(arena, 0)] del self._stop_to_block[(arena, length)] self._arenas.remove(arena) seq = self._len_to_seq[length] seq.remove((arena, 0, length)) if not seq: del self._len_to_seq[length] self._lengths.remove(length) def _malloc(self, size): # returns a large enough block -- it might be much larger i = bisect.bisect_left(self._lengths, size) if i == len(self._lengths): return self._new_arena(size) else: length = self._lengths[i] seq = self._len_to_seq[length] block = seq.pop() if not seq: del self._len_to_seq[length], self._lengths[i] (arena, start, stop) = block del self._start_to_block[(arena, start)] del self._stop_to_block[(arena, stop)] return block def _add_free_block(self, block): # make block available and try to merge with its neighbours in the arena (arena, start, stop) = block try: prev_block = self._stop_to_block[(arena, start)] except KeyError: pass else: start, _ = self._absorb(prev_block) try: next_block = self._start_to_block[(arena, stop)] except KeyError: pass else: _, stop = self._absorb(next_block) block = (arena, start, stop) length = stop - start try: self._len_to_seq[length].append(block) except KeyError: self._len_to_seq[length] = [block] bisect.insort(self._lengths, length) self._start_to_block[(arena, start)] = block self._stop_to_block[(arena, stop)] = block def _absorb(self, block): # deregister this block so it can be merged with a neighbour (arena, start, stop) = block del self._start_to_block[(arena, start)] del self._stop_to_block[(arena, stop)] length = stop - start seq = self._len_to_seq[length] seq.remove(block) if not seq: del self._len_to_seq[length] self._lengths.remove(length) return start, stop def _remove_allocated_block(self, block): arena, start, stop = block blocks = self._allocated_blocks[arena] blocks.remove((start, stop)) if not blocks: # Arena is entirely free, discard it from this process self._discard_arena(arena) def _free_pending_blocks(self): # Free all the blocks in the pending list - called with the lock held. while True: try: block = self._pending_free_blocks.pop() except IndexError: break self._add_free_block(block) self._remove_allocated_block(block) def free(self, block): # free a block returned by malloc() # Since free() can be called asynchronously by the GC, it could happen # that it's called while self._lock is held: in that case, # self._lock.acquire() would deadlock (issue #12352). To avoid that, a # trylock is used instead, and if the lock can't be acquired # immediately, the block is added to a list of blocks to be freed # synchronously sometimes later from malloc() or free(), by calling # _free_pending_blocks() (appending and retrieving from a list is not # strictly thread-safe but under CPython it's atomic thanks to the GIL). if os.getpid() != self._lastpid: raise ValueError( "My pid ({0:n}) is not last pid {1:n}".format( os.getpid(),self._lastpid)) if not self._lock.acquire(False): # can't acquire the lock right now, add the block to the list of # pending blocks to free self._pending_free_blocks.append(block) else: # we hold the lock try: self._n_frees += 1 self._free_pending_blocks() self._add_free_block(block) self._remove_allocated_block(block) finally: self._lock.release() def malloc(self, size): # return a block of right size (possibly rounded up) if size < 0: raise ValueError("Size {0:n} out of range".format(size)) if sys.maxsize <= size: raise OverflowError("Size {0:n} too large".format(size)) if os.getpid() != self._lastpid: self.__init__() # reinitialize after fork with self._lock: self._n_mallocs += 1 # allow pending blocks to be marked available self._free_pending_blocks() size = self._roundup(max(size, 1), self._alignment) (arena, start, stop) = self._malloc(size) real_stop = start + size if real_stop < stop: # if the returned block is larger than necessary, mark # the remainder available self._add_free_block((arena, real_stop, stop)) self._allocated_blocks[arena].add((start, real_stop)) return (arena, start, real_stop) # # Class wrapping a block allocated out of a Heap -- can be inherited by child process # class BufferWrapper(object): _heap = Heap() def __init__(self, size): if size < 0: raise ValueError("Size {0:n} out of range".format(size)) if sys.maxsize <= size: raise OverflowError("Size {0:n} too large".format(size)) block = BufferWrapper._heap.malloc(size) self._state = (block, size) util.Finalize(self, BufferWrapper._heap.free, args=(block,)) def create_memoryview(self): (arena, start, stop), size = self._state return memoryview(arena.buffer)[start:start+size] PK:W�\�i����managers.pynu�[���# # Module providing manager classes for dealing # with shared objects # # multiprocessing/managers.py # # Copyright (c) 2006-2008, R Oudkerk # Licensed to PSF under a Contributor Agreement. # __all__ = [ 'BaseManager', 'SyncManager', 'BaseProxy', 'Token' ] # # Imports # import sys import threading import signal import array import queue import time import types import os from os import getpid from traceback import format_exc from . import connection from .context import reduction, get_spawning_popen, ProcessError from . import pool from . import process from . import util from . import get_context try: from . import shared_memory except ImportError: HAS_SHMEM = False else: HAS_SHMEM = True __all__.append('SharedMemoryManager') # # Register some things for pickling # def reduce_array(a): return array.array, (a.typecode, a.tobytes()) reduction.register(array.array, reduce_array) view_types = [type(getattr({}, name)()) for name in ('items','keys','values')] def rebuild_as_list(obj): return list, (list(obj),) for view_type in view_types: reduction.register(view_type, rebuild_as_list) del view_type, view_types # # Type for identifying shared objects # class Token(object): ''' Type to uniquely identify a shared object ''' __slots__ = ('typeid', 'address', 'id') def __init__(self, typeid, address, id): (self.typeid, self.address, self.id) = (typeid, address, id) def __getstate__(self): return (self.typeid, self.address, self.id) def __setstate__(self, state): (self.typeid, self.address, self.id) = state def __repr__(self): return '%s(typeid=%r, address=%r, id=%r)' % \ (self.__class__.__name__, self.typeid, self.address, self.id) # # Function for communication with a manager's server process # def dispatch(c, id, methodname, args=(), kwds={}): ''' Send a message to manager using connection `c` and return response ''' c.send((id, methodname, args, kwds)) kind, result = c.recv() if kind == '#RETURN': return result raise convert_to_error(kind, result) def convert_to_error(kind, result): if kind == '#ERROR': return result elif kind in ('#TRACEBACK', '#UNSERIALIZABLE'): if not isinstance(result, str): raise TypeError( "Result {0!r} (kind '{1}') type is {2}, not str".format( result, kind, type(result))) if kind == '#UNSERIALIZABLE': return RemoteError('Unserializable message: %s\n' % result) else: return RemoteError(result) else: return ValueError('Unrecognized message type {!r}'.format(kind)) class RemoteError(Exception): def __str__(self): return ('\n' + '-'*75 + '\n' + str(self.args[0]) + '-'*75) # # Functions for finding the method names of an object # def all_methods(obj): ''' Return a list of names of methods of `obj` ''' temp = [] for name in dir(obj): func = getattr(obj, name) if callable(func): temp.append(name) return temp def public_methods(obj): ''' Return a list of names of methods of `obj` which do not start with '_' ''' return [name for name in all_methods(obj) if name[0] != '_'] # # Server which is run in a process controlled by a manager # class Server(object): ''' Server class which runs in a process controlled by a manager object ''' public = ['shutdown', 'create', 'accept_connection', 'get_methods', 'debug_info', 'number_of_objects', 'dummy', 'incref', 'decref'] def __init__(self, registry, address, authkey, serializer): if not isinstance(authkey, bytes): raise TypeError( "Authkey {0!r} is type {1!s}, not bytes".format( authkey, type(authkey))) self.registry = registry self.authkey = process.AuthenticationString(authkey) Listener, Client = listener_client[serializer] # do authentication later self.listener = Listener(address=address, backlog=128) self.address = self.listener.address self.id_to_obj = {'0': (None, ())} self.id_to_refcount = {} self.id_to_local_proxy_obj = {} self.mutex = threading.Lock() def serve_forever(self): ''' Run the server forever ''' self.stop_event = threading.Event() process.current_process()._manager_server = self try: accepter = threading.Thread(target=self.accepter) accepter.daemon = True accepter.start() try: while not self.stop_event.is_set(): self.stop_event.wait(1) except (KeyboardInterrupt, SystemExit): pass finally: if sys.stdout != sys.__stdout__: # what about stderr? util.debug('resetting stdout, stderr') sys.stdout = sys.__stdout__ sys.stderr = sys.__stderr__ sys.exit(0) def accepter(self): while True: try: c = self.listener.accept() except OSError: continue t = threading.Thread(target=self.handle_request, args=(c,)) t.daemon = True t.start() def _handle_request(self, c): request = None try: connection.deliver_challenge(c, self.authkey) connection.answer_challenge(c, self.authkey) request = c.recv() ignore, funcname, args, kwds = request assert funcname in self.public, '%r unrecognized' % funcname func = getattr(self, funcname) except Exception: msg = ('#TRACEBACK', format_exc()) else: try: result = func(c, *args, **kwds) except Exception: msg = ('#TRACEBACK', format_exc()) else: msg = ('#RETURN', result) try: c.send(msg) except Exception as e: try: c.send(('#TRACEBACK', format_exc())) except Exception: pass util.info('Failure to send message: %r', msg) util.info(' ... request was %r', request) util.info(' ... exception was %r', e) def handle_request(self, conn): ''' Handle a new connection ''' try: self._handle_request(conn) except SystemExit: # Server.serve_client() calls sys.exit(0) on EOF pass finally: conn.close() def serve_client(self, conn): ''' Handle requests from the proxies in a particular process/thread ''' util.debug('starting server thread to service %r', threading.current_thread().name) recv = conn.recv send = conn.send id_to_obj = self.id_to_obj while not self.stop_event.is_set(): try: methodname = obj = None request = recv() ident, methodname, args, kwds = request try: obj, exposed, gettypeid = id_to_obj[ident] except KeyError as ke: try: obj, exposed, gettypeid = \ self.id_to_local_proxy_obj[ident] except KeyError: raise ke if methodname not in exposed: raise AttributeError( 'method %r of %r object is not in exposed=%r' % (methodname, type(obj), exposed) ) function = getattr(obj, methodname) try: res = function(*args, **kwds) except Exception as e: msg = ('#ERROR', e) else: typeid = gettypeid and gettypeid.get(methodname, None) if typeid: rident, rexposed = self.create(conn, typeid, res) token = Token(typeid, self.address, rident) msg = ('#PROXY', (rexposed, token)) else: msg = ('#RETURN', res) except AttributeError: if methodname is None: msg = ('#TRACEBACK', format_exc()) else: try: fallback_func = self.fallback_mapping[methodname] result = fallback_func( self, conn, ident, obj, *args, **kwds ) msg = ('#RETURN', result) except Exception: msg = ('#TRACEBACK', format_exc()) except EOFError: util.debug('got EOF -- exiting thread serving %r', threading.current_thread().name) sys.exit(0) except Exception: msg = ('#TRACEBACK', format_exc()) try: try: send(msg) except Exception: send(('#UNSERIALIZABLE', format_exc())) except Exception as e: util.info('exception in thread serving %r', threading.current_thread().name) util.info(' ... message was %r', msg) util.info(' ... exception was %r', e) conn.close() sys.exit(1) def fallback_getvalue(self, conn, ident, obj): return obj def fallback_str(self, conn, ident, obj): return str(obj) def fallback_repr(self, conn, ident, obj): return repr(obj) fallback_mapping = { '__str__':fallback_str, '__repr__':fallback_repr, '#GETVALUE':fallback_getvalue } def dummy(self, c): pass def debug_info(self, c): ''' Return some info --- useful to spot problems with refcounting ''' # Perhaps include debug info about 'c'? with self.mutex: result = [] keys = list(self.id_to_refcount.keys()) keys.sort() for ident in keys: if ident != '0': result.append(' %s: refcount=%s\n %s' % (ident, self.id_to_refcount[ident], str(self.id_to_obj[ident][0])[:75])) return '\n'.join(result) def number_of_objects(self, c): ''' Number of shared objects ''' # Doesn't use (len(self.id_to_obj) - 1) as we shouldn't count ident='0' return len(self.id_to_refcount) def shutdown(self, c): ''' Shutdown this process ''' try: util.debug('manager received shutdown message') c.send(('#RETURN', None)) except: import traceback traceback.print_exc() finally: self.stop_event.set() def create(self, c, typeid, /, *args, **kwds): ''' Create a new shared object and return its id ''' with self.mutex: callable, exposed, method_to_typeid, proxytype = \ self.registry[typeid] if callable is None: if kwds or (len(args) != 1): raise ValueError( "Without callable, must have one non-keyword argument") obj = args[0] else: obj = callable(*args, **kwds) if exposed is None: exposed = public_methods(obj) if method_to_typeid is not None: if not isinstance(method_to_typeid, dict): raise TypeError( "Method_to_typeid {0!r}: type {1!s}, not dict".format( method_to_typeid, type(method_to_typeid))) exposed = list(exposed) + list(method_to_typeid) ident = '%x' % id(obj) # convert to string because xmlrpclib # only has 32 bit signed integers util.debug('%r callable returned object with id %r', typeid, ident) self.id_to_obj[ident] = (obj, set(exposed), method_to_typeid) if ident not in self.id_to_refcount: self.id_to_refcount[ident] = 0 self.incref(c, ident) return ident, tuple(exposed) def get_methods(self, c, token): ''' Return the methods of the shared object indicated by token ''' return tuple(self.id_to_obj[token.id][1]) def accept_connection(self, c, name): ''' Spawn a new thread to serve this connection ''' threading.current_thread().name = name c.send(('#RETURN', None)) self.serve_client(c) def incref(self, c, ident): with self.mutex: try: self.id_to_refcount[ident] += 1 except KeyError as ke: # If no external references exist but an internal (to the # manager) still does and a new external reference is created # from it, restore the manager's tracking of it from the # previously stashed internal ref. if ident in self.id_to_local_proxy_obj: self.id_to_refcount[ident] = 1 self.id_to_obj[ident] = \ self.id_to_local_proxy_obj[ident] util.debug('Server re-enabled tracking & INCREF %r', ident) else: raise ke def decref(self, c, ident): if ident not in self.id_to_refcount and \ ident in self.id_to_local_proxy_obj: util.debug('Server DECREF skipping %r', ident) return with self.mutex: if self.id_to_refcount[ident] <= 0: raise AssertionError( "Id {0!s} ({1!r}) has refcount {2:n}, not 1+".format( ident, self.id_to_obj[ident], self.id_to_refcount[ident])) self.id_to_refcount[ident] -= 1 if self.id_to_refcount[ident] == 0: del self.id_to_refcount[ident] if ident not in self.id_to_refcount: # Two-step process in case the object turns out to contain other # proxy objects (e.g. a managed list of managed lists). # Otherwise, deleting self.id_to_obj[ident] would trigger the # deleting of the stored value (another managed object) which would # in turn attempt to acquire the mutex that is already held here. self.id_to_obj[ident] = (None, (), None) # thread-safe util.debug('disposing of obj with id %r', ident) with self.mutex: del self.id_to_obj[ident] # # Class to represent state of a manager # class State(object): __slots__ = ['value'] INITIAL = 0 STARTED = 1 SHUTDOWN = 2 # # Mapping from serializer name to Listener and Client types # listener_client = { 'pickle' : (connection.Listener, connection.Client), 'xmlrpclib' : (connection.XmlListener, connection.XmlClient) } # # Definition of BaseManager # class BaseManager(object): ''' Base class for managers ''' _registry = {} _Server = Server def __init__(self, address=None, authkey=None, serializer='pickle', ctx=None, *, shutdown_timeout=1.0): if authkey is None: authkey = process.current_process().authkey self._address = address # XXX not final address if eg ('', 0) self._authkey = process.AuthenticationString(authkey) self._state = State() self._state.value = State.INITIAL self._serializer = serializer self._Listener, self._Client = listener_client[serializer] self._ctx = ctx or get_context() self._shutdown_timeout = shutdown_timeout def get_server(self): ''' Return server object with serve_forever() method and address attribute ''' if self._state.value != State.INITIAL: if self._state.value == State.STARTED: raise ProcessError("Already started server") elif self._state.value == State.SHUTDOWN: raise ProcessError("Manager has shut down") else: raise ProcessError( "Unknown state {!r}".format(self._state.value)) return Server(self._registry, self._address, self._authkey, self._serializer) def connect(self): ''' Connect manager object to the server process ''' Listener, Client = listener_client[self._serializer] conn = Client(self._address, authkey=self._authkey) dispatch(conn, None, 'dummy') self._state.value = State.STARTED def start(self, initializer=None, initargs=()): ''' Spawn a server process for this manager object ''' if self._state.value != State.INITIAL: if self._state.value == State.STARTED: raise ProcessError("Already started server") elif self._state.value == State.SHUTDOWN: raise ProcessError("Manager has shut down") else: raise ProcessError( "Unknown state {!r}".format(self._state.value)) if initializer is not None and not callable(initializer): raise TypeError('initializer must be a callable') # pipe over which we will retrieve address of server reader, writer = connection.Pipe(duplex=False) # spawn process which runs a server self._process = self._ctx.Process( target=type(self)._run_server, args=(self._registry, self._address, self._authkey, self._serializer, writer, initializer, initargs), ) ident = ':'.join(str(i) for i in self._process._identity) self._process.name = type(self).__name__ + '-' + ident self._process.start() # get address of server writer.close() self._address = reader.recv() reader.close() # register a finalizer self._state.value = State.STARTED self.shutdown = util.Finalize( self, type(self)._finalize_manager, args=(self._process, self._address, self._authkey, self._state, self._Client, self._shutdown_timeout), exitpriority=0 ) @classmethod def _run_server(cls, registry, address, authkey, serializer, writer, initializer=None, initargs=()): ''' Create a server, report its address and run it ''' # bpo-36368: protect server process from KeyboardInterrupt signals signal.signal(signal.SIGINT, signal.SIG_IGN) if initializer is not None: initializer(*initargs) # create server server = cls._Server(registry, address, authkey, serializer) # inform parent process of the server's address writer.send(server.address) writer.close() # run the manager util.info('manager serving at %r', server.address) server.serve_forever() def _create(self, typeid, /, *args, **kwds): ''' Create a new shared object; return the token and exposed tuple ''' assert self._state.value == State.STARTED, 'server not yet started' conn = self._Client(self._address, authkey=self._authkey) try: id, exposed = dispatch(conn, None, 'create', (typeid,)+args, kwds) finally: conn.close() return Token(typeid, self._address, id), exposed def join(self, timeout=None): ''' Join the manager process (if it has been spawned) ''' if self._process is not None: self._process.join(timeout) if not self._process.is_alive(): self._process = None def _debug_info(self): ''' Return some info about the servers shared objects and connections ''' conn = self._Client(self._address, authkey=self._authkey) try: return dispatch(conn, None, 'debug_info') finally: conn.close() def _number_of_objects(self): ''' Return the number of shared objects ''' conn = self._Client(self._address, authkey=self._authkey) try: return dispatch(conn, None, 'number_of_objects') finally: conn.close() def __enter__(self): if self._state.value == State.INITIAL: self.start() if self._state.value != State.STARTED: if self._state.value == State.INITIAL: raise ProcessError("Unable to start server") elif self._state.value == State.SHUTDOWN: raise ProcessError("Manager has shut down") else: raise ProcessError( "Unknown state {!r}".format(self._state.value)) return self def __exit__(self, exc_type, exc_val, exc_tb): self.shutdown() @staticmethod def _finalize_manager(process, address, authkey, state, _Client, shutdown_timeout): ''' Shutdown the manager process; will be registered as a finalizer ''' if process.is_alive(): util.info('sending shutdown message to manager') try: conn = _Client(address, authkey=authkey) try: dispatch(conn, None, 'shutdown') finally: conn.close() except Exception: pass process.join(timeout=shutdown_timeout) if process.is_alive(): util.info('manager still alive') if hasattr(process, 'terminate'): util.info('trying to `terminate()` manager process') process.terminate() process.join(timeout=shutdown_timeout) if process.is_alive(): util.info('manager still alive after terminate') process.kill() process.join() state.value = State.SHUTDOWN try: del BaseProxy._address_to_local[address] except KeyError: pass @property def address(self): return self._address @classmethod def register(cls, typeid, callable=None, proxytype=None, exposed=None, method_to_typeid=None, create_method=True): ''' Register a typeid with the manager type ''' if '_registry' not in cls.__dict__: cls._registry = cls._registry.copy() if proxytype is None: proxytype = AutoProxy exposed = exposed or getattr(proxytype, '_exposed_', None) method_to_typeid = method_to_typeid or \ getattr(proxytype, '_method_to_typeid_', None) if method_to_typeid: for key, value in list(method_to_typeid.items()): # isinstance? assert type(key) is str, '%r is not a string' % key assert type(value) is str, '%r is not a string' % value cls._registry[typeid] = ( callable, exposed, method_to_typeid, proxytype ) if create_method: def temp(self, /, *args, **kwds): util.debug('requesting creation of a shared %r object', typeid) token, exp = self._create(typeid, *args, **kwds) proxy = proxytype( token, self._serializer, manager=self, authkey=self._authkey, exposed=exp ) conn = self._Client(token.address, authkey=self._authkey) dispatch(conn, None, 'decref', (token.id,)) return proxy temp.__name__ = typeid setattr(cls, typeid, temp) # # Subclass of set which get cleared after a fork # class ProcessLocalSet(set): def __init__(self): util.register_after_fork(self, lambda obj: obj.clear()) def __reduce__(self): return type(self), () # # Definition of BaseProxy # class BaseProxy(object): ''' A base for proxies of shared objects ''' _address_to_local = {} _mutex = util.ForkAwareThreadLock() # Each instance gets a `_serial` number. Unlike `id(...)`, this number # is never reused. _next_serial = 1 def __init__(self, token, serializer, manager=None, authkey=None, exposed=None, incref=True, manager_owned=False): with BaseProxy._mutex: tls_serials = BaseProxy._address_to_local.get(token.address, None) if tls_serials is None: tls_serials = util.ForkAwareLocal(), ProcessLocalSet() BaseProxy._address_to_local[token.address] = tls_serials self._serial = BaseProxy._next_serial BaseProxy._next_serial += 1 # self._tls is used to record the connection used by this # thread to communicate with the manager at token.address self._tls = tls_serials[0] # self._all_serials is a set used to record the identities of all # shared objects for which the current process owns references and # which are in the manager at token.address self._all_serials = tls_serials[1] self._token = token self._id = self._token.id self._manager = manager self._serializer = serializer self._Client = listener_client[serializer][1] # Should be set to True only when a proxy object is being created # on the manager server; primary use case: nested proxy objects. # RebuildProxy detects when a proxy is being created on the manager # and sets this value appropriately. self._owned_by_manager = manager_owned if authkey is not None: self._authkey = process.AuthenticationString(authkey) elif self._manager is not None: self._authkey = self._manager._authkey else: self._authkey = process.current_process().authkey if incref: self._incref() util.register_after_fork(self, BaseProxy._after_fork) def _connect(self): util.debug('making connection to manager') name = process.current_process().name if threading.current_thread().name != 'MainThread': name += '|' + threading.current_thread().name conn = self._Client(self._token.address, authkey=self._authkey) dispatch(conn, None, 'accept_connection', (name,)) self._tls.connection = conn def _callmethod(self, methodname, args=(), kwds={}): ''' Try to call a method of the referent and return a copy of the result ''' try: conn = self._tls.connection except AttributeError: util.debug('thread %r does not own a connection', threading.current_thread().name) self._connect() conn = self._tls.connection conn.send((self._id, methodname, args, kwds)) kind, result = conn.recv() if kind == '#RETURN': return result elif kind == '#PROXY': exposed, token = result proxytype = self._manager._registry[token.typeid][-1] token.address = self._token.address proxy = proxytype( token, self._serializer, manager=self._manager, authkey=self._authkey, exposed=exposed ) conn = self._Client(token.address, authkey=self._authkey) dispatch(conn, None, 'decref', (token.id,)) return proxy raise convert_to_error(kind, result) def _getvalue(self): ''' Get a copy of the value of the referent ''' return self._callmethod('#GETVALUE') def _incref(self): if self._owned_by_manager: util.debug('owned_by_manager skipped INCREF of %r', self._token.id) return conn = self._Client(self._token.address, authkey=self._authkey) dispatch(conn, None, 'incref', (self._id,)) util.debug('INCREF %r', self._token.id) self._all_serials.add(self._serial) state = self._manager and self._manager._state self._close = util.Finalize( self, BaseProxy._decref, args=(self._token, self._serial, self._authkey, state, self._tls, self._all_serials, self._Client), exitpriority=10 ) @staticmethod def _decref(token, serial, authkey, state, tls, idset, _Client): idset.discard(serial) # check whether manager is still alive if state is None or state.value == State.STARTED: # tell manager this process no longer cares about referent try: util.debug('DECREF %r', token.id) conn = _Client(token.address, authkey=authkey) dispatch(conn, None, 'decref', (token.id,)) except Exception as e: util.debug('... decref failed %s', e) else: util.debug('DECREF %r -- manager already shutdown', token.id) # check whether we can close this thread's connection because # the process owns no more references to objects for this manager if not idset and hasattr(tls, 'connection'): util.debug('thread %r has no more proxies so closing conn', threading.current_thread().name) tls.connection.close() del tls.connection def _after_fork(self): self._manager = None try: self._incref() except Exception as e: # the proxy may just be for a manager which has shutdown util.info('incref failed: %s' % e) def __reduce__(self): kwds = {} if get_spawning_popen() is not None: kwds['authkey'] = self._authkey if getattr(self, '_isauto', False): kwds['exposed'] = self._exposed_ return (RebuildProxy, (AutoProxy, self._token, self._serializer, kwds)) else: return (RebuildProxy, (type(self), self._token, self._serializer, kwds)) def __deepcopy__(self, memo): return self._getvalue() def __repr__(self): return '<%s object, typeid %r at %#x>' % \ (type(self).__name__, self._token.typeid, id(self)) def __str__(self): ''' Return representation of the referent (or a fall-back if that fails) ''' try: return self._callmethod('__repr__') except Exception: return repr(self)[:-1] + "; '__str__()' failed>" # # Function used for unpickling # def RebuildProxy(func, token, serializer, kwds): ''' Function used for unpickling proxy objects. ''' server = getattr(process.current_process(), '_manager_server', None) if server and server.address == token.address: util.debug('Rebuild a proxy owned by manager, token=%r', token) kwds['manager_owned'] = True if token.id not in server.id_to_local_proxy_obj: server.id_to_local_proxy_obj[token.id] = \ server.id_to_obj[token.id] incref = ( kwds.pop('incref', True) and not getattr(process.current_process(), '_inheriting', False) ) return func(token, serializer, incref=incref, **kwds) # # Functions to create proxies and proxy types # def MakeProxyType(name, exposed, _cache={}): ''' Return a proxy type whose methods are given by `exposed` ''' exposed = tuple(exposed) try: return _cache[(name, exposed)] except KeyError: pass dic = {} for meth in exposed: exec('''def %s(self, /, *args, **kwds): return self._callmethod(%r, args, kwds)''' % (meth, meth), dic) ProxyType = type(name, (BaseProxy,), dic) ProxyType._exposed_ = exposed _cache[(name, exposed)] = ProxyType return ProxyType def AutoProxy(token, serializer, manager=None, authkey=None, exposed=None, incref=True, manager_owned=False): ''' Return an auto-proxy for `token` ''' _Client = listener_client[serializer][1] if exposed is None: conn = _Client(token.address, authkey=authkey) try: exposed = dispatch(conn, None, 'get_methods', (token,)) finally: conn.close() if authkey is None and manager is not None: authkey = manager._authkey if authkey is None: authkey = process.current_process().authkey ProxyType = MakeProxyType('AutoProxy[%s]' % token.typeid, exposed) proxy = ProxyType(token, serializer, manager=manager, authkey=authkey, incref=incref, manager_owned=manager_owned) proxy._isauto = True return proxy # # Types/callables which we will register with SyncManager # class Namespace(object): def __init__(self, /, **kwds): self.__dict__.update(kwds) def __repr__(self): items = list(self.__dict__.items()) temp = [] for name, value in items: if not name.startswith('_'): temp.append('%s=%r' % (name, value)) temp.sort() return '%s(%s)' % (self.__class__.__name__, ', '.join(temp)) class Value(object): def __init__(self, typecode, value, lock=True): self._typecode = typecode self._value = value def get(self): return self._value def set(self, value): self._value = value def __repr__(self): return '%s(%r, %r)'%(type(self).__name__, self._typecode, self._value) value = property(get, set) def Array(typecode, sequence, lock=True): return array.array(typecode, sequence) # # Proxy types used by SyncManager # class IteratorProxy(BaseProxy): _exposed_ = ('__next__', 'send', 'throw', 'close') def __iter__(self): return self def __next__(self, *args): return self._callmethod('__next__', args) def send(self, *args): return self._callmethod('send', args) def throw(self, *args): return self._callmethod('throw', args) def close(self, *args): return self._callmethod('close', args) class AcquirerProxy(BaseProxy): _exposed_ = ('acquire', 'release') def acquire(self, blocking=True, timeout=None): args = (blocking,) if timeout is None else (blocking, timeout) return self._callmethod('acquire', args) def release(self): return self._callmethod('release') def __enter__(self): return self._callmethod('acquire') def __exit__(self, exc_type, exc_val, exc_tb): return self._callmethod('release') class ConditionProxy(AcquirerProxy): _exposed_ = ('acquire', 'release', 'wait', 'notify', 'notify_all') def wait(self, timeout=None): return self._callmethod('wait', (timeout,)) def notify(self, n=1): return self._callmethod('notify', (n,)) def notify_all(self): return self._callmethod('notify_all') def wait_for(self, predicate, timeout=None): result = predicate() if result: return result if timeout is not None: endtime = time.monotonic() + timeout else: endtime = None waittime = None while not result: if endtime is not None: waittime = endtime - time.monotonic() if waittime <= 0: break self.wait(waittime) result = predicate() return result class EventProxy(BaseProxy): _exposed_ = ('is_set', 'set', 'clear', 'wait') def is_set(self): return self._callmethod('is_set') def set(self): return self._callmethod('set') def clear(self): return self._callmethod('clear') def wait(self, timeout=None): return self._callmethod('wait', (timeout,)) class BarrierProxy(BaseProxy): _exposed_ = ('__getattribute__', 'wait', 'abort', 'reset') def wait(self, timeout=None): return self._callmethod('wait', (timeout,)) def abort(self): return self._callmethod('abort') def reset(self): return self._callmethod('reset') @property def parties(self): return self._callmethod('__getattribute__', ('parties',)) @property def n_waiting(self): return self._callmethod('__getattribute__', ('n_waiting',)) @property def broken(self): return self._callmethod('__getattribute__', ('broken',)) class NamespaceProxy(BaseProxy): _exposed_ = ('__getattribute__', '__setattr__', '__delattr__') def __getattr__(self, key): if key[0] == '_': return object.__getattribute__(self, key) callmethod = object.__getattribute__(self, '_callmethod') return callmethod('__getattribute__', (key,)) def __setattr__(self, key, value): if key[0] == '_': return object.__setattr__(self, key, value) callmethod = object.__getattribute__(self, '_callmethod') return callmethod('__setattr__', (key, value)) def __delattr__(self, key): if key[0] == '_': return object.__delattr__(self, key) callmethod = object.__getattribute__(self, '_callmethod') return callmethod('__delattr__', (key,)) class ValueProxy(BaseProxy): _exposed_ = ('get', 'set') def get(self): return self._callmethod('get') def set(self, value): return self._callmethod('set', (value,)) value = property(get, set) __class_getitem__ = classmethod(types.GenericAlias) BaseListProxy = MakeProxyType('BaseListProxy', ( '__add__', '__contains__', '__delitem__', '__getitem__', '__len__', '__mul__', '__reversed__', '__rmul__', '__setitem__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort', '__imul__' )) class ListProxy(BaseListProxy): def __iadd__(self, value): self._callmethod('extend', (value,)) return self def __imul__(self, value): self._callmethod('__imul__', (value,)) return self DictProxy = MakeProxyType('DictProxy', ( '__contains__', '__delitem__', '__getitem__', '__iter__', '__len__', '__setitem__', 'clear', 'copy', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values' )) DictProxy._method_to_typeid_ = { '__iter__': 'Iterator', } ArrayProxy = MakeProxyType('ArrayProxy', ( '__len__', '__getitem__', '__setitem__' )) BasePoolProxy = MakeProxyType('PoolProxy', ( 'apply', 'apply_async', 'close', 'imap', 'imap_unordered', 'join', 'map', 'map_async', 'starmap', 'starmap_async', 'terminate', )) BasePoolProxy._method_to_typeid_ = { 'apply_async': 'AsyncResult', 'map_async': 'AsyncResult', 'starmap_async': 'AsyncResult', 'imap': 'Iterator', 'imap_unordered': 'Iterator' } class PoolProxy(BasePoolProxy): def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): self.terminate() # # Definition of SyncManager # class SyncManager(BaseManager): ''' Subclass of `BaseManager` which supports a number of shared object types. The types registered are those intended for the synchronization of threads, plus `dict`, `list` and `Namespace`. The `multiprocessing.Manager()` function creates started instances of this class. ''' SyncManager.register('Queue', queue.Queue) SyncManager.register('JoinableQueue', queue.Queue) SyncManager.register('Event', threading.Event, EventProxy) SyncManager.register('Lock', threading.Lock, AcquirerProxy) SyncManager.register('RLock', threading.RLock, AcquirerProxy) SyncManager.register('Semaphore', threading.Semaphore, AcquirerProxy) SyncManager.register('BoundedSemaphore', threading.BoundedSemaphore, AcquirerProxy) SyncManager.register('Condition', threading.Condition, ConditionProxy) SyncManager.register('Barrier', threading.Barrier, BarrierProxy) SyncManager.register('Pool', pool.Pool, PoolProxy) SyncManager.register('list', list, ListProxy) SyncManager.register('dict', dict, DictProxy) SyncManager.register('Value', Value, ValueProxy) SyncManager.register('Array', Array, ArrayProxy) SyncManager.register('Namespace', Namespace, NamespaceProxy) # types returned by methods of PoolProxy SyncManager.register('Iterator', proxytype=IteratorProxy, create_method=False) SyncManager.register('AsyncResult', create_method=False) # # Definition of SharedMemoryManager and SharedMemoryServer # if HAS_SHMEM: class _SharedMemoryTracker: "Manages one or more shared memory segments." def __init__(self, name, segment_names=[]): self.shared_memory_context_name = name self.segment_names = segment_names def register_segment(self, segment_name): "Adds the supplied shared memory block name to tracker." util.debug(f"Register segment {segment_name!r} in pid {getpid()}") self.segment_names.append(segment_name) def destroy_segment(self, segment_name): """Calls unlink() on the shared memory block with the supplied name and removes it from the list of blocks being tracked.""" util.debug(f"Destroy segment {segment_name!r} in pid {getpid()}") self.segment_names.remove(segment_name) segment = shared_memory.SharedMemory(segment_name) segment.close() segment.unlink() def unlink(self): "Calls destroy_segment() on all tracked shared memory blocks." for segment_name in self.segment_names[:]: self.destroy_segment(segment_name) def __del__(self): util.debug(f"Call {self.__class__.__name__}.__del__ in {getpid()}") self.unlink() def __getstate__(self): return (self.shared_memory_context_name, self.segment_names) def __setstate__(self, state): self.__init__(*state) class SharedMemoryServer(Server): public = Server.public + \ ['track_segment', 'release_segment', 'list_segments'] def __init__(self, *args, **kwargs): Server.__init__(self, *args, **kwargs) address = self.address # The address of Linux abstract namespaces can be bytes if isinstance(address, bytes): address = os.fsdecode(address) self.shared_memory_context = \ _SharedMemoryTracker(f"shm_{address}_{getpid()}") util.debug(f"SharedMemoryServer started by pid {getpid()}") def create(self, c, typeid, /, *args, **kwargs): """Create a new distributed-shared object (not backed by a shared memory block) and return its id to be used in a Proxy Object.""" # Unless set up as a shared proxy, don't make shared_memory_context # a standard part of kwargs. This makes things easier for supplying # simple functions. if hasattr(self.registry[typeid][-1], "_shared_memory_proxy"): kwargs['shared_memory_context'] = self.shared_memory_context return Server.create(self, c, typeid, *args, **kwargs) def shutdown(self, c): "Call unlink() on all tracked shared memory, terminate the Server." self.shared_memory_context.unlink() return Server.shutdown(self, c) def track_segment(self, c, segment_name): "Adds the supplied shared memory block name to Server's tracker." self.shared_memory_context.register_segment(segment_name) def release_segment(self, c, segment_name): """Calls unlink() on the shared memory block with the supplied name and removes it from the tracker instance inside the Server.""" self.shared_memory_context.destroy_segment(segment_name) def list_segments(self, c): """Returns a list of names of shared memory blocks that the Server is currently tracking.""" return self.shared_memory_context.segment_names class SharedMemoryManager(BaseManager): """Like SyncManager but uses SharedMemoryServer instead of Server. It provides methods for creating and returning SharedMemory instances and for creating a list-like object (ShareableList) backed by shared memory. It also provides methods that create and return Proxy Objects that support synchronization across processes (i.e. multi-process-safe locks and semaphores). """ _Server = SharedMemoryServer def __init__(self, *args, **kwargs): if os.name == "posix": # bpo-36867: Ensure the resource_tracker is running before # launching the manager process, so that concurrent # shared_memory manipulation both in the manager and in the # current process does not create two resource_tracker # processes. from . import resource_tracker resource_tracker.ensure_running() BaseManager.__init__(self, *args, **kwargs) util.debug(f"{self.__class__.__name__} created by pid {getpid()}") def __del__(self): util.debug(f"{self.__class__.__name__}.__del__ by pid {getpid()}") def get_server(self): 'Better than monkeypatching for now; merge into Server ultimately' if self._state.value != State.INITIAL: if self._state.value == State.STARTED: raise ProcessError("Already started SharedMemoryServer") elif self._state.value == State.SHUTDOWN: raise ProcessError("SharedMemoryManager has shut down") else: raise ProcessError( "Unknown state {!r}".format(self._state.value)) return self._Server(self._registry, self._address, self._authkey, self._serializer) def SharedMemory(self, size): """Returns a new SharedMemory instance with the specified size in bytes, to be tracked by the manager.""" with self._Client(self._address, authkey=self._authkey) as conn: sms = shared_memory.SharedMemory(None, create=True, size=size) try: dispatch(conn, None, 'track_segment', (sms.name,)) except BaseException as e: sms.unlink() raise e return sms def ShareableList(self, sequence): """Returns a new ShareableList instance populated with the values from the input sequence, to be tracked by the manager.""" with self._Client(self._address, authkey=self._authkey) as conn: sl = shared_memory.ShareableList(sequence) try: dispatch(conn, None, 'track_segment', (sl.shm.name,)) except BaseException as e: sl.shm.unlink() raise e return sl PK:W�\�w�=��pool.pynu�[���# # Module providing the `Pool` class for managing a process pool # # multiprocessing/pool.py # # Copyright (c) 2006-2008, R Oudkerk # Licensed to PSF under a Contributor Agreement. # __all__ = ['Pool', 'ThreadPool'] # # Imports # import collections import itertools import os import queue import threading import time import traceback import types import warnings # If threading is available then ThreadPool should be provided. Therefore # we avoid top-level imports which are liable to fail on some systems. from . import util from . import get_context, TimeoutError from .connection import wait # # Constants representing the state of a pool # INIT = "INIT" RUN = "RUN" CLOSE = "CLOSE" TERMINATE = "TERMINATE" # # Miscellaneous # job_counter = itertools.count() def mapstar(args): return list(map(*args)) def starmapstar(args): return list(itertools.starmap(args[0], args[1])) # # Hack to embed stringification of remote traceback in local traceback # class RemoteTraceback(Exception): def __init__(self, tb): self.tb = tb def __str__(self): return self.tb class ExceptionWithTraceback: def __init__(self, exc, tb): tb = traceback.format_exception(type(exc), exc, tb) tb = ''.join(tb) self.exc = exc self.tb = '\n"""\n%s"""' % tb def __reduce__(self): return rebuild_exc, (self.exc, self.tb) def rebuild_exc(exc, tb): exc.__cause__ = RemoteTraceback(tb) return exc # # Code run by worker processes # class MaybeEncodingError(Exception): """Wraps possible unpickleable errors, so they can be safely sent through the socket.""" def __init__(self, exc, value): self.exc = repr(exc) self.value = repr(value) super(MaybeEncodingError, self).__init__(self.exc, self.value) def __str__(self): return "Error sending result: '%s'. Reason: '%s'" % (self.value, self.exc) def __repr__(self): return "<%s: %s>" % (self.__class__.__name__, self) def worker(inqueue, outqueue, initializer=None, initargs=(), maxtasks=None, wrap_exception=False): if (maxtasks is not None) and not (isinstance(maxtasks, int) and maxtasks >= 1): raise AssertionError("Maxtasks {!r} is not valid".format(maxtasks)) put = outqueue.put get = inqueue.get if hasattr(inqueue, '_writer'): inqueue._writer.close() outqueue._reader.close() if initializer is not None: initializer(*initargs) completed = 0 while maxtasks is None or (maxtasks and completed < maxtasks): try: task = get() except (EOFError, OSError): util.debug('worker got EOFError or OSError -- exiting') break if task is None: util.debug('worker got sentinel -- exiting') break job, i, func, args, kwds = task try: result = (True, func(*args, **kwds)) except Exception as e: if wrap_exception and func is not _helper_reraises_exception: e = ExceptionWithTraceback(e, e.__traceback__) result = (False, e) try: put((job, i, result)) except Exception as e: wrapped = MaybeEncodingError(e, result[1]) util.debug("Possible encoding error while sending result: %s" % ( wrapped)) put((job, i, (False, wrapped))) task = job = result = func = args = kwds = None completed += 1 util.debug('worker exiting after %d tasks' % completed) def _helper_reraises_exception(ex): 'Pickle-able helper function for use by _guarded_task_generation.' raise ex # # Class representing a process pool # class _PoolCache(dict): """ Class that implements a cache for the Pool class that will notify the pool management threads every time the cache is emptied. The notification is done by the use of a queue that is provided when instantiating the cache. """ def __init__(self, /, *args, notifier=None, **kwds): self.notifier = notifier super().__init__(*args, **kwds) def __delitem__(self, item): super().__delitem__(item) # Notify that the cache is empty. This is important because the # pool keeps maintaining workers until the cache gets drained. This # eliminates a race condition in which a task is finished after the # the pool's _handle_workers method has enter another iteration of the # loop. In this situation, the only event that can wake up the pool # is the cache to be emptied (no more tasks available). if not self: self.notifier.put(None) class Pool(object): ''' Class which supports an async version of applying functions to arguments. ''' _wrap_exception = True @staticmethod def Process(ctx, *args, **kwds): return ctx.Process(*args, **kwds) def __init__(self, processes=None, initializer=None, initargs=(), maxtasksperchild=None, context=None): # Attributes initialized early to make sure that they exist in # __del__() if __init__() raises an exception self._pool = [] self._state = INIT self._ctx = context or get_context() self._setup_queues() self._taskqueue = queue.SimpleQueue() # The _change_notifier queue exist to wake up self._handle_workers() # when the cache (self._cache) is empty or when there is a change in # the _state variable of the thread that runs _handle_workers. self._change_notifier = self._ctx.SimpleQueue() self._cache = _PoolCache(notifier=self._change_notifier) self._maxtasksperchild = maxtasksperchild self._initializer = initializer self._initargs = initargs if processes is None: processes = os.cpu_count() or 1 if processes < 1: raise ValueError("Number of processes must be at least 1") if maxtasksperchild is not None: if not isinstance(maxtasksperchild, int) or maxtasksperchild <= 0: raise ValueError("maxtasksperchild must be a positive int or None") if initializer is not None and not callable(initializer): raise TypeError('initializer must be a callable') self._processes = processes try: self._repopulate_pool() except Exception: for p in self._pool: if p.exitcode is None: p.terminate() for p in self._pool: p.join() raise sentinels = self._get_sentinels() self._worker_handler = threading.Thread( target=Pool._handle_workers, args=(self._cache, self._taskqueue, self._ctx, self.Process, self._processes, self._pool, self._inqueue, self._outqueue, self._initializer, self._initargs, self._maxtasksperchild, self._wrap_exception, sentinels, self._change_notifier) ) self._worker_handler.daemon = True self._worker_handler._state = RUN self._worker_handler.start() self._task_handler = threading.Thread( target=Pool._handle_tasks, args=(self._taskqueue, self._quick_put, self._outqueue, self._pool, self._cache) ) self._task_handler.daemon = True self._task_handler._state = RUN self._task_handler.start() self._result_handler = threading.Thread( target=Pool._handle_results, args=(self._outqueue, self._quick_get, self._cache) ) self._result_handler.daemon = True self._result_handler._state = RUN self._result_handler.start() self._terminate = util.Finalize( self, self._terminate_pool, args=(self._taskqueue, self._inqueue, self._outqueue, self._pool, self._change_notifier, self._worker_handler, self._task_handler, self._result_handler, self._cache), exitpriority=15 ) self._state = RUN # Copy globals as function locals to make sure that they are available # during Python shutdown when the Pool is destroyed. def __del__(self, _warn=warnings.warn, RUN=RUN): if self._state == RUN: _warn(f"unclosed running multiprocessing pool {self!r}", ResourceWarning, source=self) if getattr(self, '_change_notifier', None) is not None: self._change_notifier.put(None) def __repr__(self): cls = self.__class__ return (f'<{cls.__module__}.{cls.__qualname__} ' f'state={self._state} ' f'pool_size={len(self._pool)}>') def _get_sentinels(self): task_queue_sentinels = [self._outqueue._reader] self_notifier_sentinels = [self._change_notifier._reader] return [*task_queue_sentinels, *self_notifier_sentinels] @staticmethod def _get_worker_sentinels(workers): return [worker.sentinel for worker in workers if hasattr(worker, "sentinel")] @staticmethod def _join_exited_workers(pool): """Cleanup after any worker processes which have exited due to reaching their specified lifetime. Returns True if any workers were cleaned up. """ cleaned = False for i in reversed(range(len(pool))): worker = pool[i] if worker.exitcode is not None: # worker exited util.debug('cleaning up worker %d' % i) worker.join() cleaned = True del pool[i] return cleaned def _repopulate_pool(self): return self._repopulate_pool_static(self._ctx, self.Process, self._processes, self._pool, self._inqueue, self._outqueue, self._initializer, self._initargs, self._maxtasksperchild, self._wrap_exception) @staticmethod def _repopulate_pool_static(ctx, Process, processes, pool, inqueue, outqueue, initializer, initargs, maxtasksperchild, wrap_exception): """Bring the number of pool processes up to the specified number, for use after reaping workers which have exited. """ for i in range(processes - len(pool)): w = Process(ctx, target=worker, args=(inqueue, outqueue, initializer, initargs, maxtasksperchild, wrap_exception)) w.name = w.name.replace('Process', 'PoolWorker') w.daemon = True w.start() pool.append(w) util.debug('added worker') @staticmethod def _maintain_pool(ctx, Process, processes, pool, inqueue, outqueue, initializer, initargs, maxtasksperchild, wrap_exception): """Clean up any exited workers and start replacements for them. """ if Pool._join_exited_workers(pool): Pool._repopulate_pool_static(ctx, Process, processes, pool, inqueue, outqueue, initializer, initargs, maxtasksperchild, wrap_exception) def _setup_queues(self): self._inqueue = self._ctx.SimpleQueue() self._outqueue = self._ctx.SimpleQueue() self._quick_put = self._inqueue._writer.send self._quick_get = self._outqueue._reader.recv def _check_running(self): if self._state != RUN: raise ValueError("Pool not running") def apply(self, func, args=(), kwds={}): ''' Equivalent of `func(*args, **kwds)`. Pool must be running. ''' return self.apply_async(func, args, kwds).get() def map(self, func, iterable, chunksize=None): ''' Apply `func` to each element in `iterable`, collecting the results in a list that is returned. ''' return self._map_async(func, iterable, mapstar, chunksize).get() def starmap(self, func, iterable, chunksize=None): ''' Like `map()` method but the elements of the `iterable` are expected to be iterables as well and will be unpacked as arguments. Hence `func` and (a, b) becomes func(a, b). ''' return self._map_async(func, iterable, starmapstar, chunksize).get() def starmap_async(self, func, iterable, chunksize=None, callback=None, error_callback=None): ''' Asynchronous version of `starmap()` method. ''' return self._map_async(func, iterable, starmapstar, chunksize, callback, error_callback) def _guarded_task_generation(self, result_job, func, iterable): '''Provides a generator of tasks for imap and imap_unordered with appropriate handling for iterables which throw exceptions during iteration.''' try: i = -1 for i, x in enumerate(iterable): yield (result_job, i, func, (x,), {}) except Exception as e: yield (result_job, i+1, _helper_reraises_exception, (e,), {}) def imap(self, func, iterable, chunksize=1): ''' Equivalent of `map()` -- can be MUCH slower than `Pool.map()`. ''' self._check_running() if chunksize == 1: result = IMapIterator(self) self._taskqueue.put( ( self._guarded_task_generation(result._job, func, iterable), result._set_length )) return result else: if chunksize < 1: raise ValueError( "Chunksize must be 1+, not {0:n}".format( chunksize)) task_batches = Pool._get_tasks(func, iterable, chunksize) result = IMapIterator(self) self._taskqueue.put( ( self._guarded_task_generation(result._job, mapstar, task_batches), result._set_length )) return (item for chunk in result for item in chunk) def imap_unordered(self, func, iterable, chunksize=1): ''' Like `imap()` method but ordering of results is arbitrary. ''' self._check_running() if chunksize == 1: result = IMapUnorderedIterator(self) self._taskqueue.put( ( self._guarded_task_generation(result._job, func, iterable), result._set_length )) return result else: if chunksize < 1: raise ValueError( "Chunksize must be 1+, not {0!r}".format(chunksize)) task_batches = Pool._get_tasks(func, iterable, chunksize) result = IMapUnorderedIterator(self) self._taskqueue.put( ( self._guarded_task_generation(result._job, mapstar, task_batches), result._set_length )) return (item for chunk in result for item in chunk) def apply_async(self, func, args=(), kwds={}, callback=None, error_callback=None): ''' Asynchronous version of `apply()` method. ''' self._check_running() result = ApplyResult(self, callback, error_callback) self._taskqueue.put(([(result._job, 0, func, args, kwds)], None)) return result def map_async(self, func, iterable, chunksize=None, callback=None, error_callback=None): ''' Asynchronous version of `map()` method. ''' return self._map_async(func, iterable, mapstar, chunksize, callback, error_callback) def _map_async(self, func, iterable, mapper, chunksize=None, callback=None, error_callback=None): ''' Helper function to implement map, starmap and their async counterparts. ''' self._check_running() if not hasattr(iterable, '__len__'): iterable = list(iterable) if chunksize is None: chunksize, extra = divmod(len(iterable), len(self._pool) * 4) if extra: chunksize += 1 if len(iterable) == 0: chunksize = 0 task_batches = Pool._get_tasks(func, iterable, chunksize) result = MapResult(self, chunksize, len(iterable), callback, error_callback=error_callback) self._taskqueue.put( ( self._guarded_task_generation(result._job, mapper, task_batches), None ) ) return result @staticmethod def _wait_for_updates(sentinels, change_notifier, timeout=None): wait(sentinels, timeout=timeout) while not change_notifier.empty(): change_notifier.get() @classmethod def _handle_workers(cls, cache, taskqueue, ctx, Process, processes, pool, inqueue, outqueue, initializer, initargs, maxtasksperchild, wrap_exception, sentinels, change_notifier): thread = threading.current_thread() # Keep maintaining workers until the cache gets drained, unless the pool # is terminated. while thread._state == RUN or (cache and thread._state != TERMINATE): cls._maintain_pool(ctx, Process, processes, pool, inqueue, outqueue, initializer, initargs, maxtasksperchild, wrap_exception) current_sentinels = [*cls._get_worker_sentinels(pool), *sentinels] cls._wait_for_updates(current_sentinels, change_notifier) # send sentinel to stop workers taskqueue.put(None) util.debug('worker handler exiting') @staticmethod def _handle_tasks(taskqueue, put, outqueue, pool, cache): thread = threading.current_thread() for taskseq, set_length in iter(taskqueue.get, None): task = None try: # iterating taskseq cannot fail for task in taskseq: if thread._state != RUN: util.debug('task handler found thread._state != RUN') break try: put(task) except Exception as e: job, idx = task[:2] try: cache[job]._set(idx, (False, e)) except KeyError: pass else: if set_length: util.debug('doing set_length()') idx = task[1] if task else -1 set_length(idx + 1) continue break finally: task = taskseq = job = None else: util.debug('task handler got sentinel') try: # tell result handler to finish when cache is empty util.debug('task handler sending sentinel to result handler') outqueue.put(None) # tell workers there is no more work util.debug('task handler sending sentinel to workers') for p in pool: put(None) except OSError: util.debug('task handler got OSError when sending sentinels') util.debug('task handler exiting') @staticmethod def _handle_results(outqueue, get, cache): thread = threading.current_thread() while 1: try: task = get() except (OSError, EOFError): util.debug('result handler got EOFError/OSError -- exiting') return if thread._state != RUN: assert thread._state == TERMINATE, "Thread not in TERMINATE" util.debug('result handler found thread._state=TERMINATE') break if task is None: util.debug('result handler got sentinel') break job, i, obj = task try: cache[job]._set(i, obj) except KeyError: pass task = job = obj = None while cache and thread._state != TERMINATE: try: task = get() except (OSError, EOFError): util.debug('result handler got EOFError/OSError -- exiting') return if task is None: util.debug('result handler ignoring extra sentinel') continue job, i, obj = task try: cache[job]._set(i, obj) except KeyError: pass task = job = obj = None if hasattr(outqueue, '_reader'): util.debug('ensuring that outqueue is not full') # If we don't make room available in outqueue then # attempts to add the sentinel (None) to outqueue may # block. There is guaranteed to be no more than 2 sentinels. try: for i in range(10): if not outqueue._reader.poll(): break get() except (OSError, EOFError): pass util.debug('result handler exiting: len(cache)=%s, thread._state=%s', len(cache), thread._state) @staticmethod def _get_tasks(func, it, size): it = iter(it) while 1: x = tuple(itertools.islice(it, size)) if not x: return yield (func, x) def __reduce__(self): raise NotImplementedError( 'pool objects cannot be passed between processes or pickled' ) def close(self): util.debug('closing pool') if self._state == RUN: self._state = CLOSE self._worker_handler._state = CLOSE self._change_notifier.put(None) def terminate(self): util.debug('terminating pool') self._state = TERMINATE self._terminate() def join(self): util.debug('joining pool') if self._state == RUN: raise ValueError("Pool is still running") elif self._state not in (CLOSE, TERMINATE): raise ValueError("In unknown state") self._worker_handler.join() self._task_handler.join() self._result_handler.join() for p in self._pool: p.join() @staticmethod def _help_stuff_finish(inqueue, task_handler, size): # task_handler may be blocked trying to put items on inqueue util.debug('removing tasks from inqueue until task handler finished') inqueue._rlock.acquire() while task_handler.is_alive() and inqueue._reader.poll(): inqueue._reader.recv() time.sleep(0) @classmethod def _terminate_pool(cls, taskqueue, inqueue, outqueue, pool, change_notifier, worker_handler, task_handler, result_handler, cache): # this is guaranteed to only be called once util.debug('finalizing pool') # Notify that the worker_handler state has been changed so the # _handle_workers loop can be unblocked (and exited) in order to # send the finalization sentinel all the workers. worker_handler._state = TERMINATE change_notifier.put(None) task_handler._state = TERMINATE util.debug('helping task handler/workers to finish') cls._help_stuff_finish(inqueue, task_handler, len(pool)) if (not result_handler.is_alive()) and (len(cache) != 0): raise AssertionError( "Cannot have cache with result_handler not alive") result_handler._state = TERMINATE change_notifier.put(None) outqueue.put(None) # sentinel # We must wait for the worker handler to exit before terminating # workers because we don't want workers to be restarted behind our back. util.debug('joining worker handler') if threading.current_thread() is not worker_handler: worker_handler.join() # Terminate workers which haven't already finished. if pool and hasattr(pool[0], 'terminate'): util.debug('terminating workers') for p in pool: if p.exitcode is None: p.terminate() util.debug('joining task handler') if threading.current_thread() is not task_handler: task_handler.join() util.debug('joining result handler') if threading.current_thread() is not result_handler: result_handler.join() if pool and hasattr(pool[0], 'terminate'): util.debug('joining pool workers') for p in pool: if p.is_alive(): # worker has not yet exited util.debug('cleaning up worker %d' % p.pid) p.join() def __enter__(self): self._check_running() return self def __exit__(self, exc_type, exc_val, exc_tb): self.terminate() # # Class whose instances are returned by `Pool.apply_async()` # class ApplyResult(object): def __init__(self, pool, callback, error_callback): self._pool = pool self._event = threading.Event() self._job = next(job_counter) self._cache = pool._cache self._callback = callback self._error_callback = error_callback self._cache[self._job] = self def ready(self): return self._event.is_set() def successful(self): if not self.ready(): raise ValueError("{0!r} not ready".format(self)) return self._success def wait(self, timeout=None): self._event.wait(timeout) def get(self, timeout=None): self.wait(timeout) if not self.ready(): raise TimeoutError if self._success: return self._value else: raise self._value def _set(self, i, obj): self._success, self._value = obj if self._callback and self._success: self._callback(self._value) if self._error_callback and not self._success: self._error_callback(self._value) self._event.set() del self._cache[self._job] self._pool = None __class_getitem__ = classmethod(types.GenericAlias) AsyncResult = ApplyResult # create alias -- see #17805 # # Class whose instances are returned by `Pool.map_async()` # class MapResult(ApplyResult): def __init__(self, pool, chunksize, length, callback, error_callback): ApplyResult.__init__(self, pool, callback, error_callback=error_callback) self._success = True self._value = [None] * length self._chunksize = chunksize if chunksize <= 0: self._number_left = 0 self._event.set() del self._cache[self._job] else: self._number_left = length//chunksize + bool(length % chunksize) def _set(self, i, success_result): self._number_left -= 1 success, result = success_result if success and self._success: self._value[i*self._chunksize:(i+1)*self._chunksize] = result if self._number_left == 0: if self._callback: self._callback(self._value) del self._cache[self._job] self._event.set() self._pool = None else: if not success and self._success: # only store first exception self._success = False self._value = result if self._number_left == 0: # only consider the result ready once all jobs are done if self._error_callback: self._error_callback(self._value) del self._cache[self._job] self._event.set() self._pool = None # # Class whose instances are returned by `Pool.imap()` # class IMapIterator(object): def __init__(self, pool): self._pool = pool self._cond = threading.Condition(threading.Lock()) self._job = next(job_counter) self._cache = pool._cache self._items = collections.deque() self._index = 0 self._length = None self._unsorted = {} self._cache[self._job] = self def __iter__(self): return self def next(self, timeout=None): with self._cond: try: item = self._items.popleft() except IndexError: if self._index == self._length: self._pool = None raise StopIteration from None self._cond.wait(timeout) try: item = self._items.popleft() except IndexError: if self._index == self._length: self._pool = None raise StopIteration from None raise TimeoutError from None success, value = item if success: return value raise value __next__ = next # XXX def _set(self, i, obj): with self._cond: if self._index == i: self._items.append(obj) self._index += 1 while self._index in self._unsorted: obj = self._unsorted.pop(self._index) self._items.append(obj) self._index += 1 self._cond.notify() else: self._unsorted[i] = obj if self._index == self._length: del self._cache[self._job] self._pool = None def _set_length(self, length): with self._cond: self._length = length if self._index == self._length: self._cond.notify() del self._cache[self._job] self._pool = None # # Class whose instances are returned by `Pool.imap_unordered()` # class IMapUnorderedIterator(IMapIterator): def _set(self, i, obj): with self._cond: self._items.append(obj) self._index += 1 self._cond.notify() if self._index == self._length: del self._cache[self._job] self._pool = None # # # class ThreadPool(Pool): _wrap_exception = False @staticmethod def Process(ctx, *args, **kwds): from .dummy import Process return Process(*args, **kwds) def __init__(self, processes=None, initializer=None, initargs=()): Pool.__init__(self, processes, initializer, initargs) def _setup_queues(self): self._inqueue = queue.SimpleQueue() self._outqueue = queue.SimpleQueue() self._quick_put = self._inqueue.put self._quick_get = self._outqueue.get def _get_sentinels(self): return [self._change_notifier._reader] @staticmethod def _get_worker_sentinels(workers): return [] @staticmethod def _help_stuff_finish(inqueue, task_handler, size): # drain inqueue, and put sentinels at its head to make workers finish try: while True: inqueue.get(block=False) except queue.Empty: pass for i in range(size): inqueue.put(None) def _wait_for_updates(self, sentinels, change_notifier, timeout): time.sleep(timeout) PK:W�\N��I I popen_fork.pynu�[���import os import signal from . import util __all__ = ['Popen'] # # Start child process using fork # class Popen(object): method = 'fork' def __init__(self, process_obj): util._flush_std_streams() self.returncode = None self.finalizer = None self._launch(process_obj) def duplicate_for_child(self, fd): return fd def poll(self, flag=os.WNOHANG): if self.returncode is None: try: pid, sts = os.waitpid(self.pid, flag) except OSError: # Child process not yet created. See #1731717 # e.errno == errno.ECHILD == 10 return None if pid == self.pid: self.returncode = os.waitstatus_to_exitcode(sts) return self.returncode def wait(self, timeout=None): if self.returncode is None: if timeout is not None: from multiprocessing.connection import wait if not wait([self.sentinel], timeout): return None # This shouldn't block if wait() returned successfully. return self.poll(os.WNOHANG if timeout == 0.0 else 0) return self.returncode def _send_signal(self, sig): if self.returncode is None: try: os.kill(self.pid, sig) except ProcessLookupError: pass except OSError: if self.wait(timeout=0.1) is None: raise def terminate(self): self._send_signal(signal.SIGTERM) def kill(self): self._send_signal(signal.SIGKILL) def _launch(self, process_obj): code = 1 parent_r, child_w = os.pipe() child_r, parent_w = os.pipe() self.pid = os.fork() if self.pid == 0: try: os.close(parent_r) os.close(parent_w) code = process_obj._bootstrap(parent_sentinel=child_r) finally: os._exit(code) else: os.close(child_w) os.close(child_r) self.finalizer = util.Finalize(self, util.close_fds, (parent_r, parent_w,)) self.sentinel = parent_r def close(self): if self.finalizer is not None: self.finalizer() PK:W�\/TJ��popen_forkserver.pynu�[���import io import os from .context import reduction, set_spawning_popen if not reduction.HAVE_SEND_HANDLE: raise ImportError('No support for sending fds between processes') from . import forkserver from . import popen_fork from . import spawn from . import util __all__ = ['Popen'] # # Wrapper for an fd used while launching a process # class _DupFd(object): def __init__(self, ind): self.ind = ind def detach(self): return forkserver.get_inherited_fds()[self.ind] # # Start child process using a server process # class Popen(popen_fork.Popen): method = 'forkserver' DupFd = _DupFd def __init__(self, process_obj): self._fds = [] super().__init__(process_obj) def duplicate_for_child(self, fd): self._fds.append(fd) return len(self._fds) - 1 def _launch(self, process_obj): prep_data = spawn.get_preparation_data(process_obj._name) buf = io.BytesIO() set_spawning_popen(self) try: reduction.dump(prep_data, buf) reduction.dump(process_obj, buf) finally: set_spawning_popen(None) self.sentinel, w = forkserver.connect_to_new_process(self._fds) # Keep a duplicate of the data pipe's write end as a sentinel of the # parent process used by the child process. _parent_w = os.dup(w) self.finalizer = util.Finalize(self, util.close_fds, (_parent_w, self.sentinel)) with open(w, 'wb', closefd=True) as f: f.write(buf.getbuffer()) self.pid = forkserver.read_signed(self.sentinel) def poll(self, flag=os.WNOHANG): if self.returncode is None: from multiprocessing.connection import wait timeout = 0 if flag == os.WNOHANG else None if not wait([self.sentinel], timeout): return None try: self.returncode = forkserver.read_signed(self.sentinel) except (OSError, EOFError): # This should not happen usually, but perhaps the forkserver # process itself got killed self.returncode = 255 return self.returncode PK:W�\ ����popen_spawn_posix.pynu�[���import io import os from .context import reduction, set_spawning_popen from . import popen_fork from . import spawn from . import util __all__ = ['Popen'] # # Wrapper for an fd used while launching a process # class _DupFd(object): def __init__(self, fd): self.fd = fd def detach(self): return self.fd # # Start child process using a fresh interpreter # class Popen(popen_fork.Popen): method = 'spawn' DupFd = _DupFd def __init__(self, process_obj): self._fds = [] super().__init__(process_obj) def duplicate_for_child(self, fd): self._fds.append(fd) return fd def _launch(self, process_obj): from . import resource_tracker tracker_fd = resource_tracker.getfd() self._fds.append(tracker_fd) prep_data = spawn.get_preparation_data(process_obj._name) fp = io.BytesIO() set_spawning_popen(self) try: reduction.dump(prep_data, fp) reduction.dump(process_obj, fp) finally: set_spawning_popen(None) parent_r = child_w = child_r = parent_w = None try: parent_r, child_w = os.pipe() child_r, parent_w = os.pipe() cmd = spawn.get_command_line(tracker_fd=tracker_fd, pipe_handle=child_r) self._fds.extend([child_r, child_w]) self.pid = util.spawnv_passfds(spawn.get_executable(), cmd, self._fds) self.sentinel = parent_r with open(parent_w, 'wb', closefd=False) as f: f.write(fp.getbuffer()) finally: fds_to_close = [] for fd in (parent_r, parent_w): if fd is not None: fds_to_close.append(fd) self.finalizer = util.Finalize(self, util.close_fds, fds_to_close) for fd in (child_r, child_w): if fd is not None: os.close(fd) PK:W�\��[��popen_spawn_win32.pynu�[���import os import msvcrt import signal import sys import _winapi from .context import reduction, get_spawning_popen, set_spawning_popen from . import spawn from . import util __all__ = ['Popen'] # # # # Exit code used by Popen.terminate() TERMINATE = 0x10000 WINEXE = (sys.platform == 'win32' and getattr(sys, 'frozen', False)) WINSERVICE = sys.executable.lower().endswith("pythonservice.exe") def _path_eq(p1, p2): return p1 == p2 or os.path.normcase(p1) == os.path.normcase(p2) WINENV = not _path_eq(sys.executable, sys._base_executable) def _close_handles(*handles): for handle in handles: _winapi.CloseHandle(handle) # # We define a Popen class similar to the one from subprocess, but # whose constructor takes a process object as its argument. # class Popen(object): ''' Start a subprocess to run the code of a process object ''' method = 'spawn' def __init__(self, process_obj): prep_data = spawn.get_preparation_data(process_obj._name) # read end of pipe will be duplicated by the child process # -- see spawn_main() in spawn.py. # # bpo-33929: Previously, the read end of pipe was "stolen" by the child # process, but it leaked a handle if the child process had been # terminated before it could steal the handle from the parent process. rhandle, whandle = _winapi.CreatePipe(None, 0) wfd = msvcrt.open_osfhandle(whandle, 0) cmd = spawn.get_command_line(parent_pid=os.getpid(), pipe_handle=rhandle) python_exe = spawn.get_executable() # bpo-35797: When running in a venv, we bypass the redirect # executor and launch our base Python. if WINENV and _path_eq(python_exe, sys.executable): cmd[0] = python_exe = sys._base_executable env = os.environ.copy() env["__PYVENV_LAUNCHER__"] = sys.executable else: env = None cmd = ' '.join('"%s"' % x for x in cmd) with open(wfd, 'wb', closefd=True) as to_child: # start process try: hp, ht, pid, tid = _winapi.CreateProcess( python_exe, cmd, None, None, False, 0, env, None, None) _winapi.CloseHandle(ht) except: _winapi.CloseHandle(rhandle) raise # set attributes of self self.pid = pid self.returncode = None self._handle = hp self.sentinel = int(hp) self.finalizer = util.Finalize(self, _close_handles, (self.sentinel, int(rhandle))) # send information to child set_spawning_popen(self) try: reduction.dump(prep_data, to_child) reduction.dump(process_obj, to_child) finally: set_spawning_popen(None) def duplicate_for_child(self, handle): assert self is get_spawning_popen() return reduction.duplicate(handle, self.sentinel) def wait(self, timeout=None): if self.returncode is not None: return self.returncode if timeout is None: msecs = _winapi.INFINITE else: msecs = max(0, int(timeout * 1000 + 0.5)) res = _winapi.WaitForSingleObject(int(self._handle), msecs) if res == _winapi.WAIT_OBJECT_0: code = _winapi.GetExitCodeProcess(self._handle) if code == TERMINATE: code = -signal.SIGTERM self.returncode = code return self.returncode def poll(self): return self.wait(timeout=0) def terminate(self): if self.returncode is not None: return try: _winapi.TerminateProcess(int(self._handle), TERMINATE) except PermissionError: # ERROR_ACCESS_DENIED (winerror 5) is received when the # process already died. code = _winapi.GetExitCodeProcess(int(self._handle)) if code == _winapi.STILL_ACTIVE: raise # gh-113009: Don't set self.returncode. Even if GetExitCodeProcess() # returns an exit code different than STILL_ACTIVE, the process can # still be running. Only set self.returncode once WaitForSingleObject() # returns WAIT_OBJECT_0 in wait(). kill = terminate def close(self): self.finalizer() PK:W�\o�d�k/k/ process.pynu�[���# # Module providing the `Process` class which emulates `threading.Thread` # # multiprocessing/process.py # # Copyright (c) 2006-2008, R Oudkerk # Licensed to PSF under a Contributor Agreement. # __all__ = ['BaseProcess', 'current_process', 'active_children', 'parent_process'] # # Imports # import os import sys import signal import itertools import threading from _weakrefset import WeakSet # # # try: ORIGINAL_DIR = os.path.abspath(os.getcwd()) except OSError: ORIGINAL_DIR = None # # Public functions # def current_process(): ''' Return process object representing the current process ''' return _current_process def active_children(): ''' Return list of process objects corresponding to live child processes ''' _cleanup() return list(_children) def parent_process(): ''' Return process object representing the parent process ''' return _parent_process # # # def _cleanup(): # check for processes which have finished for p in list(_children): if (child_popen := p._popen) and child_popen.poll() is not None: _children.discard(p) # # The `Process` class # class BaseProcess(object): ''' Process objects represent activity that is run in a separate process The class is analogous to `threading.Thread` ''' def _Popen(self): raise NotImplementedError def __init__(self, group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None): assert group is None, 'group argument must be None for now' count = next(_process_counter) self._identity = _current_process._identity + (count,) self._config = _current_process._config.copy() self._parent_pid = os.getpid() self._parent_name = _current_process.name self._popen = None self._closed = False self._target = target self._args = tuple(args) self._kwargs = dict(kwargs) self._name = name or type(self).__name__ + '-' + \ ':'.join(str(i) for i in self._identity) if daemon is not None: self.daemon = daemon _dangling.add(self) def _check_closed(self): if self._closed: raise ValueError("process object is closed") def run(self): ''' Method to be run in sub-process; can be overridden in sub-class ''' if self._target: self._target(*self._args, **self._kwargs) def start(self): ''' Start child process ''' self._check_closed() assert self._popen is None, 'cannot start a process twice' assert self._parent_pid == os.getpid(), \ 'can only start a process object created by current process' assert not _current_process._config.get('daemon'), \ 'daemonic processes are not allowed to have children' _cleanup() self._popen = self._Popen(self) self._sentinel = self._popen.sentinel # Avoid a refcycle if the target function holds an indirect # reference to the process object (see bpo-30775) del self._target, self._args, self._kwargs _children.add(self) def terminate(self): ''' Terminate process; sends SIGTERM signal or uses TerminateProcess() ''' self._check_closed() self._popen.terminate() def kill(self): ''' Terminate process; sends SIGKILL signal or uses TerminateProcess() ''' self._check_closed() self._popen.kill() def join(self, timeout=None): ''' Wait until child process terminates ''' self._check_closed() assert self._parent_pid == os.getpid(), 'can only join a child process' assert self._popen is not None, 'can only join a started process' res = self._popen.wait(timeout) if res is not None: _children.discard(self) def is_alive(self): ''' Return whether process is alive ''' self._check_closed() if self is _current_process: return True assert self._parent_pid == os.getpid(), 'can only test a child process' if self._popen is None: return False returncode = self._popen.poll() if returncode is None: return True else: _children.discard(self) return False def close(self): ''' Close the Process object. This method releases resources held by the Process object. It is an error to call this method if the child process is still running. ''' if self._popen is not None: if self._popen.poll() is None: raise ValueError("Cannot close a process while it is still running. " "You should first call join() or terminate().") self._popen.close() self._popen = None del self._sentinel _children.discard(self) self._closed = True @property def name(self): return self._name @name.setter def name(self, name): assert isinstance(name, str), 'name must be a string' self._name = name @property def daemon(self): ''' Return whether process is a daemon ''' return self._config.get('daemon', False) @daemon.setter def daemon(self, daemonic): ''' Set whether process is a daemon ''' assert self._popen is None, 'process has already started' self._config['daemon'] = daemonic @property def authkey(self): return self._config['authkey'] @authkey.setter def authkey(self, authkey): ''' Set authorization key of process ''' self._config['authkey'] = AuthenticationString(authkey) @property def exitcode(self): ''' Return exit code of process or `None` if it has yet to stop ''' self._check_closed() if self._popen is None: return self._popen return self._popen.poll() @property def ident(self): ''' Return identifier (PID) of process or `None` if it has yet to start ''' self._check_closed() if self is _current_process: return os.getpid() else: return self._popen and self._popen.pid pid = ident @property def sentinel(self): ''' Return a file descriptor (Unix) or handle (Windows) suitable for waiting for process termination. ''' self._check_closed() try: return self._sentinel except AttributeError: raise ValueError("process not started") from None def __repr__(self): exitcode = None if self is _current_process: status = 'started' elif self._closed: status = 'closed' elif self._parent_pid != os.getpid(): status = 'unknown' elif self._popen is None: status = 'initial' else: exitcode = self._popen.poll() if exitcode is not None: status = 'stopped' else: status = 'started' info = [type(self).__name__, 'name=%r' % self._name] if self._popen is not None: info.append('pid=%s' % self._popen.pid) info.append('parent=%s' % self._parent_pid) info.append(status) if exitcode is not None: exitcode = _exitcode_to_name.get(exitcode, exitcode) info.append('exitcode=%s' % exitcode) if self.daemon: info.append('daemon') return '<%s>' % ' '.join(info) ## def _bootstrap(self, parent_sentinel=None): from . import util, context global _current_process, _parent_process, _process_counter, _children try: if self._start_method is not None: context._force_start_method(self._start_method) _process_counter = itertools.count(1) _children = set() util._close_stdin() old_process = _current_process _current_process = self _parent_process = _ParentProcess( self._parent_name, self._parent_pid, parent_sentinel) if threading._HAVE_THREAD_NATIVE_ID: threading.main_thread()._set_native_id() try: self._after_fork() finally: # delay finalization of the old process object until after # _run_after_forkers() is executed del old_process util.info('child process calling self.run()') try: self.run() exitcode = 0 finally: util._exit_function() except SystemExit as e: if e.code is None: exitcode = 0 elif isinstance(e.code, int): exitcode = e.code else: sys.stderr.write(str(e.code) + '\n') exitcode = 1 except: exitcode = 1 import traceback sys.stderr.write('Process %s:\n' % self.name) traceback.print_exc() finally: threading._shutdown() util.info('process exiting with exitcode %d' % exitcode) util._flush_std_streams() return exitcode @staticmethod def _after_fork(): from . import util util._finalizer_registry.clear() util._run_after_forkers() # # We subclass bytes to avoid accidental transmission of auth keys over network # class AuthenticationString(bytes): def __reduce__(self): from .context import get_spawning_popen if get_spawning_popen() is None: raise TypeError( 'Pickling an AuthenticationString object is ' 'disallowed for security reasons' ) return AuthenticationString, (bytes(self),) # # Create object representing the parent process # class _ParentProcess(BaseProcess): def __init__(self, name, pid, sentinel): self._identity = () self._name = name self._pid = pid self._parent_pid = None self._popen = None self._closed = False self._sentinel = sentinel self._config = {} def is_alive(self): from multiprocessing.connection import wait return not wait([self._sentinel], timeout=0) @property def ident(self): return self._pid def join(self, timeout=None): ''' Wait until parent process terminates ''' from multiprocessing.connection import wait wait([self._sentinel], timeout=timeout) pid = ident # # Create object representing the main process # class _MainProcess(BaseProcess): def __init__(self): self._identity = () self._name = 'MainProcess' self._parent_pid = None self._popen = None self._closed = False self._config = {'authkey': AuthenticationString(os.urandom(32)), 'semprefix': '/mp'} # Note that some versions of FreeBSD only allow named # semaphores to have names of up to 14 characters. Therefore # we choose a short prefix. # # On MacOSX in a sandbox it may be necessary to use a # different prefix -- see #19478. # # Everything in self._config will be inherited by descendant # processes. def close(self): pass _parent_process = None _current_process = _MainProcess() _process_counter = itertools.count(1) _children = set() del _MainProcess # # Give names to some return codes # _exitcode_to_name = {} for name, signum in list(signal.__dict__.items()): if name[:3]=='SIG' and '_' not in name: _exitcode_to_name[-signum] = f'-{name}' del name, signum # For debug and leak testing _dangling = WeakSet() PK:W�\���.�1�1 queues.pynu�[���# # Module implementing queues # # multiprocessing/queues.py # # Copyright (c) 2006-2008, R Oudkerk # Licensed to PSF under a Contributor Agreement. # __all__ = ['Queue', 'SimpleQueue', 'JoinableQueue'] import sys import os import threading import collections import time import types import weakref import errno from queue import Empty, Full import _multiprocessing from . import connection from . import context _ForkingPickler = context.reduction.ForkingPickler from .util import debug, info, Finalize, register_after_fork, is_exiting # # Queue type using a pipe, buffer and thread # class Queue(object): def __init__(self, maxsize=0, *, ctx): if maxsize <= 0: # Can raise ImportError (see issues #3770 and #23400) from .synchronize import SEM_VALUE_MAX as maxsize self._maxsize = maxsize self._reader, self._writer = connection.Pipe(duplex=False) self._rlock = ctx.Lock() self._opid = os.getpid() if sys.platform == 'win32': self._wlock = None else: self._wlock = ctx.Lock() self._sem = ctx.BoundedSemaphore(maxsize) # For use by concurrent.futures self._ignore_epipe = False self._reset() if sys.platform != 'win32': register_after_fork(self, Queue._after_fork) def __getstate__(self): context.assert_spawning(self) return (self._ignore_epipe, self._maxsize, self._reader, self._writer, self._rlock, self._wlock, self._sem, self._opid) def __setstate__(self, state): (self._ignore_epipe, self._maxsize, self._reader, self._writer, self._rlock, self._wlock, self._sem, self._opid) = state self._reset() def _after_fork(self): debug('Queue._after_fork()') self._reset(after_fork=True) def _reset(self, after_fork=False): if after_fork: self._notempty._at_fork_reinit() else: self._notempty = threading.Condition(threading.Lock()) self._buffer = collections.deque() self._thread = None self._jointhread = None self._joincancelled = False self._closed = False self._close = None self._send_bytes = self._writer.send_bytes self._recv_bytes = self._reader.recv_bytes self._poll = self._reader.poll def put(self, obj, block=True, timeout=None): if self._closed: raise ValueError(f"Queue {self!r} is closed") if not self._sem.acquire(block, timeout): raise Full with self._notempty: if self._thread is None: self._start_thread() self._buffer.append(obj) self._notempty.notify() def get(self, block=True, timeout=None): if self._closed: raise ValueError(f"Queue {self!r} is closed") if block and timeout is None: with self._rlock: res = self._recv_bytes() self._sem.release() else: if block: deadline = time.monotonic() + timeout if not self._rlock.acquire(block, timeout): raise Empty try: if block: timeout = deadline - time.monotonic() if not self._poll(timeout): raise Empty elif not self._poll(): raise Empty res = self._recv_bytes() self._sem.release() finally: self._rlock.release() # unserialize the data after having released the lock return _ForkingPickler.loads(res) def qsize(self): # Raises NotImplementedError on Mac OSX because of broken sem_getvalue() return self._maxsize - self._sem._semlock._get_value() def empty(self): return not self._poll() def full(self): return self._sem._semlock._is_zero() def get_nowait(self): return self.get(False) def put_nowait(self, obj): return self.put(obj, False) def close(self): self._closed = True close = self._close if close: self._close = None close() def join_thread(self): debug('Queue.join_thread()') assert self._closed, "Queue {0!r} not closed".format(self) if self._jointhread: self._jointhread() def cancel_join_thread(self): debug('Queue.cancel_join_thread()') self._joincancelled = True try: self._jointhread.cancel() except AttributeError: pass def _terminate_broken(self): # Close a Queue on error. # gh-94777: Prevent queue writing to a pipe which is no longer read. self._reader.close() # gh-107219: Close the connection writer which can unblock # Queue._feed() if it was stuck in send_bytes(). if sys.platform == 'win32': self._writer.close() self.close() self.join_thread() def _start_thread(self): debug('Queue._start_thread()') # Start thread which transfers data from buffer to pipe self._buffer.clear() self._thread = threading.Thread( target=Queue._feed, args=(self._buffer, self._notempty, self._send_bytes, self._wlock, self._reader.close, self._writer.close, self._ignore_epipe, self._on_queue_feeder_error, self._sem), name='QueueFeederThread', daemon=True, ) try: debug('doing self._thread.start()') self._thread.start() debug('... done self._thread.start()') except: # gh-109047: During Python finalization, creating a thread # can fail with RuntimeError. self._thread = None raise if not self._joincancelled: self._jointhread = Finalize( self._thread, Queue._finalize_join, [weakref.ref(self._thread)], exitpriority=-5 ) # Send sentinel to the thread queue object when garbage collected self._close = Finalize( self, Queue._finalize_close, [self._buffer, self._notempty], exitpriority=10 ) @staticmethod def _finalize_join(twr): debug('joining queue thread') thread = twr() if thread is not None: thread.join() debug('... queue thread joined') else: debug('... queue thread already dead') @staticmethod def _finalize_close(buffer, notempty): debug('telling queue thread to quit') with notempty: buffer.append(_sentinel) notempty.notify() @staticmethod def _feed(buffer, notempty, send_bytes, writelock, reader_close, writer_close, ignore_epipe, onerror, queue_sem): debug('starting thread to feed data to pipe') nacquire = notempty.acquire nrelease = notempty.release nwait = notempty.wait bpopleft = buffer.popleft sentinel = _sentinel if sys.platform != 'win32': wacquire = writelock.acquire wrelease = writelock.release else: wacquire = None while 1: try: nacquire() try: if not buffer: nwait() finally: nrelease() try: while 1: obj = bpopleft() if obj is sentinel: debug('feeder thread got sentinel -- exiting') reader_close() writer_close() return # serialize the data before acquiring the lock obj = _ForkingPickler.dumps(obj) if wacquire is None: send_bytes(obj) else: wacquire() try: send_bytes(obj) finally: wrelease() except IndexError: pass except Exception as e: if ignore_epipe and getattr(e, 'errno', 0) == errno.EPIPE: return # Since this runs in a daemon thread the resources it uses # may be become unusable while the process is cleaning up. # We ignore errors which happen after the process has # started to cleanup. if is_exiting(): info('error in queue thread: %s', e) return else: # Since the object has not been sent in the queue, we need # to decrease the size of the queue. The error acts as # if the object had been silently removed from the queue # and this step is necessary to have a properly working # queue. queue_sem.release() onerror(e, obj) @staticmethod def _on_queue_feeder_error(e, obj): """ Private API hook called when feeding data in the background thread raises an exception. For overriding by concurrent.futures. """ import traceback traceback.print_exc() __class_getitem__ = classmethod(types.GenericAlias) _sentinel = object() # # A queue type which also supports join() and task_done() methods # # Note that if you do not call task_done() for each finished task then # eventually the counter's semaphore may overflow causing Bad Things # to happen. # class JoinableQueue(Queue): def __init__(self, maxsize=0, *, ctx): Queue.__init__(self, maxsize, ctx=ctx) self._unfinished_tasks = ctx.Semaphore(0) self._cond = ctx.Condition() def __getstate__(self): return Queue.__getstate__(self) + (self._cond, self._unfinished_tasks) def __setstate__(self, state): Queue.__setstate__(self, state[:-2]) self._cond, self._unfinished_tasks = state[-2:] def put(self, obj, block=True, timeout=None): if self._closed: raise ValueError(f"Queue {self!r} is closed") if not self._sem.acquire(block, timeout): raise Full with self._notempty, self._cond: if self._thread is None: self._start_thread() self._buffer.append(obj) self._unfinished_tasks.release() self._notempty.notify() def task_done(self): with self._cond: if not self._unfinished_tasks.acquire(False): raise ValueError('task_done() called too many times') if self._unfinished_tasks._semlock._is_zero(): self._cond.notify_all() def join(self): with self._cond: if not self._unfinished_tasks._semlock._is_zero(): self._cond.wait() # # Simplified Queue type -- really just a locked pipe # class SimpleQueue(object): def __init__(self, *, ctx): self._reader, self._writer = connection.Pipe(duplex=False) self._rlock = ctx.Lock() self._poll = self._reader.poll if sys.platform == 'win32': self._wlock = None else: self._wlock = ctx.Lock() def close(self): self._reader.close() self._writer.close() def empty(self): return not self._poll() def __getstate__(self): context.assert_spawning(self) return (self._reader, self._writer, self._rlock, self._wlock) def __setstate__(self, state): (self._reader, self._writer, self._rlock, self._wlock) = state self._poll = self._reader.poll def get(self): with self._rlock: res = self._reader.recv_bytes() # unserialize the data after having released the lock return _ForkingPickler.loads(res) def put(self, obj): # serialize the data before acquiring the lock obj = _ForkingPickler.dumps(obj) if self._wlock is None: # writes to a message oriented win32 pipe are atomic self._writer.send_bytes(obj) else: with self._wlock: self._writer.send_bytes(obj) __class_getitem__ = classmethod(types.GenericAlias) PK:W�\�!ĭ(%(%reduction.pynu�[���# # Module which deals with pickling of objects. # # multiprocessing/reduction.py # # Copyright (c) 2006-2008, R Oudkerk # Licensed to PSF under a Contributor Agreement. # from abc import ABCMeta import copyreg import functools import io import os import pickle import socket import sys from . import context __all__ = ['send_handle', 'recv_handle', 'ForkingPickler', 'register', 'dump'] HAVE_SEND_HANDLE = (sys.platform == 'win32' or (hasattr(socket, 'CMSG_LEN') and hasattr(socket, 'SCM_RIGHTS') and hasattr(socket.socket, 'sendmsg'))) # # Pickler subclass # class ForkingPickler(pickle.Pickler): '''Pickler subclass used by multiprocessing.''' _extra_reducers = {} _copyreg_dispatch_table = copyreg.dispatch_table def __init__(self, *args): super().__init__(*args) self.dispatch_table = self._copyreg_dispatch_table.copy() self.dispatch_table.update(self._extra_reducers) @classmethod def register(cls, type, reduce): '''Register a reduce function for a type.''' cls._extra_reducers[type] = reduce @classmethod def dumps(cls, obj, protocol=None): buf = io.BytesIO() cls(buf, protocol).dump(obj) return buf.getbuffer() loads = pickle.loads register = ForkingPickler.register def dump(obj, file, protocol=None): '''Replacement for pickle.dump() using ForkingPickler.''' ForkingPickler(file, protocol).dump(obj) # # Platform specific definitions # if sys.platform == 'win32': # Windows __all__ += ['DupHandle', 'duplicate', 'steal_handle'] import _winapi def duplicate(handle, target_process=None, inheritable=False, *, source_process=None): '''Duplicate a handle. (target_process is a handle not a pid!)''' current_process = _winapi.GetCurrentProcess() if source_process is None: source_process = current_process if target_process is None: target_process = current_process return _winapi.DuplicateHandle( source_process, handle, target_process, 0, inheritable, _winapi.DUPLICATE_SAME_ACCESS) def steal_handle(source_pid, handle): '''Steal a handle from process identified by source_pid.''' source_process_handle = _winapi.OpenProcess( _winapi.PROCESS_DUP_HANDLE, False, source_pid) try: return _winapi.DuplicateHandle( source_process_handle, handle, _winapi.GetCurrentProcess(), 0, False, _winapi.DUPLICATE_SAME_ACCESS | _winapi.DUPLICATE_CLOSE_SOURCE) finally: _winapi.CloseHandle(source_process_handle) def send_handle(conn, handle, destination_pid): '''Send a handle over a local connection.''' dh = DupHandle(handle, _winapi.DUPLICATE_SAME_ACCESS, destination_pid) conn.send(dh) def recv_handle(conn): '''Receive a handle over a local connection.''' return conn.recv().detach() class DupHandle(object): '''Picklable wrapper for a handle.''' def __init__(self, handle, access, pid=None): if pid is None: # We just duplicate the handle in the current process and # let the receiving process steal the handle. pid = os.getpid() proc = _winapi.OpenProcess(_winapi.PROCESS_DUP_HANDLE, False, pid) try: self._handle = _winapi.DuplicateHandle( _winapi.GetCurrentProcess(), handle, proc, access, False, 0) finally: _winapi.CloseHandle(proc) self._access = access self._pid = pid def detach(self): '''Get the handle. This should only be called once.''' # retrieve handle from process which currently owns it if self._pid == os.getpid(): # The handle has already been duplicated for this process. return self._handle # We must steal the handle from the process whose pid is self._pid. proc = _winapi.OpenProcess(_winapi.PROCESS_DUP_HANDLE, False, self._pid) try: return _winapi.DuplicateHandle( proc, self._handle, _winapi.GetCurrentProcess(), self._access, False, _winapi.DUPLICATE_CLOSE_SOURCE) finally: _winapi.CloseHandle(proc) else: # Unix __all__ += ['DupFd', 'sendfds', 'recvfds'] import array # On MacOSX we should acknowledge receipt of fds -- see Issue14669 ACKNOWLEDGE = sys.platform == 'darwin' def sendfds(sock, fds): '''Send an array of fds over an AF_UNIX socket.''' fds = array.array('i', fds) msg = bytes([len(fds) % 256]) sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)]) if ACKNOWLEDGE and sock.recv(1) != b'A': raise RuntimeError('did not receive acknowledgement of fd') def recvfds(sock, size): '''Receive an array of fds over an AF_UNIX socket.''' a = array.array('i') bytes_size = a.itemsize * size msg, ancdata, flags, addr = sock.recvmsg(1, socket.CMSG_SPACE(bytes_size)) if not msg and not ancdata: raise EOFError try: if ACKNOWLEDGE: sock.send(b'A') if len(ancdata) != 1: raise RuntimeError('received %d items of ancdata' % len(ancdata)) cmsg_level, cmsg_type, cmsg_data = ancdata[0] if (cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS): if len(cmsg_data) % a.itemsize != 0: raise ValueError a.frombytes(cmsg_data) if len(a) % 256 != msg[0]: raise AssertionError( "Len is {0:n} but msg[0] is {1!r}".format( len(a), msg[0])) return list(a) except (ValueError, IndexError): pass raise RuntimeError('Invalid data received') def send_handle(conn, handle, destination_pid): '''Send a handle over a local connection.''' with socket.fromfd(conn.fileno(), socket.AF_UNIX, socket.SOCK_STREAM) as s: sendfds(s, [handle]) def recv_handle(conn): '''Receive a handle over a local connection.''' with socket.fromfd(conn.fileno(), socket.AF_UNIX, socket.SOCK_STREAM) as s: return recvfds(s, 1)[0] def DupFd(fd): '''Return a wrapper for an fd.''' popen_obj = context.get_spawning_popen() if popen_obj is not None: return popen_obj.DupFd(popen_obj.duplicate_for_child(fd)) elif HAVE_SEND_HANDLE: from . import resource_sharer return resource_sharer.DupFd(fd) else: raise ValueError('SCM_RIGHTS appears not to be available') # # Try making some callable types picklable # def _reduce_method(m): if m.__self__ is None: return getattr, (m.__class__, m.__func__.__name__) else: return getattr, (m.__self__, m.__func__.__name__) class _C: def f(self): pass register(type(_C().f), _reduce_method) def _reduce_method_descriptor(m): return getattr, (m.__objclass__, m.__name__) register(type(list.append), _reduce_method_descriptor) register(type(int.__add__), _reduce_method_descriptor) def _reduce_partial(p): return _rebuild_partial, (p.func, p.args, p.keywords or {}) def _rebuild_partial(func, args, keywords): return functools.partial(func, *args, **keywords) register(functools.partial, _reduce_partial) # # Make sockets picklable # if sys.platform == 'win32': def _reduce_socket(s): from .resource_sharer import DupSocket return _rebuild_socket, (DupSocket(s),) def _rebuild_socket(ds): return ds.detach() register(socket.socket, _reduce_socket) else: def _reduce_socket(s): df = DupFd(s.fileno()) return _rebuild_socket, (df, s.family, s.type, s.proto) def _rebuild_socket(df, family, type, proto): fd = df.detach() return socket.socket(family, type, proto, fileno=fd) register(socket.socket, _reduce_socket) class AbstractReducer(metaclass=ABCMeta): '''Abstract base class for use in implementing a Reduction class suitable for use in replacing the standard reduction mechanism used in multiprocessing.''' ForkingPickler = ForkingPickler register = register dump = dump send_handle = send_handle recv_handle = recv_handle if sys.platform == 'win32': steal_handle = steal_handle duplicate = duplicate DupHandle = DupHandle else: sendfds = sendfds recvfds = recvfds DupFd = DupFd _reduce_method = _reduce_method _reduce_method_descriptor = _reduce_method_descriptor _rebuild_partial = _rebuild_partial _reduce_socket = _reduce_socket _rebuild_socket = _rebuild_socket def __init__(self, *args): register(type(_C().f), _reduce_method) register(type(list.append), _reduce_method_descriptor) register(type(int.__add__), _reduce_method_descriptor) register(functools.partial, _reduce_partial) register(socket.socket, _reduce_socket) PK:W�\�5IGresource_sharer.pynu�[���# # We use a background thread for sharing fds on Unix, and for sharing sockets on # Windows. # # A client which wants to pickle a resource registers it with the resource # sharer and gets an identifier in return. The unpickling process will connect # to the resource sharer, sends the identifier and its pid, and then receives # the resource. # import os import signal import socket import sys import threading from . import process from .context import reduction from . import util __all__ = ['stop'] if sys.platform == 'win32': __all__ += ['DupSocket'] class DupSocket(object): '''Picklable wrapper for a socket.''' def __init__(self, sock): new_sock = sock.dup() def send(conn, pid): share = new_sock.share(pid) conn.send_bytes(share) self._id = _resource_sharer.register(send, new_sock.close) def detach(self): '''Get the socket. This should only be called once.''' with _resource_sharer.get_connection(self._id) as conn: share = conn.recv_bytes() return socket.fromshare(share) else: __all__ += ['DupFd'] class DupFd(object): '''Wrapper for fd which can be used at any time.''' def __init__(self, fd): new_fd = os.dup(fd) def send(conn, pid): reduction.send_handle(conn, new_fd, pid) def close(): os.close(new_fd) self._id = _resource_sharer.register(send, close) def detach(self): '''Get the fd. This should only be called once.''' with _resource_sharer.get_connection(self._id) as conn: return reduction.recv_handle(conn) class _ResourceSharer(object): '''Manager for resources using background thread.''' def __init__(self): self._key = 0 self._cache = {} self._lock = threading.Lock() self._listener = None self._address = None self._thread = None util.register_after_fork(self, _ResourceSharer._afterfork) def register(self, send, close): '''Register resource, returning an identifier.''' with self._lock: if self._address is None: self._start() self._key += 1 self._cache[self._key] = (send, close) return (self._address, self._key) @staticmethod def get_connection(ident): '''Return connection from which to receive identified resource.''' from .connection import Client address, key = ident c = Client(address, authkey=process.current_process().authkey) c.send((key, os.getpid())) return c def stop(self, timeout=None): '''Stop the background thread and clear registered resources.''' from .connection import Client with self._lock: if self._address is not None: c = Client(self._address, authkey=process.current_process().authkey) c.send(None) c.close() self._thread.join(timeout) if self._thread.is_alive(): util.sub_warning('_ResourceSharer thread did ' 'not stop when asked') self._listener.close() self._thread = None self._address = None self._listener = None for key, (send, close) in self._cache.items(): close() self._cache.clear() def _afterfork(self): for key, (send, close) in self._cache.items(): close() self._cache.clear() self._lock._at_fork_reinit() if self._listener is not None: self._listener.close() self._listener = None self._address = None self._thread = None def _start(self): from .connection import Listener assert self._listener is None, "Already have Listener" util.debug('starting listener and thread for sending handles') self._listener = Listener(authkey=process.current_process().authkey, backlog=128) self._address = self._listener.address t = threading.Thread(target=self._serve) t.daemon = True t.start() self._thread = t def _serve(self): if hasattr(signal, 'pthread_sigmask'): signal.pthread_sigmask(signal.SIG_BLOCK, signal.valid_signals()) while 1: try: with self._listener.accept() as conn: msg = conn.recv() if msg is None: break key, destination_pid = msg send, close = self._cache.pop(key) try: send(conn, destination_pid) finally: close() except: if not util.is_exiting(): sys.excepthook(*sys.exc_info()) _resource_sharer = _ResourceSharer() stop = _resource_sharer.stop PK:W�\[�{E+E+resource_tracker.pynu�[���############################################################################### # Server process to keep track of unlinked resources (like shared memory # segments, semaphores etc.) and clean them. # # On Unix we run a server process which keeps track of unlinked # resources. The server ignores SIGINT and SIGTERM and reads from a # pipe. Every other process of the program has a copy of the writable # end of the pipe, so we get EOF when all other processes have exited. # Then the server process unlinks any remaining resource names. # # This is important because there may be system limits for such resources: for # instance, the system only supports a limited number of named semaphores, and # shared-memory segments live in the RAM. If a python process leaks such a # resource, this resource will not be removed till the next reboot. Without # this resource tracker process, "killall python" would probably leave unlinked # resources. import os import signal import sys import threading import warnings from . import spawn from . import util __all__ = ['ensure_running', 'register', 'unregister'] _HAVE_SIGMASK = hasattr(signal, 'pthread_sigmask') _IGNORED_SIGNALS = (signal.SIGINT, signal.SIGTERM) _CLEANUP_FUNCS = { 'noop': lambda: None, } if os.name == 'posix': import _multiprocessing import _posixshmem # Use sem_unlink() to clean up named semaphores. # # sem_unlink() may be missing if the Python build process detected the # absence of POSIX named semaphores. In that case, no named semaphores were # ever opened, so no cleanup would be necessary. if hasattr(_multiprocessing, 'sem_unlink'): _CLEANUP_FUNCS.update({ 'semaphore': _multiprocessing.sem_unlink, }) _CLEANUP_FUNCS.update({ 'shared_memory': _posixshmem.shm_unlink, }) class ReentrantCallError(RuntimeError): pass class ResourceTracker(object): def __init__(self): self._lock = threading.RLock() self._fd = None self._pid = None def _reentrant_call_error(self): # gh-109629: this happens if an explicit call to the ResourceTracker # gets interrupted by a garbage collection, invoking a finalizer (*) # that itself calls back into ResourceTracker. # (*) for example the SemLock finalizer raise ReentrantCallError( "Reentrant call into the multiprocessing resource tracker") def __del__(self): # making sure child processess are cleaned before ResourceTracker # gets destructed. # see https://github.com/python/cpython/issues/88887 self._stop(use_blocking_lock=False) def _stop(self, use_blocking_lock=True): if use_blocking_lock: with self._lock: self._stop_locked() else: acquired = self._lock.acquire(blocking=False) try: self._stop_locked() finally: if acquired: self._lock.release() def _stop_locked( self, close=os.close, waitpid=os.waitpid, waitstatus_to_exitcode=os.waitstatus_to_exitcode, ): # This shouldn't happen (it might when called by a finalizer) # so we check for it anyway. if self._lock._recursion_count() > 1: return self._reentrant_call_error() if self._fd is None: # not running return if self._pid is None: return # closing the "alive" file descriptor stops main() close(self._fd) self._fd = None waitpid(self._pid, 0) self._pid = None def getfd(self): self.ensure_running() return self._fd def ensure_running(self): '''Make 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.''' with self._lock: if self._lock._recursion_count() > 1: # The code below is certainly not reentrant-safe, so bail out return self._reentrant_call_error() if self._fd is not None: # resource tracker was launched before, is it still running? if self._check_alive(): # => still alive return # => dead, launch it again os.close(self._fd) # Clean-up to avoid dangling processes. try: # _pid can be None if this process is a child from another # python process, which has started the resource_tracker. if self._pid is not None: os.waitpid(self._pid, 0) except ChildProcessError: # The resource_tracker has already been terminated. pass self._fd = None self._pid = None warnings.warn('resource_tracker: process died unexpectedly, ' 'relaunching. Some resources might leak.') fds_to_pass = [] try: fds_to_pass.append(sys.stderr.fileno()) except Exception: pass cmd = 'from multiprocessing.resource_tracker import main;main(%d)' r, w = os.pipe() try: fds_to_pass.append(r) # process will out live us, so no need to wait on pid exe = spawn.get_executable() args = [exe] + util._args_from_interpreter_flags() args += ['-c', cmd % r] # bpo-33613: Register a signal mask that will block the signals. # This signal mask will be inherited by the child that is going # to be spawned and will protect the child from a race condition # that can make the child die before it registers signal handlers # for SIGINT and SIGTERM. The mask is unregistered after spawning # the child. prev_sigmask = None try: if _HAVE_SIGMASK: prev_sigmask = signal.pthread_sigmask(signal.SIG_BLOCK, _IGNORED_SIGNALS) pid = util.spawnv_passfds(exe, args, fds_to_pass) finally: if prev_sigmask is not None: signal.pthread_sigmask(signal.SIG_SETMASK, prev_sigmask) except: os.close(w) raise else: self._fd = w self._pid = pid finally: os.close(r) def _check_alive(self): '''Check that the pipe has not been closed by sending a probe.''' try: # We cannot use send here as it calls ensure_running, creating # a cycle. os.write(self._fd, b'PROBE:0:noop\n') except OSError: return False else: return True def register(self, name, rtype): '''Register name of resource with resource tracker.''' self._send('REGISTER', name, rtype) def unregister(self, name, rtype): '''Unregister name of resource with resource tracker.''' self._send('UNREGISTER', name, rtype) def _send(self, cmd, name, rtype): try: self.ensure_running() except ReentrantCallError: # The code below might or might not work, depending on whether # the resource tracker was already running and still alive. # Better warn the user. # (XXX is warnings.warn itself reentrant-safe? :-) warnings.warn( f"ResourceTracker called reentrantly for resource cleanup, " f"which is unsupported. " f"The {rtype} object {name!r} might leak.") msg = '{0}:{1}:{2}\n'.format(cmd, name, rtype).encode('ascii') if len(msg) > 512: # posix guarantees that writes to a pipe of less than PIPE_BUF # bytes are atomic, and that PIPE_BUF >= 512 raise ValueError('msg too long') nbytes = os.write(self._fd, msg) assert nbytes == len(msg), "nbytes {0:n} but len(msg) {1:n}".format( nbytes, len(msg)) _resource_tracker = ResourceTracker() ensure_running = _resource_tracker.ensure_running register = _resource_tracker.register unregister = _resource_tracker.unregister getfd = _resource_tracker.getfd def main(fd): '''Run resource tracker.''' # protect the process from ^C and "killall python" etc signal.signal(signal.SIGINT, signal.SIG_IGN) signal.signal(signal.SIGTERM, signal.SIG_IGN) if _HAVE_SIGMASK: signal.pthread_sigmask(signal.SIG_UNBLOCK, _IGNORED_SIGNALS) for f in (sys.stdin, sys.stdout): try: f.close() except Exception: pass cache = {rtype: set() for rtype in _CLEANUP_FUNCS.keys()} try: # keep track of registered/unregistered resources with open(fd, 'rb') as f: for line in f: try: cmd, name, rtype = line.strip().decode('ascii').split(':') cleanup_func = _CLEANUP_FUNCS.get(rtype, None) if cleanup_func is None: raise ValueError( f'Cannot register {name} for automatic cleanup: ' f'unknown resource type {rtype}') if cmd == 'REGISTER': cache[rtype].add(name) elif cmd == 'UNREGISTER': cache[rtype].remove(name) elif cmd == 'PROBE': pass else: raise RuntimeError('unrecognized command %r' % cmd) except Exception: try: sys.excepthook(*sys.exc_info()) except: pass finally: # all processes have terminated; cleanup any remaining resources for rtype, rtype_cache in cache.items(): if rtype_cache: try: warnings.warn('resource_tracker: There appear to be %d ' 'leaked %s objects to clean up at shutdown' % (len(rtype_cache), rtype)) except Exception: pass for name in rtype_cache: # For some reason the process which created and registered this # resource has failed to unregister it. Presumably it has # died. We therefore unlink it. try: try: _CLEANUP_FUNCS[rtype](name) except Exception as e: warnings.warn('resource_tracker: %r: %s' % (name, e)) finally: pass PK:W�\�U��HHshared_memory.pynu�[���"""Provides shared memory for direct access across processes. The API of this package is currently provisional. Refer to the documentation for details. """ __all__ = [ 'SharedMemory', 'ShareableList' ] from functools import partial import mmap import os import errno import struct import secrets import types if os.name == "nt": import _winapi _USE_POSIX = False else: import _posixshmem _USE_POSIX = True from . import resource_tracker _O_CREX = os.O_CREAT | os.O_EXCL # FreeBSD (and perhaps other BSDs) limit names to 14 characters. _SHM_SAFE_NAME_LENGTH = 14 # Shared memory block name prefix if _USE_POSIX: _SHM_NAME_PREFIX = '/psm_' else: _SHM_NAME_PREFIX = 'wnsm_' def _make_filename(): "Create a random filename for the shared memory object." # number of random bytes to use for name nbytes = (_SHM_SAFE_NAME_LENGTH - len(_SHM_NAME_PREFIX)) // 2 assert nbytes >= 2, '_SHM_NAME_PREFIX too long' name = _SHM_NAME_PREFIX + secrets.token_hex(nbytes) assert len(name) <= _SHM_SAFE_NAME_LENGTH return name class SharedMemory: """Creates a new shared memory block or attaches to an existing shared memory block. Every shared memory block is assigned a unique name. This enables one process to create a shared memory block with a particular name so that a different process can attach to that same shared memory block using that same name. As a resource for sharing data across processes, shared memory blocks may outlive the original process that created them. When one process no longer needs access to a shared memory block that might still be needed by other processes, the close() method should be called. When a shared memory block is no longer needed by any process, the unlink() method should be called to ensure proper cleanup.""" # Defaults; enables close() and unlink() to run without errors. _name = None _fd = -1 _mmap = None _buf = None _flags = os.O_RDWR _mode = 0o600 _prepend_leading_slash = True if _USE_POSIX else False def __init__(self, name=None, create=False, size=0): if not size >= 0: raise ValueError("'size' must be a positive integer") if create: self._flags = _O_CREX | os.O_RDWR if size == 0: raise ValueError("'size' must be a positive number different from zero") if name is None and not self._flags & os.O_EXCL: raise ValueError("'name' can only be None if create=True") if _USE_POSIX: # POSIX Shared Memory if name is None: while True: name = _make_filename() try: self._fd = _posixshmem.shm_open( name, self._flags, mode=self._mode ) except FileExistsError: continue self._name = name break else: name = "/" + name if self._prepend_leading_slash else name self._fd = _posixshmem.shm_open( name, self._flags, mode=self._mode ) self._name = name try: if create and size: os.ftruncate(self._fd, size) stats = os.fstat(self._fd) size = stats.st_size self._mmap = mmap.mmap(self._fd, size) except OSError: self.unlink() raise resource_tracker.register(self._name, "shared_memory") else: # Windows Named Shared Memory if create: while True: temp_name = _make_filename() if name is None else name # Create and reserve shared memory block with this name # until it can be attached to by mmap. h_map = _winapi.CreateFileMapping( _winapi.INVALID_HANDLE_VALUE, _winapi.NULL, _winapi.PAGE_READWRITE, (size >> 32) & 0xFFFFFFFF, size & 0xFFFFFFFF, temp_name ) try: last_error_code = _winapi.GetLastError() if last_error_code == _winapi.ERROR_ALREADY_EXISTS: if name is not None: raise FileExistsError( errno.EEXIST, os.strerror(errno.EEXIST), name, _winapi.ERROR_ALREADY_EXISTS ) else: continue self._mmap = mmap.mmap(-1, size, tagname=temp_name) finally: _winapi.CloseHandle(h_map) self._name = temp_name break else: self._name = name # Dynamically determine the existing named shared memory # block's size which is likely a multiple of mmap.PAGESIZE. h_map = _winapi.OpenFileMapping( _winapi.FILE_MAP_READ, False, name ) try: p_buf = _winapi.MapViewOfFile( h_map, _winapi.FILE_MAP_READ, 0, 0, 0 ) finally: _winapi.CloseHandle(h_map) try: size = _winapi.VirtualQuerySize(p_buf) finally: _winapi.UnmapViewOfFile(p_buf) self._mmap = mmap.mmap(-1, size, tagname=name) self._size = size self._buf = memoryview(self._mmap) def __del__(self): try: self.close() except OSError: pass def __reduce__(self): return ( self.__class__, ( self.name, False, self.size, ), ) def __repr__(self): return f'{self.__class__.__name__}({self.name!r}, size={self.size})' @property def buf(self): "A memoryview of contents of the shared memory block." return self._buf @property def name(self): "Unique name that identifies the shared memory block." reported_name = self._name if _USE_POSIX and self._prepend_leading_slash: if self._name.startswith("/"): reported_name = self._name[1:] return reported_name @property def size(self): "Size in bytes." return self._size def close(self): """Closes access to the shared memory from this instance but does not destroy the shared memory block.""" if self._buf is not None: self._buf.release() self._buf = None if self._mmap is not None: self._mmap.close() self._mmap = None if _USE_POSIX and self._fd >= 0: os.close(self._fd) self._fd = -1 def unlink(self): """Requests that the underlying shared memory block be destroyed. In order to ensure proper cleanup of resources, unlink should be called once (and only once) across all processes which have access to the shared memory block.""" if _USE_POSIX and self._name: _posixshmem.shm_unlink(self._name) resource_tracker.unregister(self._name, "shared_memory") _encoding = "utf8" class ShareableList: """Pattern for a mutable list-like object shareable via a shared memory block. It differs from the built-in list type in that these lists can not change their overall length (i.e. no append, insert, etc.) Because values are packed into a memoryview as bytes, the struct packing format for any storable value must require no more than 8 characters to describe its format.""" # The shared memory area is organized as follows: # - 8 bytes: number of items (N) as a 64-bit integer # - (N + 1) * 8 bytes: offsets of each element from the start of the # data area # - K bytes: the data area storing item values (with encoding and size # depending on their respective types) # - N * 8 bytes: `struct` format string for each element # - N bytes: index into _back_transforms_mapping for each element # (for reconstructing the corresponding Python value) _types_mapping = { int: "q", float: "d", bool: "xxxxxxx?", str: "%ds", bytes: "%ds", None.__class__: "xxxxxx?x", } _alignment = 8 _back_transforms_mapping = { 0: lambda value: value, # int, float, bool 1: lambda value: value.rstrip(b'\x00').decode(_encoding), # str 2: lambda value: value.rstrip(b'\x00'), # bytes 3: lambda _value: None, # None } @staticmethod def _extract_recreation_code(value): """Used in concert with _back_transforms_mapping to convert values into the appropriate Python objects when retrieving them from the list as well as when storing them.""" if not isinstance(value, (str, bytes, None.__class__)): return 0 elif isinstance(value, str): return 1 elif isinstance(value, bytes): return 2 else: return 3 # NoneType def __init__(self, sequence=None, *, name=None): if name is None or sequence is not None: sequence = sequence or () _formats = [ self._types_mapping[type(item)] if not isinstance(item, (str, bytes)) else self._types_mapping[type(item)] % ( self._alignment * (len(item) // self._alignment + 1), ) for item in sequence ] self._list_len = len(_formats) assert sum(len(fmt) <= 8 for fmt in _formats) == self._list_len offset = 0 # The offsets of each list element into the shared memory's # data area (0 meaning the start of the data area, not the start # of the shared memory area). self._allocated_offsets = [0] for fmt in _formats: offset += self._alignment if fmt[-1] != "s" else int(fmt[:-1]) self._allocated_offsets.append(offset) _recreation_codes = [ self._extract_recreation_code(item) for item in sequence ] requested_size = struct.calcsize( "q" + self._format_size_metainfo + "".join(_formats) + self._format_packing_metainfo + self._format_back_transform_codes ) self.shm = SharedMemory(name, create=True, size=requested_size) else: self.shm = SharedMemory(name) if sequence is not None: _enc = _encoding struct.pack_into( "q" + self._format_size_metainfo, self.shm.buf, 0, self._list_len, *(self._allocated_offsets) ) struct.pack_into( "".join(_formats), self.shm.buf, self._offset_data_start, *(v.encode(_enc) if isinstance(v, str) else v for v in sequence) ) struct.pack_into( self._format_packing_metainfo, self.shm.buf, self._offset_packing_formats, *(v.encode(_enc) for v in _formats) ) struct.pack_into( self._format_back_transform_codes, self.shm.buf, self._offset_back_transform_codes, *(_recreation_codes) ) else: self._list_len = len(self) # Obtains size from offset 0 in buffer. self._allocated_offsets = list( struct.unpack_from( self._format_size_metainfo, self.shm.buf, 1 * 8 ) ) def _get_packing_format(self, position): "Gets the packing format for a single value stored in the list." position = position if position >= 0 else position + self._list_len if (position >= self._list_len) or (self._list_len < 0): raise IndexError("Requested position out of range.") v = struct.unpack_from( "8s", self.shm.buf, self._offset_packing_formats + position * 8 )[0] fmt = v.rstrip(b'\x00') fmt_as_str = fmt.decode(_encoding) return fmt_as_str def _get_back_transform(self, position): "Gets the back transformation function for a single value." if (position >= self._list_len) or (self._list_len < 0): raise IndexError("Requested position out of range.") transform_code = struct.unpack_from( "b", self.shm.buf, self._offset_back_transform_codes + position )[0] transform_function = self._back_transforms_mapping[transform_code] return transform_function def _set_packing_format_and_transform(self, position, fmt_as_str, value): """Sets the packing format and back transformation code for a single value in the list at the specified position.""" if (position >= self._list_len) or (self._list_len < 0): raise IndexError("Requested position out of range.") struct.pack_into( "8s", self.shm.buf, self._offset_packing_formats + position * 8, fmt_as_str.encode(_encoding) ) transform_code = self._extract_recreation_code(value) struct.pack_into( "b", self.shm.buf, self._offset_back_transform_codes + position, transform_code ) def __getitem__(self, position): position = position if position >= 0 else position + self._list_len try: offset = self._offset_data_start + self._allocated_offsets[position] (v,) = struct.unpack_from( self._get_packing_format(position), self.shm.buf, offset ) except IndexError: raise IndexError("index out of range") back_transform = self._get_back_transform(position) v = back_transform(v) return v def __setitem__(self, position, value): position = position if position >= 0 else position + self._list_len try: item_offset = self._allocated_offsets[position] offset = self._offset_data_start + item_offset current_format = self._get_packing_format(position) except IndexError: raise IndexError("assignment index out of range") if not isinstance(value, (str, bytes)): new_format = self._types_mapping[type(value)] encoded_value = value else: allocated_length = self._allocated_offsets[position + 1] - item_offset encoded_value = (value.encode(_encoding) if isinstance(value, str) else value) if len(encoded_value) > allocated_length: raise ValueError("bytes/str item exceeds available storage") if current_format[-1] == "s": new_format = current_format else: new_format = self._types_mapping[str] % ( allocated_length, ) self._set_packing_format_and_transform( position, new_format, value ) struct.pack_into(new_format, self.shm.buf, offset, encoded_value) def __reduce__(self): return partial(self.__class__, name=self.shm.name), () def __len__(self): return struct.unpack_from("q", self.shm.buf, 0)[0] def __repr__(self): return f'{self.__class__.__name__}({list(self)}, name={self.shm.name!r})' @property def format(self): "The struct packing format used by all currently stored items." return "".join( self._get_packing_format(i) for i in range(self._list_len) ) @property def _format_size_metainfo(self): "The struct packing format used for the items' storage offsets." return "q" * (self._list_len + 1) @property def _format_packing_metainfo(self): "The struct packing format used for the items' packing formats." return "8s" * self._list_len @property def _format_back_transform_codes(self): "The struct packing format used for the items' back transforms." return "b" * self._list_len @property def _offset_data_start(self): # - 8 bytes for the list length # - (N + 1) * 8 bytes for the element offsets return (self._list_len + 2) * 8 @property def _offset_packing_formats(self): return self._offset_data_start + self._allocated_offsets[-1] @property def _offset_back_transform_codes(self): return self._offset_packing_formats + self._list_len * 8 def count(self, value): "L.count(value) -> integer -- return number of occurrences of value." return sum(value == entry for entry in self) def index(self, value): """L.index(value) -> integer -- return first index of value. Raises ValueError if the value is not present.""" for position, entry in enumerate(self): if value == entry: return position else: raise ValueError(f"{value!r} not in this container") __class_getitem__ = classmethod(types.GenericAlias) PK:W�\}����sharedctypes.pynu�[���# # Module which supports allocation of ctypes objects from shared memory # # multiprocessing/sharedctypes.py # # Copyright (c) 2006-2008, R Oudkerk # Licensed to PSF under a Contributor Agreement. # import ctypes import weakref from . import heap from . import get_context from .context import reduction, assert_spawning _ForkingPickler = reduction.ForkingPickler __all__ = ['RawValue', 'RawArray', 'Value', 'Array', 'copy', 'synchronized'] # # # typecode_to_type = { 'c': ctypes.c_char, 'u': ctypes.c_wchar, 'b': ctypes.c_byte, 'B': ctypes.c_ubyte, 'h': ctypes.c_short, 'H': ctypes.c_ushort, 'i': ctypes.c_int, 'I': ctypes.c_uint, 'l': ctypes.c_long, 'L': ctypes.c_ulong, 'q': ctypes.c_longlong, 'Q': ctypes.c_ulonglong, 'f': ctypes.c_float, 'd': ctypes.c_double } # # # def _new_value(type_): size = ctypes.sizeof(type_) wrapper = heap.BufferWrapper(size) return rebuild_ctype(type_, wrapper, None) def RawValue(typecode_or_type, *args): ''' Returns a ctypes object allocated from shared memory ''' type_ = typecode_to_type.get(typecode_or_type, typecode_or_type) obj = _new_value(type_) ctypes.memset(ctypes.addressof(obj), 0, ctypes.sizeof(obj)) obj.__init__(*args) return obj def RawArray(typecode_or_type, size_or_initializer): ''' Returns a ctypes array allocated from shared memory ''' type_ = typecode_to_type.get(typecode_or_type, typecode_or_type) if isinstance(size_or_initializer, int): type_ = type_ * size_or_initializer obj = _new_value(type_) ctypes.memset(ctypes.addressof(obj), 0, ctypes.sizeof(obj)) return obj else: type_ = type_ * len(size_or_initializer) result = _new_value(type_) result.__init__(*size_or_initializer) return result def Value(typecode_or_type, *args, lock=True, ctx=None): ''' Return a synchronization wrapper for a Value ''' obj = RawValue(typecode_or_type, *args) if lock is False: return obj if lock in (True, None): ctx = ctx or get_context() lock = ctx.RLock() if not hasattr(lock, 'acquire'): raise AttributeError("%r has no method 'acquire'" % lock) return synchronized(obj, lock, ctx=ctx) def Array(typecode_or_type, size_or_initializer, *, lock=True, ctx=None): ''' Return a synchronization wrapper for a RawArray ''' obj = RawArray(typecode_or_type, size_or_initializer) if lock is False: return obj if lock in (True, None): ctx = ctx or get_context() lock = ctx.RLock() if not hasattr(lock, 'acquire'): raise AttributeError("%r has no method 'acquire'" % lock) return synchronized(obj, lock, ctx=ctx) def copy(obj): new_obj = _new_value(type(obj)) ctypes.pointer(new_obj)[0] = obj return new_obj def synchronized(obj, lock=None, ctx=None): assert not isinstance(obj, SynchronizedBase), 'object already synchronized' ctx = ctx or get_context() if isinstance(obj, ctypes._SimpleCData): return Synchronized(obj, lock, ctx) elif isinstance(obj, ctypes.Array): if obj._type_ is ctypes.c_char: return SynchronizedString(obj, lock, ctx) return SynchronizedArray(obj, lock, ctx) else: cls = type(obj) try: scls = class_cache[cls] except KeyError: names = [field[0] for field in cls._fields_] d = {name: make_property(name) for name in names} classname = 'Synchronized' + cls.__name__ scls = class_cache[cls] = type(classname, (SynchronizedBase,), d) return scls(obj, lock, ctx) # # Functions for pickling/unpickling # def reduce_ctype(obj): assert_spawning(obj) if isinstance(obj, ctypes.Array): return rebuild_ctype, (obj._type_, obj._wrapper, obj._length_) else: return rebuild_ctype, (type(obj), obj._wrapper, None) def rebuild_ctype(type_, wrapper, length): if length is not None: type_ = type_ * length _ForkingPickler.register(type_, reduce_ctype) buf = wrapper.create_memoryview() obj = type_.from_buffer(buf) obj._wrapper = wrapper return obj # # Function to create properties # def make_property(name): try: return prop_cache[name] except KeyError: d = {} exec(template % ((name,)*7), d) prop_cache[name] = d[name] return d[name] template = ''' def get%s(self): self.acquire() try: return self._obj.%s finally: self.release() def set%s(self, value): self.acquire() try: self._obj.%s = value finally: self.release() %s = property(get%s, set%s) ''' prop_cache = {} class_cache = weakref.WeakKeyDictionary() # # Synchronized wrappers # class SynchronizedBase(object): def __init__(self, obj, lock=None, ctx=None): self._obj = obj if lock: self._lock = lock else: ctx = ctx or get_context(force=True) self._lock = ctx.RLock() self.acquire = self._lock.acquire self.release = self._lock.release def __enter__(self): return self._lock.__enter__() def __exit__(self, *args): return self._lock.__exit__(*args) def __reduce__(self): assert_spawning(self) return synchronized, (self._obj, self._lock) def get_obj(self): return self._obj def get_lock(self): return self._lock def __repr__(self): return '<%s wrapper for %s>' % (type(self).__name__, self._obj) class Synchronized(SynchronizedBase): value = make_property('value') class SynchronizedArray(SynchronizedBase): def __len__(self): return len(self._obj) def __getitem__(self, i): with self: return self._obj[i] def __setitem__(self, i, value): with self: self._obj[i] = value def __getslice__(self, start, stop): with self: return self._obj[start:stop] def __setslice__(self, start, stop, values): with self: self._obj[start:stop] = values class SynchronizedString(SynchronizedArray): value = make_property('value') raw = make_property('raw') PK:W�\P �q�%�%spawn.pynu�[���# # Code used to start processes when using the spawn or forkserver # start methods. # # multiprocessing/spawn.py # # Copyright (c) 2006-2008, R Oudkerk # Licensed to PSF under a Contributor Agreement. # import os import sys import runpy import types from . import get_start_method, set_start_method from . import process from .context import reduction from . import util __all__ = ['_main', 'freeze_support', 'set_executable', 'get_executable', 'get_preparation_data', 'get_command_line', 'import_main_path'] # # _python_exe is the assumed path to the python executable. # People embedding Python want to modify it. # if sys.platform != 'win32': WINEXE = False WINSERVICE = False else: WINEXE = getattr(sys, 'frozen', False) WINSERVICE = sys.executable and sys.executable.lower().endswith("pythonservice.exe") def set_executable(exe): global _python_exe if exe is None: _python_exe = exe elif sys.platform == 'win32': _python_exe = os.fsdecode(exe) else: _python_exe = os.fsencode(exe) def get_executable(): return _python_exe if WINSERVICE: set_executable(os.path.join(sys.exec_prefix, 'python.exe')) else: set_executable(sys.executable) # # # def is_forking(argv): ''' Return whether commandline indicates we are forking ''' if len(argv) >= 2 and argv[1] == '--multiprocessing-fork': return True else: return False def freeze_support(): ''' Run code for process object if this in not the main process ''' if is_forking(sys.argv): kwds = {} for arg in sys.argv[2:]: name, value = arg.split('=') if value == 'None': kwds[name] = None else: kwds[name] = int(value) spawn_main(**kwds) sys.exit() def get_command_line(**kwds): ''' Returns prefix of command line used for spawning a child process ''' if getattr(sys, 'frozen', False): return ([sys.executable, '--multiprocessing-fork'] + ['%s=%r' % item for item in kwds.items()]) else: prog = 'from multiprocessing.spawn import spawn_main; spawn_main(%s)' prog %= ', '.join('%s=%r' % item for item in kwds.items()) opts = util._args_from_interpreter_flags() exe = get_executable() return [exe] + opts + ['-c', prog, '--multiprocessing-fork'] def spawn_main(pipe_handle, parent_pid=None, tracker_fd=None): ''' Run code specified by data received over pipe ''' assert is_forking(sys.argv), "Not forking" if sys.platform == 'win32': import msvcrt import _winapi if parent_pid is not None: source_process = _winapi.OpenProcess( _winapi.SYNCHRONIZE | _winapi.PROCESS_DUP_HANDLE, False, parent_pid) else: source_process = None new_handle = reduction.duplicate(pipe_handle, source_process=source_process) fd = msvcrt.open_osfhandle(new_handle, os.O_RDONLY) parent_sentinel = source_process else: from . import resource_tracker resource_tracker._resource_tracker._fd = tracker_fd fd = pipe_handle parent_sentinel = os.dup(pipe_handle) exitcode = _main(fd, parent_sentinel) sys.exit(exitcode) def _main(fd, parent_sentinel): with os.fdopen(fd, 'rb', closefd=True) as from_parent: process.current_process()._inheriting = True try: preparation_data = reduction.pickle.load(from_parent) prepare(preparation_data) self = reduction.pickle.load(from_parent) finally: del process.current_process()._inheriting return self._bootstrap(parent_sentinel) def _check_not_importing_main(): if getattr(process.current_process(), '_inheriting', False): raise RuntimeError(''' An attempt has been made to start a new process before the current process has finished its bootstrapping phase. This probably means that you are not using fork to start your child processes and you have forgotten to use the proper idiom in the main module: if __name__ == '__main__': freeze_support() ... The "freeze_support()" line can be omitted if the program is not going to be frozen to produce an executable. To fix this issue, refer to the "Safe importing of main module" section in https://docs.python.org/3/library/multiprocessing.html ''') def get_preparation_data(name): ''' Return info about parent needed by child to unpickle process object ''' _check_not_importing_main() d = dict( log_to_stderr=util._log_to_stderr, authkey=process.current_process().authkey, ) if util._logger is not None: d['log_level'] = util._logger.getEffectiveLevel() sys_path=sys.path.copy() try: i = sys_path.index('') except ValueError: pass else: sys_path[i] = process.ORIGINAL_DIR d.update( name=name, sys_path=sys_path, sys_argv=sys.argv, orig_dir=process.ORIGINAL_DIR, dir=os.getcwd(), start_method=get_start_method(), ) # Figure out whether to initialise main in the subprocess as a module # or through direct execution (or to leave it alone entirely) main_module = sys.modules['__main__'] main_mod_name = getattr(main_module.__spec__, "name", None) if main_mod_name is not None: d['init_main_from_name'] = main_mod_name elif sys.platform != 'win32' or (not WINEXE and not WINSERVICE): main_path = getattr(main_module, '__file__', None) if main_path is not None: if (not os.path.isabs(main_path) and process.ORIGINAL_DIR is not None): main_path = os.path.join(process.ORIGINAL_DIR, main_path) d['init_main_from_path'] = os.path.normpath(main_path) return d # # Prepare current process # old_main_modules = [] def prepare(data): ''' Try to get current process ready to unpickle process object ''' if 'name' in data: process.current_process().name = data['name'] if 'authkey' in data: process.current_process().authkey = data['authkey'] if 'log_to_stderr' in data and data['log_to_stderr']: util.log_to_stderr() if 'log_level' in data: util.get_logger().setLevel(data['log_level']) if 'sys_path' in data: sys.path = data['sys_path'] if 'sys_argv' in data: sys.argv = data['sys_argv'] if 'dir' in data: os.chdir(data['dir']) if 'orig_dir' in data: process.ORIGINAL_DIR = data['orig_dir'] if 'start_method' in data: set_start_method(data['start_method'], force=True) if 'init_main_from_name' in data: _fixup_main_from_name(data['init_main_from_name']) elif 'init_main_from_path' in data: _fixup_main_from_path(data['init_main_from_path']) # Multiprocessing module helpers to fix up the main module in # spawned subprocesses def _fixup_main_from_name(mod_name): # __main__.py files for packages, directories, zip archives, etc, run # their "main only" code unconditionally, so we don't even try to # populate anything in __main__, nor do we make any changes to # __main__ attributes current_main = sys.modules['__main__'] if mod_name == "__main__" or mod_name.endswith(".__main__"): return # If this process was forked, __main__ may already be populated if getattr(current_main.__spec__, "name", None) == mod_name: return # Otherwise, __main__ may contain some non-main code where we need to # support unpickling it properly. We rerun it as __mp_main__ and make # the normal __main__ an alias to that old_main_modules.append(current_main) main_module = types.ModuleType("__mp_main__") main_content = runpy.run_module(mod_name, run_name="__mp_main__", alter_sys=True) main_module.__dict__.update(main_content) sys.modules['__main__'] = sys.modules['__mp_main__'] = main_module def _fixup_main_from_path(main_path): # If this process was forked, __main__ may already be populated current_main = sys.modules['__main__'] # Unfortunately, the main ipython launch script historically had no # "if __name__ == '__main__'" guard, so we work around that # by treating it like a __main__.py file # See https://github.com/ipython/ipython/issues/4698 main_name = os.path.splitext(os.path.basename(main_path))[0] if main_name == 'ipython': return # Otherwise, if __file__ already has the setting we expect, # there's nothing more to do if getattr(current_main, '__file__', None) == main_path: return # If the parent process has sent a path through rather than a module # name we assume it is an executable script that may contain # non-main code that needs to be executed old_main_modules.append(current_main) main_module = types.ModuleType("__mp_main__") main_content = runpy.run_path(main_path, run_name="__mp_main__") main_module.__dict__.update(main_content) sys.modules['__main__'] = sys.modules['__mp_main__'] = main_module def import_main_path(main_path): ''' Set sys.modules['__main__'] to module at main_path ''' _fixup_main_from_path(main_path) PK:W�\&�L��/�/synchronize.pynu�[���# # Module implementing synchronization primitives # # multiprocessing/synchronize.py # # Copyright (c) 2006-2008, R Oudkerk # Licensed to PSF under a Contributor Agreement. # __all__ = [ 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Condition', 'Event' ] import threading import sys import tempfile import _multiprocessing import time from . import context from . import process from . import util # Try to import the mp.synchronize module cleanly, if it fails # raise ImportError for platforms lacking a working sem_open implementation. # See issue 3770 try: from _multiprocessing import SemLock, sem_unlink except (ImportError): raise ImportError("This platform lacks a functioning sem_open" + " implementation, therefore, the required" + " synchronization primitives needed will not" + " function, see issue 3770.") # # Constants # RECURSIVE_MUTEX, SEMAPHORE = list(range(2)) SEM_VALUE_MAX = _multiprocessing.SemLock.SEM_VALUE_MAX # # Base class for semaphores and mutexes; wraps `_multiprocessing.SemLock` # class SemLock(object): _rand = tempfile._RandomNameSequence() def __init__(self, kind, value, maxvalue, *, ctx): if ctx is None: ctx = context._default_context.get_context() self._is_fork_ctx = ctx.get_start_method() == 'fork' unlink_now = sys.platform == 'win32' or self._is_fork_ctx for i in range(100): try: sl = self._semlock = _multiprocessing.SemLock( kind, value, maxvalue, self._make_name(), unlink_now) except FileExistsError: pass else: break else: raise FileExistsError('cannot find name for semaphore') util.debug('created semlock with handle %s' % sl.handle) self._make_methods() if sys.platform != 'win32': def _after_fork(obj): obj._semlock._after_fork() util.register_after_fork(self, _after_fork) if self._semlock.name is not None: # We only get here if we are on Unix with forking # disabled. When the object is garbage collected or the # process shuts down we unlink the semaphore name from .resource_tracker import register register(self._semlock.name, "semaphore") util.Finalize(self, SemLock._cleanup, (self._semlock.name,), exitpriority=0) @staticmethod def _cleanup(name): from .resource_tracker import unregister sem_unlink(name) unregister(name, "semaphore") def _make_methods(self): self.acquire = self._semlock.acquire self.release = self._semlock.release def __enter__(self): return self._semlock.__enter__() def __exit__(self, *args): return self._semlock.__exit__(*args) def __getstate__(self): context.assert_spawning(self) sl = self._semlock if sys.platform == 'win32': h = context.get_spawning_popen().duplicate_for_child(sl.handle) else: if self._is_fork_ctx: raise RuntimeError('A SemLock created in a fork context is being ' 'shared with a process in a spawn context. This is ' 'not supported. Please use the same context to create ' 'multiprocessing objects and Process.') h = sl.handle return (h, sl.kind, sl.maxvalue, sl.name) def __setstate__(self, state): self._semlock = _multiprocessing.SemLock._rebuild(*state) util.debug('recreated blocker with handle %r' % state[0]) self._make_methods() # Ensure that deserialized SemLock can be serialized again (gh-108520). self._is_fork_ctx = False @staticmethod def _make_name(): return '%s-%s' % (process.current_process()._config['semprefix'], next(SemLock._rand)) # # Semaphore # class Semaphore(SemLock): def __init__(self, value=1, *, ctx): SemLock.__init__(self, SEMAPHORE, value, SEM_VALUE_MAX, ctx=ctx) def get_value(self): return self._semlock._get_value() def __repr__(self): try: value = self._semlock._get_value() except Exception: value = 'unknown' return '<%s(value=%s)>' % (self.__class__.__name__, value) # # Bounded semaphore # class BoundedSemaphore(Semaphore): def __init__(self, value=1, *, ctx): SemLock.__init__(self, SEMAPHORE, value, value, ctx=ctx) def __repr__(self): try: value = self._semlock._get_value() except Exception: value = 'unknown' return '<%s(value=%s, maxvalue=%s)>' % \ (self.__class__.__name__, value, self._semlock.maxvalue) # # Non-recursive lock # class Lock(SemLock): def __init__(self, *, ctx): SemLock.__init__(self, SEMAPHORE, 1, 1, ctx=ctx) def __repr__(self): try: if self._semlock._is_mine(): name = process.current_process().name if threading.current_thread().name != 'MainThread': name += '|' + threading.current_thread().name elif not self._semlock._is_zero(): name = 'None' elif self._semlock._count() > 0: name = 'SomeOtherThread' else: name = 'SomeOtherProcess' except Exception: name = 'unknown' return '<%s(owner=%s)>' % (self.__class__.__name__, name) # # Recursive lock # class RLock(SemLock): def __init__(self, *, ctx): SemLock.__init__(self, RECURSIVE_MUTEX, 1, 1, ctx=ctx) def __repr__(self): try: if self._semlock._is_mine(): name = process.current_process().name if threading.current_thread().name != 'MainThread': name += '|' + threading.current_thread().name count = self._semlock._count() elif not self._semlock._is_zero(): name, count = 'None', 0 elif self._semlock._count() > 0: name, count = 'SomeOtherThread', 'nonzero' else: name, count = 'SomeOtherProcess', 'nonzero' except Exception: name, count = 'unknown', 'unknown' return '<%s(%s, %s)>' % (self.__class__.__name__, name, count) # # Condition variable # class Condition(object): def __init__(self, lock=None, *, ctx): self._lock = lock or ctx.RLock() self._sleeping_count = ctx.Semaphore(0) self._woken_count = ctx.Semaphore(0) self._wait_semaphore = ctx.Semaphore(0) self._make_methods() def __getstate__(self): context.assert_spawning(self) return (self._lock, self._sleeping_count, self._woken_count, self._wait_semaphore) def __setstate__(self, state): (self._lock, self._sleeping_count, self._woken_count, self._wait_semaphore) = state self._make_methods() def __enter__(self): return self._lock.__enter__() def __exit__(self, *args): return self._lock.__exit__(*args) def _make_methods(self): self.acquire = self._lock.acquire self.release = self._lock.release def __repr__(self): try: num_waiters = (self._sleeping_count._semlock._get_value() - self._woken_count._semlock._get_value()) except Exception: num_waiters = 'unknown' return '<%s(%s, %s)>' % (self.__class__.__name__, self._lock, num_waiters) def wait(self, timeout=None): assert self._lock._semlock._is_mine(), \ 'must acquire() condition before using wait()' # indicate that this thread is going to sleep self._sleeping_count.release() # release lock count = self._lock._semlock._count() for i in range(count): self._lock.release() try: # wait for notification or timeout return self._wait_semaphore.acquire(True, timeout) finally: # indicate that this thread has woken self._woken_count.release() # reacquire lock for i in range(count): self._lock.acquire() def notify(self, n=1): assert self._lock._semlock._is_mine(), 'lock is not owned' assert not self._wait_semaphore.acquire( False), ('notify: Should not have been able to acquire ' + '_wait_semaphore') # to take account of timeouts since last notify*() we subtract # woken_count from sleeping_count and rezero woken_count while self._woken_count.acquire(False): res = self._sleeping_count.acquire(False) assert res, ('notify: Bug in sleeping_count.acquire' + '- res should not be False') sleepers = 0 while sleepers < n and self._sleeping_count.acquire(False): self._wait_semaphore.release() # wake up one sleeper sleepers += 1 if sleepers: for i in range(sleepers): self._woken_count.acquire() # wait for a sleeper to wake # rezero wait_semaphore in case some timeouts just happened while self._wait_semaphore.acquire(False): pass def notify_all(self): self.notify(n=sys.maxsize) def wait_for(self, predicate, timeout=None): result = predicate() if result: return result if timeout is not None: endtime = time.monotonic() + timeout else: endtime = None waittime = None while not result: if endtime is not None: waittime = endtime - time.monotonic() if waittime <= 0: break self.wait(waittime) result = predicate() return result # # Event # class Event(object): def __init__(self, *, ctx): self._cond = ctx.Condition(ctx.Lock()) self._flag = ctx.Semaphore(0) def is_set(self): with self._cond: if self._flag.acquire(False): self._flag.release() return True return False def set(self): with self._cond: self._flag.acquire(False) self._flag.release() self._cond.notify_all() def clear(self): with self._cond: self._flag.acquire(False) def wait(self, timeout=None): with self._cond: if self._flag.acquire(False): self._flag.release() else: self._cond.wait(timeout) if self._flag.acquire(False): self._flag.release() return True return False def __repr__(self): set_status = 'set' if self.is_set() else 'unset' return f"<{type(self).__qualname__} at {id(self):#x} {set_status}>" # # Barrier # class Barrier(threading.Barrier): def __init__(self, parties, action=None, timeout=None, *, ctx): import struct from .heap import BufferWrapper wrapper = BufferWrapper(struct.calcsize('i') * 2) cond = ctx.Condition() self.__setstate__((parties, action, timeout, cond, wrapper)) self._state = 0 self._count = 0 def __setstate__(self, state): (self._parties, self._action, self._timeout, self._cond, self._wrapper) = state self._array = self._wrapper.create_memoryview().cast('i') def __getstate__(self): return (self._parties, self._action, self._timeout, self._cond, self._wrapper) @property def _state(self): return self._array[0] @_state.setter def _state(self, value): self._array[0] = value @property def _count(self): return self._array[1] @_count.setter def _count(self, value): self._array[1] = value PK:W�\��b�7�7util.pynu�[���# # Module providing various facilities to other parts of the package # # multiprocessing/util.py # # Copyright (c) 2006-2008, R Oudkerk # Licensed to PSF under a Contributor Agreement. # import os import itertools import sys import weakref import atexit import threading # we want threading to install it's # cleanup function before multiprocessing does from subprocess import _args_from_interpreter_flags from . import process __all__ = [ 'sub_debug', 'debug', 'info', 'sub_warning', 'get_logger', 'log_to_stderr', 'get_temp_dir', 'register_after_fork', 'is_exiting', 'Finalize', 'ForkAwareThreadLock', 'ForkAwareLocal', 'close_all_fds_except', 'SUBDEBUG', 'SUBWARNING', ] # # Logging # NOTSET = 0 SUBDEBUG = 5 DEBUG = 10 INFO = 20 SUBWARNING = 25 LOGGER_NAME = 'multiprocessing' DEFAULT_LOGGING_FORMAT = '[%(levelname)s/%(processName)s] %(message)s' _logger = None _log_to_stderr = False def sub_debug(msg, *args): if _logger: _logger.log(SUBDEBUG, msg, *args, stacklevel=2) def debug(msg, *args): if _logger: _logger.log(DEBUG, msg, *args, stacklevel=2) def info(msg, *args): if _logger: _logger.log(INFO, msg, *args, stacklevel=2) def sub_warning(msg, *args): if _logger: _logger.log(SUBWARNING, msg, *args, stacklevel=2) def get_logger(): ''' Returns logger used by multiprocessing ''' global _logger import logging logging._acquireLock() try: if not _logger: _logger = logging.getLogger(LOGGER_NAME) _logger.propagate = 0 # XXX multiprocessing should cleanup before logging if hasattr(atexit, 'unregister'): atexit.unregister(_exit_function) atexit.register(_exit_function) else: atexit._exithandlers.remove((_exit_function, (), {})) atexit._exithandlers.append((_exit_function, (), {})) finally: logging._releaseLock() return _logger def log_to_stderr(level=None): ''' Turn on logging and add a handler which prints to stderr ''' global _log_to_stderr import logging logger = get_logger() formatter = logging.Formatter(DEFAULT_LOGGING_FORMAT) handler = logging.StreamHandler() handler.setFormatter(formatter) logger.addHandler(handler) if level: logger.setLevel(level) _log_to_stderr = True return _logger # Abstract socket support def _platform_supports_abstract_sockets(): if sys.platform == "linux": return True if hasattr(sys, 'getandroidapilevel'): return True return False def is_abstract_socket_namespace(address): if not address: return False if isinstance(address, bytes): return address[0] == 0 elif isinstance(address, str): return address[0] == "\0" raise TypeError(f'address type of {address!r} unrecognized') abstract_sockets_supported = _platform_supports_abstract_sockets() # # Function returning a temp directory which will be removed on exit # def _remove_temp_dir(rmtree, tempdir): def onerror(func, path, err_info): if not issubclass(err_info[0], FileNotFoundError): raise rmtree(tempdir, onerror=onerror) current_process = process.current_process() # current_process() can be None if the finalizer is called # late during Python finalization if current_process is not None: current_process._config['tempdir'] = None def get_temp_dir(): # get name of a temp directory which will be automatically cleaned up tempdir = process.current_process()._config.get('tempdir') if tempdir is None: import shutil, tempfile tempdir = tempfile.mkdtemp(prefix='pymp-') info('created temp directory %s', tempdir) # keep a strong reference to shutil.rmtree(), since the finalizer # can be called late during Python shutdown Finalize(None, _remove_temp_dir, args=(shutil.rmtree, tempdir), exitpriority=-100) process.current_process()._config['tempdir'] = tempdir return tempdir # # Support for reinitialization of objects when bootstrapping a child process # _afterfork_registry = weakref.WeakValueDictionary() _afterfork_counter = itertools.count() def _run_after_forkers(): items = list(_afterfork_registry.items()) items.sort() for (index, ident, func), obj in items: try: func(obj) except Exception as e: info('after forker raised exception %s', e) def register_after_fork(obj, func): _afterfork_registry[(next(_afterfork_counter), id(obj), func)] = obj # # Finalization using weakrefs # _finalizer_registry = {} _finalizer_counter = itertools.count() class Finalize(object): ''' Class which supports object finalization using weakrefs ''' def __init__(self, obj, callback, args=(), kwargs=None, exitpriority=None): if (exitpriority is not None) and not isinstance(exitpriority,int): raise TypeError( "Exitpriority ({0!r}) must be None or int, not {1!s}".format( exitpriority, type(exitpriority))) if obj is not None: self._weakref = weakref.ref(obj, self) elif exitpriority is None: raise ValueError("Without object, exitpriority cannot be None") self._callback = callback self._args = args self._kwargs = kwargs or {} self._key = (exitpriority, next(_finalizer_counter)) self._pid = os.getpid() _finalizer_registry[self._key] = self def __call__(self, wr=None, # Need to bind these locally because the globals can have # been cleared at shutdown _finalizer_registry=_finalizer_registry, sub_debug=sub_debug, getpid=os.getpid): ''' Run the callback unless it has already been called or cancelled ''' try: del _finalizer_registry[self._key] except KeyError: sub_debug('finalizer no longer registered') else: if self._pid != getpid(): sub_debug('finalizer ignored because different process') res = None else: sub_debug('finalizer calling %s with args %s and kwargs %s', self._callback, self._args, self._kwargs) res = self._callback(*self._args, **self._kwargs) self._weakref = self._callback = self._args = \ self._kwargs = self._key = None return res def cancel(self): ''' Cancel finalization of the object ''' try: del _finalizer_registry[self._key] except KeyError: pass else: self._weakref = self._callback = self._args = \ self._kwargs = self._key = None def still_active(self): ''' Return whether this finalizer is still waiting to invoke callback ''' return self._key in _finalizer_registry def __repr__(self): try: obj = self._weakref() except (AttributeError, TypeError): obj = None if obj is None: return '<%s object, dead>' % self.__class__.__name__ x = '<%s object, callback=%s' % ( self.__class__.__name__, getattr(self._callback, '__name__', self._callback)) if self._args: x += ', args=' + str(self._args) if self._kwargs: x += ', kwargs=' + str(self._kwargs) if self._key[0] is not None: x += ', exitpriority=' + str(self._key[0]) return x + '>' def _run_finalizers(minpriority=None): ''' Run all finalizers whose exit priority is not None and at least minpriority Finalizers with highest priority are called first; finalizers with the same priority will be called in reverse order of creation. ''' if _finalizer_registry is None: # This function may be called after this module's globals are # destroyed. See the _exit_function function in this module for more # notes. return if minpriority is None: f = lambda p : p[0] is not None else: f = lambda p : p[0] is not None and p[0] >= minpriority # Careful: _finalizer_registry may be mutated while this function # is running (either by a GC run or by another thread). # list(_finalizer_registry) should be atomic, while # list(_finalizer_registry.items()) is not. keys = [key for key in list(_finalizer_registry) if f(key)] keys.sort(reverse=True) for key in keys: finalizer = _finalizer_registry.get(key) # key may have been removed from the registry if finalizer is not None: sub_debug('calling %s', finalizer) try: finalizer() except Exception: import traceback traceback.print_exc() if minpriority is None: _finalizer_registry.clear() # # Clean up on exit # def is_exiting(): ''' Returns true if the process is shutting down ''' return _exiting or _exiting is None _exiting = False def _exit_function(info=info, debug=debug, _run_finalizers=_run_finalizers, active_children=process.active_children, current_process=process.current_process): # We hold on to references to functions in the arglist due to the # situation described below, where this function is called after this # module's globals are destroyed. global _exiting if not _exiting: _exiting = True info('process shutting down') debug('running all "atexit" finalizers with priority >= 0') _run_finalizers(0) if current_process() is not None: # We check if the current process is None here because if # it's None, any call to ``active_children()`` will raise # an AttributeError (active_children winds up trying to # get attributes from util._current_process). One # situation where this can happen is if someone has # manipulated sys.modules, causing this module to be # garbage collected. The destructor for the module type # then replaces all values in the module dict with None. # For instance, after setuptools runs a test it replaces # sys.modules with a copy created earlier. See issues # #9775 and #15881. Also related: #4106, #9205, and # #9207. for p in active_children(): if p.daemon: info('calling terminate() for daemon %s', p.name) p._popen.terminate() for p in active_children(): info('calling join() for process %s', p.name) p.join() debug('running the remaining "atexit" finalizers') _run_finalizers() atexit.register(_exit_function) # # Some fork aware types # class ForkAwareThreadLock(object): def __init__(self): self._lock = threading.Lock() self.acquire = self._lock.acquire self.release = self._lock.release register_after_fork(self, ForkAwareThreadLock._at_fork_reinit) def _at_fork_reinit(self): self._lock._at_fork_reinit() def __enter__(self): return self._lock.__enter__() def __exit__(self, *args): return self._lock.__exit__(*args) class ForkAwareLocal(threading.local): def __init__(self): register_after_fork(self, lambda obj : obj.__dict__.clear()) def __reduce__(self): return type(self), () # # Close fds except those specified # try: MAXFD = os.sysconf("SC_OPEN_MAX") except Exception: MAXFD = 256 def close_all_fds_except(fds): fds = list(fds) + [-1, MAXFD] fds.sort() assert fds[-1] == MAXFD, 'fd too large' for i in range(len(fds) - 1): os.closerange(fds[i]+1, fds[i+1]) # # Close sys.stdin and replace stdin with os.devnull # def _close_stdin(): if sys.stdin is None: return try: sys.stdin.close() except (OSError, ValueError): pass try: fd = os.open(os.devnull, os.O_RDONLY) try: sys.stdin = open(fd, encoding="utf-8", closefd=False) except: os.close(fd) raise except (OSError, ValueError): pass # # Flush standard streams, if any # def _flush_std_streams(): try: sys.stdout.flush() except (AttributeError, ValueError): pass try: sys.stderr.flush() except (AttributeError, ValueError): pass # # Start a program with only specified fds kept open # def spawnv_passfds(path, args, passfds): import _posixsubprocess import subprocess passfds = tuple(sorted(map(int, passfds))) errpipe_read, errpipe_write = os.pipe() try: return _posixsubprocess.fork_exec( args, [path], True, passfds, None, None, -1, -1, -1, -1, -1, -1, errpipe_read, errpipe_write, False, False, -1, None, None, None, -1, None, subprocess._USE_VFORK) finally: os.close(errpipe_read) os.close(errpipe_write) def close_fds(*fds): """Close each file descriptor given as an argument""" for fd in fds: os.close(fd) def _cleanup_tests(): """Cleanup multiprocessing resources when multiprocessing tests completed.""" from test import support # cleanup multiprocessing process._cleanup() # Stop the ForkServer process if it's running from multiprocessing import forkserver forkserver._forkserver._stop() # Stop the ResourceTracker process if it's running from multiprocessing import resource_tracker resource_tracker._resource_tracker._stop() # bpo-37421: Explicitly call _run_finalizers() to remove immediately # temporary directories created by multiprocessing.util.get_temp_dir(). _run_finalizers() support.gc_collect() support.reap_children() PK:W�\Y�,��7�7,__pycache__/forkserver.cpython-312.opt-2.pycnu�[���PK:W�\1���.;.;&'8__pycache__/forkserver.cpython-312.pycnu�[���PK:W�\)�d�66&�s__pycache__/heap.cpython-312.opt-1.pycnu�[���PK:W�\[��Z5Z5&�__pycache__/heap.cpython-312.opt-2.pycnu�[���PK:W�\�66 ��__pycache__/heap.cpython-312.pycnu�[���PK:W�\��q�RR*__pycache__/managers.cpython-312.opt-1.pycnu�[���PK:W�\��=��*�__pycache__/managers.cpython-312.opt-2.pycnu�[���PK:W�\��]�& & $ __pycache__/managers.cpython-312.pycnu�[���PK:W�\4ϕ�A�A�&�#__pycache__/pool.cpython-312.opt-1.pycnu�[���PK:W�\��"c�c�&�__pycache__/pool.cpython-312.opt-2.pycnu�[���PK:W�\��*����� �s__pycache__/pool.cpython-312.pycnu�[���PK:W�\���' ,�__pycache__/popen_fork.cpython-312.opt-1.pycnu�[���PK:W�\���' ,/0__pycache__/popen_fork.cpython-312.opt-2.pycnu�[���PK:W�\˙.��3�@__pycache__/popen_spawn_win32.cpython-312.opt-2.pycnu�[���PK:W�\PE��-�X__pycache__/popen_spawn_win32.cpython-312.pycnu�[���PK:W�\zc_�@�@)�p__pycache__/process.cpython-312.opt-1.pycnu�[���PK:W�\�rr�;�;):�__pycache__/process.cpython-312.opt-2.pycnu�[���PK:W�\1`�_aEaE#Y�__pycache__/process.cpython-312.pycnu�[���PK:W�\&l�7vGvG( 4__pycache__/queues.cpython-312.opt-1.pycnu�[���PK:W�\Y#��F�F(�{__pycache__/queues.cpython-312.opt-2.pycnu�[���PK:W�\�y� �G�G"�__pycache__/queues.cpython-312.pycnu�[���PK:W�\�2D=6=6+d__pycache__/reduction.cpython-312.opt-1.pycnu�[���PK:W�\T�+ġ3�3+�A__pycache__/reduction.cpython-312.opt-2.pycnu�[���PK:W�\�2D=6=6%�u__pycache__/reduction.cpython-312.pycnu�[���PK:W�\���Q� � 1��__pycache__/resource_sharer.cpython-312.opt-2.pycnu�[���PK:W�\�n���"�"+��__pycache__/resource_sharer.cpython-312.pycnu�[���PK:W�\��-�-2��__pycache__/resource_tracker.cpython-312.opt-1.pycnu�[���PK:W�\��,�,2� __pycache__/resource_tracker.cpython-312.opt-2.pycnu�[���PK:W�\`9��.�.,�K __pycache__/resource_tracker.cpython-312.pycnu�[���PK:W�\���TZTZ/�z __pycache__/shared_memory.cpython-312.opt-1.pycnu�[���PK:W�\0>��O�O/l� __pycache__/shared_memory.cpython-312.opt-2.pycnu�[���PK:W�\#~Hg\\)�% __pycache__/shared_memory.cpython-312.pycnu�[���PK:W�\T;�D)D).)� __pycache__/sharedctypes.cpython-312.opt-1.pycnu�[���PK:W�\���Y(Y(.˫ __pycache__/sharedctypes.cpython-312.opt-2.pycnu�[���PK:W�\sK���)�)(�� __pycache__/sharedctypes.cpython-312.pycnu�[���PK:W�\�1F�(-(-'�� __pycache__/spawn.cpython-312.opt-1.pycnu�[���PK:W�\R�~+~+'�+__pycache__/spawn.cpython-312.opt-2.pycnu�[���PK:W�\\}��-�-!�W__pycache__/spawn.cpython-312.pycnu�[���PK:W�\���N�N-��__pycache__/synchronize.cpython-312.opt-1.pycnu�[���PK:W�\���N�N-��__pycache__/synchronize.cpython-312.opt-2.pycnu�[���PK:W�\\�~�H�H&�#__pycache__/util.cpython-312.opt-1.pycnu�[���PK:W�\�J��E�E&�l__pycache__/util.cpython-312.opt-2.pycnu�[���PK:W�\3_x��H�H ��__pycache__/util.cpython-312.pycnu�[���PK:W�\�mh�B�B#��__pycache__/context.cpython-312.pycnu�[���PK:W�\�z��:�:,�> __pycache__/forkserver.cpython-312.opt-1.pycnu�[���PK:W�\���' &�y __pycache__/popen_fork.cpython-312.pycnu�[���PK:W�\q��www2� __pycache__/popen_forkserver.cpython-312.opt-1.pycnu�[���PK:W�\q��www2ۙ __pycache__/popen_forkserver.cpython-312.opt-2.pycnu�[���PK:W�\q��www,�� __pycache__/popen_forkserver.cpython-312.pycnu�[���PK:W�\ũ�PP3�� __pycache__/popen_spawn_posix.cpython-312.opt-1.pycnu�[���PK:W�\ũ�PP3:� __pycache__/popen_spawn_posix.cpython-312.opt-2.pycnu�[���PK:W�\ũ�PP-�� __pycache__/popen_spawn_posix.cpython-312.pycnu�[���PK:W�\�_� ��3�� __pycache__/popen_spawn_win32.cpython-312.opt-1.pycnu�[���PK:W�\6|�@"@"1�__pycache__/resource_sharer.cpython-312.opt-1.pycnu�[���PK:W�\2��P�P'y#__pycache__/synchronize.cpython-312.pycnu�[���PK:W�\j6�6��*�t__pycache__/__init__.cpython-312.opt-1.pycnu�[���PK:W�\j6�6��*�x__pycache__/__init__.cpython-312.opt-2.pycnu�[���PK:W�\j6�6��$�|__pycache__/__init__.cpython-312.pycnu�[���PK:W�\��w7�7�,�__pycache__/connection.cpython-312.opt-1.pycnu�[���PK:W�\�2�"�"�,�;__pycache__/connection.cpython-312.opt-2.pycnu�[���PK:W�\2a+ȻȻ&#�__pycache__/connection.cpython-312.pycnu�[���PK:W�\�mh�B�B)A�__pycache__/context.cpython-312.opt-1.pycnu�[���PK:W�\���9=9=)�__pycache__/context.cpython-312.opt-2.pycnu�[���PK:W�\�q�J��0�'dummy/__pycache__/__init__.cpython-312.opt-1.pycnu�[���PK:W�\�q�J��0�=dummy/__pycache__/__init__.cpython-312.opt-2.pycnu�[���PK:W�\�q�J��*)Tdummy/__pycache__/__init__.cpython-312.pycnu�[���PK:W�\��;� � 2_jdummy/__pycache__/connection.cpython-312.opt-1.pycnu�[���PK:W�\��;� � 2cxdummy/__pycache__/connection.cpython-312.opt-2.pycnu�[���PK:W�\��;� � ,g�dummy/__pycache__/connection.cpython-312.pycnu�[���PK:W�\��se��e�dummy/__init__.pynu�[���PK:W�\��_T>>��dummy/connection.pynu�[���PK:W�\'�u����__init__.pynu�[���PK:W�\{r����� �connection.pynu�[���PK:W�\4���-�- �Lcontext.pynu�[���PK:W�\B�R�/�/ �zforkserver.pynu�[���PK:W�\���}j-j-��heap.pynu�[���PK:W�\�i����9�managers.pynu�[���PK:W�\�w�=����pool.pynu�[���PK:W�\N��I I �popen_fork.pynu�[���PK:W�\/TJ��>popen_forkserver.pynu�[���PK:W�\ ����7&popen_spawn_posix.pynu�[���PK:W�\��[��h.popen_spawn_win32.pynu�[���PK:W�\o�d�k/k/ O@process.pynu�[���PK:W�\���.�1�1 �oqueues.pynu�[���PK:W�\�!ĭ(%(%¡reduction.pynu�[���PK:W�\�5IG&�resource_sharer.pynu�[���PK:W�\[�{E+E+��resource_tracker.pynu�[���PK:W�\�U��HH shared_memory.pynu�[���PK:W�\}����cOsharedctypes.pynu�[���PK:W�\P �q�%�%Dhspawn.pynu�[���PK:W�\&�L��/�/(�synchronize.pynu�[���PK:W�\��b�7�7V�util.pynu�[���PK\\�#B�
/home/emeraadmin/www/node_modules/lodash.isstring/../d3-array/../../4d695/multiprocessing.zip