Ë
    èÿæi¦¤  ã                   óD  — d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZmZmZmZ ddlmZmZmZmZmZmZ ddlZddlmZ ddlm Z  edz
  Z!	 ddl"m#Z#  e#«        dd	l$m%Z% d
Z&	 ddl$m(Z( d
Z)	 ddl*Z+d
Z, ejZ                  e)d«      Z. ejZ                  e&d«      Z/e)xr e(j`                  dk(  Z1 ejZ                  e1d«      Z2ejf                  ji                  d«      Z5ejf                  ji                  d«      Z6ejn                  dk  Z8e8Z9e5 Z:d„ Z;e,rd„ Z<nd„ Z<d„ Z=d„ Z> G d„ de?«      Z@ G d„ de@«      ZA G d„ de?«      ZB G d„ d e@«      ZC G d!„ d"e@«      ZD G d#„ d$e@«      ZEd%„ ZFd&„ ZGe
j�                  ZI G d'„ d(e?«      ZJd)„ ZK eGeIej˜                  «      ZM eG eKd*«      Ž ZNe5s eG eKd+«      Ž ZO eG eKd,«      Ž ZP eG eKd-«      Ž ZQ G d.„ d/e«      ZRe j¦                  d0v ZT ejZ                  eTd1«       G d2„ d3eR«      «       ZUeUj­                  «         G d4„ d5e?«      ZW G d6„ d7eWeR«      ZXeXj­                  «         G d8„ d9e«      ZYe G d:„ d;eY«      «       ZZeZj­                  «        e G d<„ d=eY«      «       Z[e G d>„ d?eY«      «       Z\ee2 G d@„ dAeY«      «       «       Z]ee/ G dB„ dCeY«      «       «       Z^e G dD„ dEe«      «       Z_ee. G dF„ dGe«      «       «       Z`eadHk(  r ejÄ                  «        yy# e'$ r dZ&Y �Œˆw xY w# e'$ r dZ)Y �Œ�w xY w# e'$ r dZ,Y �Œ”w xY w)Iz
Tests the parallel backend
é    N)ÚjitÚ	vectorizeÚguvectorizeÚset_num_threads)Útemp_directoryÚoverride_configÚTestCaseÚtagÚskip_parfors_unsupportedÚ
linux_only)Ú_TIMEOUT)Úconfigg      N@)Ú_check_tbb_version_compatible)ÚtbbpoolTF)ÚomppoolzOpenMP threadpool requiredzTBB threadpool requiredÚGNUzGNU OpenMP only testsÚwinÚdarwinl        c                 ó2   — t        j                  | «      |z   S ©N)ÚnpÚones©ÚnÚvs     úv/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/numba/tests/test_parallel_backend.pyÚfoor   H   s   € Ü�7‰7�1‹:˜‰>Ðó    c                 ó¸   — t        j                  t        j                  | | f«      t        j                  | | f«      «      }|t        j                  | «      z   |z   S r   )r   Údotr   Úarange)r   r   Úxs      r   Úlinalgr#   M   sB   € Ü�F‰F”2—7‘7˜A˜q˜6“?¤B§G¡G¨Q°¨F£OÓ4ˆØ”2—9‘9˜Q“<Ñ !Ñ#Ð#r   c                 ó2   — t        j                  | «      |z   S r   )r   r!   r   s     r   r#   r#   Q   s   € ä�y‰y˜‹|˜aÑÐr   c                 ó   — | |z   S r   © )ÚaÚbs     r   Ú	ufunc_foor)   V   s   € Øˆq‰5€Lr   c                 ó   — | |z   |d<   y )Nr   r&   )r'   r(   Úouts      r   Ú
gufunc_foor,   Z   s   € Ø�‰U€Cˆ‚Fr   c                   ó   — e Zd Zd„ Zy)Úrunnablec                 ó   — || _         y r   )Ú_options)ÚselfÚoptionss     r   Ú__init__zrunnable.__init___   s	   € Øˆ�r   N)Ú__name__Ú
__module__Ú__qualname__r3   r&   r   r   r.   r.   ^   s   „ ó r   r.   c                   ó   — e Zd Zd„ Zy)Ú
jit_runnerc                 ó´   —  t        di | j                  ¤Žt        «      }d}d}t        ||«      } |||«      }t        j                  j                  ||«       y ©Né   é
   r&   )r   r0   r   r   ÚtestingÚassert_allclose©r1   Úcfuncr'   r(   ÚexpectedÚgots         r   Ú__call__zjit_runner.__call__e   sN   € Ø$”Ñ$�d—m‘mÑ$¤SÓ)ˆØˆØˆÜ�q˜!“9ˆÙ�A�q‹kˆÜ
�
‰
×"Ñ" 8¨SÕ1r   N©r4   r5   r6   rC   r&   r   r   r8   r8   c   ó   „ ó2r   r8   c                   ó   — e Zd Zd„ Zd„ Zy)Úmask_runnerc                 ó    — || _         || _        y r   )ÚrunnerÚmask)r1   rI   rJ   r2   s       r   r3   zmask_runner.__init__o   s   € ØˆŒØˆ�	r   c                 óf   — | j                   rt        | j                   «       | j                  «        y r   )rJ   r   rI   )r1   s    r   rC   zmask_runner.__call__s   s    € Ø�9Š9ô ˜DŸI™IÔ&Ø�‰�r   N©r4   r5   r6   r3   rC   r&   r   r   rG   rG   n   s   „ òór   rG   c                   ó   — e Zd Zd„ Zy)Úlinalg_runnerc                 ó´   —  t        di | j                  ¤Žt        «      }d}d}t        ||«      } |||«      }t        j                  j                  ||«       y r:   )r   r0   r#   r   r=   r>   r?   s         r   rC   zlinalg_runner.__call__}   sN   € Ø$”Ñ$�d—m‘mÑ$¤VÓ,ˆØˆØˆÜ˜!˜Q“<ˆÙ�A�q‹kˆÜ
�
‰
×"Ñ" 8¨SÕ1r   NrD   r&   r   r   rN   rN   {   rE   r   rN   c                   ó   — e Zd Zd„ Zy)Úvectorize_runnerc                 ó,  —  t        dgfi | j                  ¤Žt        «      }t        j                  j	                  d«      j                  t        j                  «      x}}t        ||«      } |||«      }t        j                  j                  ||«       y )Nz(f4, f4)r<   )	r   r0   r)   r   ÚrandomÚastypeÚfloat32r=   r>   r?   s         r   rC   zvectorize_runner.__call__ˆ   sp   € Ø8”	˜:˜,Ñ8¨$¯-©-Ñ8¼ÓCˆÜ—	‘	× Ñ  Ó$×+Ñ+¬B¯J©JÓ7Ð7ˆˆAÜ˜Q “?ˆÙ�A�q‹kˆÜ
�
‰
×"Ñ" 8¨SÕ1r   NrD   r&   r   r   rQ   rQ   †   s   „ ó2r   rQ   c                   ó   — e Zd Zd„ Zy)Úguvectorize_runnerc                 ó2  — dg} t        |dfi | j                  ¤Žt        «      }t        j                  j	                  d«      j                  t        j                  «      x}}t        ||«      } |||«      }t        j                  j                  ||«       y )Nz(f4, f4, f4[:])z	(),()->()r<   )
r   r0   r,   r   rS   rT   rU   r)   r=   r>   )r1   Úsigr@   r'   r(   rA   rB   s          r   rC   zguvectorize_runner.__call__’   sx   € Ø Ð!ˆØ>”˜C Ñ>°·±Ñ>¼zÓJˆÜ—	‘	× Ñ  Ó$×+Ñ+¬B¯J©JÓ7Ð7ˆˆAÜ˜Q “?ˆÙ�A�q‹kˆÜ
�
‰
×"Ñ" 8¨SÕ1r   NrD   r&   r   r   rW   rW   �   rE   r   rW   c                 ó   — |j                  d«      }	 t        j                  «        t        t	        t        | «      dz  «      «      D ]  }t        j                  | «      } |«        Œ  y # t        $ r}|j                  |«       Y d }~y d }~ww xY w)NÚqueueg      ø?)
ÚgetÚfaulthandlerÚenableÚrangeÚintÚlenrS   ÚchoiceÚ	ExceptionÚput)ÚfnlistÚkwargsÚqÚ_ÚfnÚes         r   Úchooserrk   ›   sp   € Ø�
‰
�7Ó€AðÜ×ÑÔÜ”sœ3˜v›;¨Ñ,Ó-Ö.ˆAÜ—‘˜vÓ&ˆBÙ�Dñ /øô ò Ø	�‰ˆa�‰ûðús   “AA) Á)	BÁ2BÂBc                 ó   ‡ ‡— ˆ ˆfd„}|S )Nc                 óê  •—  ‰
«       }d|i}t        d«      D �cg c]  } ‰	t        | f|¬«      ‘Œ }}|D ]  }|j                  «        Œ |D ]  }|j                  «        Œ |j	                  «       syg }|j	                  «       s1|j                  |j                  d«      «       |j	                  «       sŒ1d}t        |dj                  |D �cg c]  }t        |«      ‘Œ c}«      z  «      ‚y c c}w c c}w )Nr[   r;   )ÚtargetÚargsrf   Fz)Error(s) occurred in delegated runner:
%sÚ
)	r_   rk   ÚstartÚjoinÚemptyÚappendr\   ÚRuntimeErrorÚrepr)re   rg   ÚkwsÚiÚthsÚthÚerrorsÚ_msgr"   Úparallel_classÚ
queue_impls            €€r   Úrun_compilez$compile_factory.<locals>.run_compile§   sß   ø€ Ù‹LˆØ˜ˆlˆä˜aœó"Ù �1ñ ¤W°F°9ÀSÖIØ ð 	ð "ãˆBØ�H‰H�Jð ãˆBØ�G‰G�Ið à�w‰wŒyØˆFØ—g‘g”iØ—‘˜aŸe™e E›lÔ+ð —g‘g•ià?ˆDÜ˜t d§i¡iÁ&Ó0IÁ&¸Q´°aµÀ&Ñ0IÓ&JÑJÓKÐKð ùò"ùò 1Js   šC+ÃC0r&   )r}   r~   r   s   `` r   Úcompile_factoryr€   ¦   s   ù€ õLð Ðr   c                   ó   — e Zd Zd„ Zd„ Zy)Ú_proc_class_implc                 ó   — || _         y r   )Ú_method)r1   Úmethods     r   r3   z_proc_class_impl.__init__¿   s	   € Øˆ�r   c                 ód   — t        j                  | j                  «      } |j                  |i |¤ŽS r   )ÚmultiprocessingÚget_contextr„   ÚProcess)r1   ro   rf   Úctxs       r   rC   z_proc_class_impl.__call__Â   s,   € Ü×)Ñ)¨$¯,©,Ó7ˆØˆs�{‰{˜DÐ+ FÑ+Ð+r   NrL   r&   r   r   r‚   r‚   ½   s   „ òó,r   r‚   c                 óp   — | dk(  rd } t        j                  | «      }t        | «      }|j                  }||fS )NÚdefault)r‡   rˆ   r‚   ÚQueue)r…   rŠ   Úprocr[   s       r   Ú_get_mp_classesr�   Ç   s<   € Ø�ÒØˆÜ
×
%Ñ
% fÓ
-€CÜ˜FÓ#€DØ�I‰I€EØ�ˆ;Ðr   ÚspawnÚforkÚ
forkserverrŒ   c                   ó’  — e Zd ZdZ ed¬«       edd¬«       edd¬«       ed¬«       edd¬«       ed¬«       edd¬«       eddd¬«       ed¬«       edd¬«       eddd¬«      gZe	s9 edd¬	«       eddd¬
«       edd¬	«       eddd¬
«      gZ
ej                  e
«       ej                  dk  rg ZnddgZg ZeD ]!  ZeD ]  Zej%                   eee«      «       Œ Œ# ddgZej%                  d«       er"ej%                  d«       ej%                  d«        ede	 ¬	«      g edd¬«      g edd¬«      geedœZddhZdd„Zy)ÚTestParallelBackendBasez6
    Base class for testing the parallel backends
    T)Únopython)r•   Úcache)r•   ÚnogilÚparallel)r•   rn   )r•   rn   r–   )r•   r˜   )r•   r˜   r–   é   é   Ú	threadingrS   Úmultiprocessing_spawnÚmultiprocessing_forkÚmultiprocessing_forkserver)Úconcurrent_jitÚconcurrent_vectorizeÚconcurrent_guvectorizeÚconcurrent_mix_useÚconcurrent_mix_use_masksÚompÚtbbc                 ó4  — t        | j                  j                  «      | _        t	        d| j                  «      5  |dk(  rt        |«       n¸|dk(  rt        |«       n§|dk(  rt        |«       n–|dk(  rt        |«       n…|dk(  rt        |«       nt|dk(  rat
        t        g}t        r*|j                  t        «       |j                  t        «       t        j                  |«       |D ]
  } ||«       Œ nt        d|z  «      ‚d d d «       y # 1 sw Y   y xY w)	NÚ	CACHE_DIRr›   r�   rž   rœ   Úmultiprocessing_defaultrS   zUnknown parallelism supplied %s)r   Ú	__class__r4   Ú
_cache_dirr   Úthread_implÚfork_proc_implÚforkserver_proc_implÚspawn_proc_implÚdefault_proc_implÚ_HAVE_OS_FORKrt   rS   ÚshuffleÚ
ValueError)r1   re   ÚparallelismÚpsÚimpls        r   r   z#TestParallelBackendBase.run_compile  sê   € Ü(¨¯©×)@Ñ)@ÓAˆŒÜ˜[¨$¯/©/Õ:Ø˜kÒ)Ü˜FÕ#ØÐ 6Ò6Ü˜vÕ&ØÐ <Ò<Ü$ VÕ,ØÐ 7Ò7Ü Õ'ØÐ 9Ò9Ü! &Õ)Ø Ò(Ü!¤?Ð3�Ý Ø—I‘IœnÔ-Ø—I‘IÔ2Ô3ä—‘˜rÔ"Û�DÙ˜•Lñ ô !Ø5¸ÑCóEð E÷+ ;×:Ñ:ús   »C
DÄDN)r›   )r4   r5   r6   Ú__doc__r8   rN   rQ   rW   Ú	all_implsÚ_parfors_unsupportedÚparfor_implsÚextendr   ÚNUMBA_NUM_THREADSÚmasksÚ
mask_implsrµ   rJ   rt   rG   r³   r°   ÚrunnersÚsafe_backendsr   r&   r   r   r”   r”   Û   sŸ  „ ññ
 	˜DÔ!Ù˜D¨Ô-Ù˜D¨Ô-Ù˜tÔ$Ù˜t¨4Ô0Ù $Ô'Ù $¨zÔ:Ù $¨zÀÔFÙ DÔ)Ù D°Ô<Ù D°À4ÔHð€Iñ  á ¨tÔ4Ù ¨t¸4Ô@Ù 4°$Ô7Ù 4°$¸dÔCð	
ˆð 	×Ñ˜Ô&à×Ñ !Ò#à‰à�A�ˆà€JÛˆÛˆDØ×Ñ™k¨$°Ó5Õ6ñ ð ð  Ð)€KØ×ÑÐ.Ô/ÙØ×ÑÐ1Ô2Ø×ÑÐ7Ô8ñ  Ð4HÐ0HÔJð
ñ  d°:Ô>ð!
ñ ¨°ZÔ@ð#
ð (Ø$.ñ€Gð ˜E�N€MôEr   r”   )r¤   r¥   Ú	workqueuezThreading layer not explicitc                   ó    — e Zd ZdZed„ «       Zy)ÚTestParallelBackendav   These are like the numba.tests.test_threadsafety tests but designed
    instead to torture the parallel backend.
    If a suitable backend is supplied via NUMBA_THREADING_LAYER these tests
    can be run directly. This test class cannot be run using the multiprocessing
    option to the test runner (i.e. `./runtests -m`) as daemon processes cannot
    have children.
    c                 óÀ   — | j                   D ]O  }| j                  j                  «       D ]0  \  }}d|z   dz   |z   }d„ } |||«      }||_        t	        | ||«       Œ2 ŒQ y )NÚtest_rh   c                 ó   ‡ ‡— ˆ ˆfd„}|S )Nc                 ó”   •— t        j                  «       }|j                  rd}| j                  |«       y | j	                  ‰‰¬«       y )Nz)daemonized processes cannot have children)r³   )r‡   Úcurrent_processÚdaemonÚskipTestr   )r1   Úselfprocr|   rµ   Úps      €€r   Útest_methodzBTestParallelBackend.generate.<locals>.methgen.<locals>.test_methodJ  s<   ø€ Ü#2×#BÑ#BÓ#D˜à#Ÿ?š?Ø#N˜DØ ŸM™M¨$Õ/à ×,Ñ,¨T¸qÐ,ÕAr   r&   )rµ   rË   rÌ   s   `` r   Úmethgenz-TestParallelBackend.generate.<locals>.methgenI  s   ù€ õBð 'Ð&r   )r³   r¾   Úitemsr4   Úsetattr)ÚclsrË   Únamerµ   ÚmethnamerÍ   ri   s          r   ÚgeneratezTestParallelBackend.generateC  sd   € à—”ˆAØ!Ÿk™k×/Ñ/Ö1‘
��dØ" Q™;¨Ñ,¨tÑ3�ò	'ñ ˜T 1Ó%�Ø&�”Ü˜˜X rÕ*ñ 2ñ !r   N)r4   r5   r6   r¶   ÚclassmethodrÓ   r&   r   r   rÂ   rÂ   6  s   „ ñð ñ+ó ñ+r   rÂ   c                   óF   — e Zd Zee ej                  dd«      dœZd„ Zd„ Z	y)ÚTestInSubprocessFÚ ©r¥   r¤   rÀ   c                 óø  — t        j                  |t         j                  t         j                  |¬«      }t        j                  t
        |j                  «      }	 |j                  «        |j                  «       \  }}|j                  dk7  r*t        d|j                  ›d|j                  «       ›d�«      ‚|j                  «       |j                  «       f|j                  «        S # |j                  «        w xY w)N©ÚstdoutÚstderrÚenvr   úprocess failed with code ú: stderr follows
rp   ©Ú
subprocessÚPopenÚPIPEr›   ÚTimerÚ_TEST_TIMEOUTÚkillrq   ÚcommunicateÚ
returncodeÚAssertionErrorÚdecodeÚcancel©r1   ÚcmdlinerÝ   ÚpopenÚtimeoutr+   Úerrs          r   Úrun_cmdzTestInSubprocess.run_cmd`  s·   € Ü× Ñ  Ü(2¯©Ü(2¯©Ø%(ô*ˆô
 —/‘/¤-°·±Ó<ˆð		Ø�M‰MŒOØ×(Ñ(Ó*‰HˆC�Ø×Ñ 1Ò$Ý$à×%Ó% s§z¡z¥|ð5ó6ð 6ð —:‘:“< §¡£Ð-à�N‰NÕøˆG�N‰NÕús   ÁA;C' Ã'C9c                 ó¦   — t         j                  j                  «       }t        |«      |d<   t        j
                  dd|g}| j                  ||«      S )NÚNUMBA_THREADING_LAYERz-mznumba.runtests)ÚosÚenvironÚcopyÚstrÚsysÚ
executablerñ   )r1   ÚtestÚthreading_layerÚenv_copyrí   s        r   Úrun_test_in_separate_processz-TestInSubprocess.run_test_in_separate_processs  sF   € Ü—:‘:—?‘?Ó$ˆÜ,/°Ó,@ˆÐ(Ñ)Ü—>‘> 4Ð)9¸4Ð@ˆØ�|‰|˜G XÓ.Ð.r   N)
r4   r5   r6   Úskip_no_tbbÚskip_no_ompÚunittestÚskipIfÚbackendsrñ   rý   r&   r   r   rÖ   rÖ   [  s)   „ Ø"Ø"Ø,˜XŸ_™_¨U°BÓ7ñ9€Hòó&/r   rÖ   c                   ó4   — e Zd ZdZdZed„ «       Zed„ «       Zy)ÚTestSpecificBackenda¦  
    This is quite contrived, for each test in the TestParallelBackend tests it
    generates a test that will run the TestParallelBackend test in a new python
    process with an environment modified to ensure a specific threadsafe backend
    is used. This is with view of testing the backends independently and in an
    isolated manner such that if they hang/crash/have issues, it doesn't kill
    the test suite.
    Fc           	      óÐ   ‡‡
— | j                   }t        j                  }d|z   dz   |z   }|›d|›d|›�Š
ˆˆ
fd„}d|›d|›d‰›�}	t        | |	 t	        d«       ||«      «      «       y )NrÄ   rh   Ú.c                 óL  •— | j                  ‰‰«      \  }}| j                  rt        d|›d|›d�«       t        j                  d|«      }|� | j                  |j                  d«      «       | j                  d|«       | j                  d|v«       | j                  d|v«       y )	Nz
stdout:
 "z"
 stderr:
 "Ú"z\.\.\. skipped '(.*?)'rš   ÚOKÚFAILÚERROR)	rý   Ú_DEBUGÚprintÚreÚsearchrÉ   ÚgroupÚassertInÚ
assertTrue)r1   Úorj   ÚmÚbackendÚinjected_methods       €€r   Útest_templatez2TestSpecificBackend._inject.<locals>.test_templateŒ  sˆ   ø€ Ø×4Ñ4°_ÀgÓN‰DˆAˆqØ�{Š{Ýº1ºaÐ@ÔAô —	‘	Ð3°QÓ7ˆAØˆ}Ø—‘˜aŸg™g a›jÔ)Ø�M‰M˜$ Ô"Ø�O‰O˜F¨!˜OÔ,Ø�O‰O˜G¨1Ð,Õ-r   Úlong_running)r5   rÂ   r4   rÏ   r
   )rÐ   rË   rÑ   r  Úbackend_guardÚthemodÚtheclsrÒ   r  Úinjected_testr  s      `      @r   Ú_injectzTestSpecificBackend._inject…  sj   ù€ à—‘ˆÜ$×-Ñ-ˆØ˜Q‘; Ñ$ tÑ+ˆÚ(.²¹ÐAˆö	.ò ,-ªd±GÐ<ˆä��]Ø#”�NÓ#¡M°-Ó$@ÓAõ	Cr   c           	      ó6  — | j                   j                  «       D ]|  \  }}| j                  D ]h  }| j                  j	                  «       D ]I  }|dv r%|dk(  r t
        j                  j                  d«      rŒ,|dv r|dk(  rŒ6| j                  ||||«       ŒK Œj Œ~ y )N)r�   rS   r¤   Úlinux)r›   rS   rÀ   )	r  rÎ   r³   r¾   Úkeysrø   ÚplatformÚ
startswithr  )rÐ   r  r  rË   rÑ   s        r   rÓ   zTestSpecificBackend.generate�  s“   € à&)§l¡l×&8Ñ&8Ö&:Ñ"ˆG�]Ø—_”_�ØŸK™K×,Ñ,Ö.�Dð Ð?Ñ?Ø 5Ò(ÜŸL™L×3Ñ3°GÔ<Ø ð Ð4Ñ4Ø# {Ò2Ø à—K‘K  4¨°-Õ@ñ /ñ %ñ ';r   N)r4   r5   r6   r¶   r  rÔ   r  rÓ   r&   r   r   r  r  z  s8   „ ñð €FàñCó ðCð. ñAó ñAr   r  c                   ób   — e Zd ZdZdej
                  j                  e«      z  Zddeiz  Z	dd„Z
y)ÚThreadLayerTestHelperzP
    Helper class for running an isolated piece of code based on a template
    z%raõ  if 1:
    import sys
    sys.path.insert(0, "%(here)r")
    import multiprocessing
    import numpy as np
    from numba import njit
    import numba
    try:
        import threading_backend_usecases
    except ImportError as e:
        print("DEBUG:", sys.path)
        raise e
    import os

    sigterm_handler = threading_backend_usecases.sigterm_handler
    busy_func = threading_backend_usecases.busy_func

    def the_test():
        %%s

    if __name__ == "__main__":
        the_test()
    ÚhereNc                 óV  — |€,t         j                  j                  «       }t        d«      |d<   t	        j
                  |t        j                  t        j                  |¬«      }t        j                  t        |j                  «      }	 |j                  «        |j                  «       \  }}|j                  dk7  r*t        d|j                  ›d|j                  «       ›d�«      ‚	 |j!                  «        |j                  «       |j                  «       fS # |j!                  «        w xY w)Nr¤   ró   rÚ   r   rÞ   rß   rp   )rô   rõ   rö   r÷   rá   râ   rã   r›   rä   rå   ræ   rq   rç   rè   ré   rê   rë   rì   s          r   rñ   zThreadLayerTestHelper.run_cmdÕ  sæ   € Øˆ;Ü—*‘*—/‘/Ó#ˆCÜ+.¨u«:ˆCÐ'Ñ(Ü× Ñ  Ü(2¯©Ü(2¯©Ø%(ô*ˆô
 —/‘/¤-°·±Ó<ˆð	Ø�M‰MŒOØ×(Ñ(Ó*‰HˆC�Ø×Ñ 1Ò$Ý$à×%Ó% s§z¡z¥|ð5ó6ð 6ð %ð
 �N‰NÔØ�z‰z‹|˜SŸZ™Z›\Ð)Ð)øð �N‰NÕús   Â	AD ÄD(r   )r4   r5   r6   r¶   rô   ÚpathÚdirnameÚ__file__Ú_hereÚtemplaterñ   r&   r   r   r$  r$  µ  s:   „ ñð
 �2—7‘7—?‘? 8Ó,Ñ,€Eðð, �5ˆ/ñ-€Hô0*r   r$  c                   ób   — e Zd ZdZdZee ej                  dd«      dœZ	e
d„ «       Ze
d„ «       Zy)ÚTestThreadingLayerSelectionz@
    Checks that numba.threading_layer() reports correctly.
    Fr×   rØ   c           	      ó^   ‡— ˆfd„}d‰z  }t        | | t        d«       ||«      «      «       y )Nc                 ó
  •— d}| j                   |‰z  z  }t        j                  d|g}t        j                  j                  «       }t        ‰«      |d<   | j                  ||¬«      \  }}| j                  rt        ||«       y y )Nz½if 1:
                X = np.arange(1000000.)
                Y = np.arange(1000000.)
                Z = busy_func(X, Y)
                assert numba.threading_layer() == '%s'
            ú-cró   ©rÝ   )
r+  rø   rù   rô   rõ   rö   r÷   rñ   r  r  )r1   ÚbodyÚrunmerí   rÝ   r+   rð   r  s          €r   r  z:TestThreadingLayerSelection._inject.<locals>.test_templateù  sx   ø€ ðˆDð —M‘M T¨G¡^Ñ4ˆEÜ—~‘~ t¨UÐ3ˆGÜ—*‘*—/‘/Ó#ˆCÜ+.¨w«<ˆCÐ'Ñ(Ø—|‘| G°�|Ó5‰HˆC�Ø�{Š{Ü�c˜3•ð r   z test_threading_layer_selector_%sÚ	important)rÏ   r
   )rÐ   r  r  r  r  s    `   r   r  z#TestThreadingLayerSelection._injectö  s5   ø€ ô	 ð ;¸WÑDˆÜ��]Ø ”�KÓ ¡¨}Ó!=Ó>õ	@r   c                 ól   — | j                   j                  «       D ]  \  }}| j                  ||«       Œ y r   )r  rÎ   r  )rÐ   r  r  s      r   rÓ   z$TestThreadingLayerSelection.generate  s,   € à&)§l¡l×&8Ñ&8Ö&:Ñ"ˆG�]Ø�K‰K˜ Õ/ñ ';r   N)r4   r5   r6   r¶   r  rþ   rÿ   r   r  r  rÔ   r  rÓ   r&   r   r   r-  r-  ë  sU   „ ñð €Fà"Ø"Ø,˜XŸ_™_¨U°BÓ7ñ9€Hð ñ@ó ð@ð( ñ0ó ñ0r   r-  c                   ór   — e Zd Zdefd„Zeed„ «       «       Zeed„ «       «       Zed„ «       Z	ed„ «       Z
d„ Zy)	ÚTestThreadingLayerPriorityÚenv_varc                 óÒ   — t         j                  j                  «       }d|d<   ||d<   d|› d�}t        j                  dt        j                  |«      g}| j                  ||¬«       y)	zJTest setting priority via env var NUMBA_THREADING_LAYER_PRIORITY.
        rŒ   ró   ÚNUMBA_THREADING_LAYER_PRIORITYa²  
                import numba

                # trigger threading layer decision
                # hence catching invalid THREADING_LAYER_PRIORITY
                @numba.jit(
                    'float64[::1](float64[::1], float64[::1])',
                    nopython=True,
                    parallel=True,
                )
                def plus(x, y):
                    return x + y

                captured_envvar = list("a	  ".split())
                assert numba.config.THREADING_LAYER_PRIORITY ==                     captured_envvar, "priority mismatch"
                assert numba.threading_layer() == captured_envvar[0],                    "selected backend mismatch"
                r0  r1  N)rô   rõ   rö   rø   rù   ÚtextwrapÚdedentrñ   )r1   r8  rÝ   ÚcodeÚcmds        r   Úeach_env_varz'TestThreadingLayerPriority.each_env_var  ss   € ô �j‰j�o‰oÓˆØ'0ˆÐ#Ñ$Ø07ˆÐ,Ñ-ð)ð *1¨	ð 2ðˆô( �N‰NØÜ�O‰O˜DÓ!ð
ˆð
 	�‰�S˜cˆÕ"r   c                 ó„   — g d¢}t        j                  |«      D ]$  }dj                  |«      }| j                  |«       Œ& y )NrØ   Ú )Ú	itertoolsÚpermutationsrr   r?  )r1   rŒ   rË   r8  s       r   Útest_valid_env_varz-TestThreadingLayerPriority.test_valid_env_var8  s9   € ò .ˆÜ×'Ñ'¨Ö0ˆAØ—h‘h˜q“kˆGØ×Ñ˜gÕ&ñ 1r   c                 óØ   — d}| j                  t        «      5 }| j                  |«       d d d «       dD ](  }| j                  |› t	        j
                  «      «       Œ* y # 1 sw Y   Œ7xY w)Nztbb omp workqueue notvalidhere)z!THREADING_LAYER_PRIORITY invalid:zIt must be a permutation of)ÚassertRaisesré   r?  r  r÷   Ú	exception)r1   r8  ÚraisesÚmsgs       r   Útest_invalid_env_varz/TestThreadingLayerPriority.test_invalid_env_var@  s^   € ð 3ˆØ×Ñœ~Ô.°&Ø×Ñ˜gÔ&÷ /ó
ˆCð �M‰M˜S˜E¤C¨×(8Ñ(8Ó$9Õ:ñ	
÷ /Ð.ús   ˜A Á A)c                 ó4   — dD ]  }| j                  |«       Œ y )N)zomp tbb workqueuezomp workqueue tbb©r?  ©r1   r8  s     r   Útest_ompz#TestThreadingLayerPriority.test_ompL  ó   € ãAˆGØ×Ñ˜gÕ&ñ Br   c                 ó4   — dD ]  }| j                  |«       Œ y )N)ztbb omp workqueueztbb workqueue omprL  rM  s     r   Útest_tbbz#TestThreadingLayerPriority.test_tbbQ  rO  r   c                 ó4   — dD ]  }| j                  |«       Œ y )N)zworkqueue tbb ompzworkqueue omp tbbrL  rM  s     r   Útest_workqueuez)TestThreadingLayerPriority.test_workqueueV  s   € ÛAˆGØ×Ñ˜gÕ&ñ Br   N)r4   r5   r6   r÷   r?  rÿ   rþ   rD  rJ  rN  rQ  rS  r&   r   r   r7  r7    st   „ ð# Có #ðB Øñ'ó ó ð'ð Øñ;ó ó ð;ð ñ'ó ð'ð ñ'ó ð'ó'r   r7  c                   ól   — e Zd ZdZdZed„ «       Zed„ «       Zd„ Z	 e
j                  ed«      d„ «       Zy)	ÚTestMiscBackendIssueszL
    Checks fixes for the issues with threading backends implementation
    Fc                 ó¤   — d}t         j                  d|g}t        j                  j	                  «       }d|d<   d|d<   | j                  ||¬«       y)	z8
        Tests that OMP does not overflow stack
        a‹  if 1:
            from numba import vectorize, threading_layer
            import numpy as np

            @vectorize(['f4(f4,f4,f4,f4,f4,f4,f4,f4)'], target='parallel')
            def foo(a, b, c, d, e, f, g, h):
                return a+b+c+d+e+f+g+h

            x = np.ones(2**20, np.float32)
            foo(*([x]*8))
            assert threading_layer() == "omp", "omp not found"
        r0  r¤   ró   Ú100KÚOMP_STACKSIZEr1  N©rø   rù   rô   rõ   rö   rñ   ©r1   r3  rí   rÝ   s       r   Útest_omp_stack_overflowz-TestMiscBackendIssues.test_omp_stack_overflowb  sP   € ð
ˆô —>‘> 4¨Ð/ˆÜ�j‰j�o‰oÓˆØ',ˆÐ#Ñ$Ø%ˆˆOÑØ�‰�W #ˆÕ&r   c                 ó¤   — d}t         j                  d|g}t        j                  j	                  «       }d|d<   d|d<   | j                  ||¬«       y)	zq
        Tests that TBB works well with single thread
        https://github.com/numba/numba/issues/3440
        aM  if 1:
            from numba import njit, prange, threading_layer

            @njit(parallel=True)
            def foo(n):
                acc = 0
                for i in prange(n):
                    acc += i
                return acc

            foo(100)
            assert threading_layer() == "tbb", "tbb not found"
        r0  r¥   ró   Ú1r»   r1  NrY  rZ  s       r   Útest_single_thread_tbbz,TestMiscBackendIssues.test_single_thread_tbby  sQ   € ðˆô —>‘> 4¨Ð/ˆÜ�j‰j�o‰oÓˆØ',ˆÐ#Ñ$Ø#&ˆÐÑ Ø�‰�W #ˆÕ&r   c                 ój  — d}t         j                  d|g}t        j                  j	                  «       }d|d<   d|d<   	 | j                  ||¬«      \  }}y
# t        $ rS}| j                  rt        «       t        |«      }| j                  d|«       d	}| j                  ||«       Y d
}~y
d
}~ww xY w)zW
        Tests workqueue raises sigabrt if a nested parallel call is performed
        a¸  if 1:
            from numba import njit, prange
            import numpy as np

            @njit(parallel=True)
            def nested(x):
                for i in prange(len(x)):
                    x[i] += 1


            @njit(parallel=True)
            def main():
                Z = np.zeros((5, 10))
                for i in prange(Z.shape[0]):
                    nested(Z[i])
                return Z

            main()
        r0  rÀ   ró   Ú4r»   r1  zfailed with codezTNumba workqueue threading layer is terminating: Concurrent access has been detected.N)rø   rù   rô   rõ   rö   rñ   ré   r  r  r÷   r  )	r1   r3  rí   rÝ   r+   rð   rj   Úe_msgrA   s	            r   Ú+test_workqueue_aborts_on_nested_parallelismzATestMiscBackendIssues.test_workqueue_aborts_on_nested_parallelism’  s¬   € ðˆô& —>‘> 4¨Ð/ˆÜ�j‰j�o‰oÓˆØ'2ˆÐ#Ñ$Ø#&ˆÐÑ ð	+Ø—|‘| G°�|Ó5‰HˆC‘øÜò 		+Ø�{Š{Ü�c˜3”Ü˜“FˆEØ�M‰MÐ,¨eÔ4ð?ˆHà�M‰M˜( E×*Ñ*ûð		+ús   ¿A Á	B2ÁA	B-Â-B2zTest needs fork(2)c                 ó¤   — d}t         j                  d|g}t        j                  j	                  «       }d|d<   d|d<   | j                  ||¬«       y )NaÛ  if 1:
            from numba import njit, prange, threading_layer
            import numpy as np
            import multiprocessing

            if __name__ == "__main__":
                # Need for force fork context (OSX default is "spawn")
                multiprocessing.set_start_method('fork')

                @njit(parallel=True)
                def func(x):
                    return 10. * x

                arr = np.arange(2.)

                # run in single process to start Numba's thread pool
                np.testing.assert_allclose(func(arr), func.py_func(arr))

                # now run in a multiprocessing pool to get a fork from a
                # non-main thread
                with multiprocessing.Pool(10) as p:
                    result = p.map(func, [arr])
                np.testing.assert_allclose(result,
                                           func.py_func(np.expand_dims(arr, 0)))

                assert threading_layer() == "workqueue"
        r0  rÀ   ró   r`  r»   r1  rY  rZ  s       r   Ú0test_workqueue_handles_fork_from_non_main_threadzFTestMiscBackendIssues.test_workqueue_handles_fork_from_non_main_thread»  sQ   € ðˆô6 —>‘> 4¨Ð/ˆÜ�j‰j�o‰oÓˆØ'2ˆÐ#Ñ$Ø#&ˆÐÑ à�‰�W #ˆÕ&r   N)r4   r5   r6   r¶   r  rÿ   r[  rþ   r^  rb  r   Ú
skipUnlessr°   rd  r&   r   r   rU  rU  [  s^   „ ñð €Fàñ'ó ð'ð, ñ'ó ð'ò0'+ðR €X×Ñ˜Ð(<Ó=ñ&'ó >ñ&'r   rU  c                   óR   — e Zd ZdZdZd„ Zd„ Zd„ Zed„ «       Z	d„ Z
d„ Zed	„ «       Zy
)ÚTestForkSafetyIssueszV
    Checks Numba's behaviour in various situations involving GNU OpenMP and fork
    Fc                 óV   — d}t         j                  d|g}| j                  |«      \  }}y )Nzsif 1:
            from numba.np.ufunc import omppool
            assert omppool.openmp_vendor == 'GNU'
            r0  )rø   rù   rñ   )r1   r3  rí   r+   rð   s        r   Ú!test_check_threading_layer_is_gnuz6TestForkSafetyIssues.test_check_threading_layer_is_gnuî  s-   € ðˆô —>‘> 4¨Ð/ˆØ—<‘< Ó(‰ˆ‰Sr   c                 óØ   — d}| j                   |z  }t        j                  d|g}	 | j                  |«      \  }}y# t        $ r%}| j                  dt        |«      «       Y d}~yd}~ww xY w)z~
        Whilst normally valid, this actually isn't for Numba invariant of OpenMP
        Checks SIGABRT is received.
        züif 1:
            X = np.arange(1000000.)
            Y = np.arange(1000000.)
            Z = busy_func(X, Y)
            pid = os.fork()
            if pid  == 0:
                Z = busy_func(X, Y)
            else:
                os.wait()
        r0  zfailed with code -6N)r+  rø   rù   rñ   ré   r  r÷   )r1   r2  r3  rí   r+   rð   rj   s          r   Ú!test_par_parent_os_fork_par_childz6TestForkSafetyIssues.test_par_parent_os_fork_par_childö  sf   € ð
	ˆð —‘ Ñ$ˆÜ—>‘> 4¨Ð/ˆð	9Ø—|‘| GÓ,‰HˆC‘øÜò 	9Ø�M‰MÐ/´°Q³×8Ñ8ûð	9ús   ¦; »	A)ÁA$Á$A)c                 ó¦   — d}| j                   |z  }t        j                  d|g}| j                  |«      \  }}| j                  rt        ||«       yy)au  
        Implicit use of multiprocessing fork context.
        Does this:
        1. Start with OpenMP
        2. Fork to processes using OpenMP (this is invalid)
        3. Joins fork
        4. Check the exception pushed onto the queue that is a result of
           catching SIGTERM coming from the C++ aborting on illegal fork
           pattern for GNU OpenMP
        aí  if 1:
            mp = multiprocessing.get_context('fork')
            X = np.arange(1000000.)
            Y = np.arange(1000000.)
            q = mp.Queue()

            # Start OpenMP runtime on parent via parallel function
            Z = busy_func(X, Y, q)

            # fork() underneath with no exec, will abort
            proc = mp.Process(target = busy_func, args=(X, Y, q))
            proc.start()

            err = q.get()
            assert "Caught SIGTERM" in str(err)
        r0  N©r+  rø   rù   rñ   r  r  ©r1   r2  r3  rí   r+   rð   s         r   Ú*test_par_parent_implicit_mp_fork_par_childz?TestForkSafetyIssues.test_par_parent_implicit_mp_fork_par_child  sP   € ðˆð  —‘ Ñ$ˆÜ—>‘> 4¨Ð/ˆØ—<‘< Ó(‰ˆˆSØ�;Š;Ü�#�s�Oð r   c                 ó¦   — d}| j                   |z  }t        j                  d|g}| j                  |«      \  }}| j                  rt        ||«       yy)au  
        Explicit use of multiprocessing fork context.
        Does this:
        1. Start with OpenMP
        2. Fork to processes using OpenMP (this is invalid)
        3. Joins fork
        4. Check the exception pushed onto the queue that is a result of
           catching SIGTERM coming from the C++ aborting on illegal fork
           pattern for GNU OpenMP
        a  if 1:
            X = np.arange(1000000.)
            Y = np.arange(1000000.)
            ctx = multiprocessing.get_context('fork')
            q = ctx.Queue()

            # Start OpenMP runtime on parent via parallel function
            Z = busy_func(X, Y, q)

            # fork() underneath with no exec, will abort
            proc = ctx.Process(target = busy_func, args=(X, Y, q))
            proc.start()
            proc.join()

            err = q.get()
            assert "Caught SIGTERM" in str(err)
        r0  Nrm  rn  s         r   Ú*test_par_parent_explicit_mp_fork_par_childz?TestForkSafetyIssues.test_par_parent_explicit_mp_fork_par_child-  sP   € ðˆð" —‘ Ñ$ˆÜ—>‘> 4¨Ð/ˆØ—<‘< Ó(‰ˆˆSØ�;Š;Ü�#�s�Oð r   c                 ó¦   — d}| j                   |z  }t        j                  d|g}| j                  |«      \  }}| j                  rt        ||«       yy)zØ
        Explicit use of multiprocessing spawn, this is safe.
        Does this:
        1. Start with OpenMP
        2. Spawn to processes using OpenMP
        3. Join spawns
        4. Run some more OpenMP
        a¼  if 1:
            X = np.arange(1000000.)
            Y = np.arange(1000000.)
            ctx = multiprocessing.get_context('spawn')
            q = ctx.Queue()

            # Start OpenMP runtime and run on parent via parallel function
            Z = busy_func(X, Y, q)
            procs = []
            for x in range(20): # start a lot to try and get overlap
                ## fork() + exec() to run some OpenMP on children
                proc = ctx.Process(target = busy_func, args=(X, Y, q))
                procs.append(proc)
                sys.stdout.flush()
                sys.stderr.flush()
                proc.start()

            [p.join() for p in procs]

            try:
                q.get(False)
            except multiprocessing.queues.Empty:
                pass
            else:
                raise RuntimeError("Queue was not empty")

            # Run some more OpenMP on parent
            Z = busy_func(X, Y, q)
        r0  Nrm  rn  s         r   Ú-test_par_parent_mp_spawn_par_child_par_parentzBTestForkSafetyIssues.test_par_parent_mp_spawn_par_child_par_parentP  sP   € ðˆð: —‘ Ñ$ˆÜ—>‘> 4¨Ð/ˆØ—<‘< Ó(‰ˆˆSØ�;Š;Ü�#�s�Oð r   c                 ó¦   — d}| j                   |z  }t        j                  d|g}| j                  |«      \  }}| j                  rt        ||«       yy)a  
        Implicit use of multiprocessing (will be fork, but cannot declare that
        in Py2.7 as there's no process launch context).
        Does this:
        1. Start with no OpenMP
        2. Fork to processes using OpenMP
        3. Join forks
        4. Run some OpenMP
        a,  if 1:
            X = np.arange(1000000.)
            Y = np.arange(1000000.)
            q = multiprocessing.Queue()

            # this is ok
            procs = []
            for x in range(10):
                # fork() underneath with but no OpenMP in parent, this is ok
                proc = multiprocessing.Process(target = busy_func,
                                               args=(X, Y, q))
                procs.append(proc)
                proc.start()

            [p.join() for p in procs]

            # and this is still ok as the OpenMP happened in forks
            Z = busy_func(X, Y, q)
            try:
                q.get(False)
            except multiprocessing.queues.Empty:
                pass
            else:
                raise RuntimeError("Queue was not empty")
        r0  Nrm  rn  s         r   Ú=test_serial_parent_implicit_mp_fork_par_child_then_par_parentzRTestForkSafetyIssues.test_serial_parent_implicit_mp_fork_par_child_then_par_parent|  óP   € ðˆð2 —‘ Ñ$ˆÜ—>‘> 4¨Ð/ˆØ—<‘< Ó(‰ˆˆSØ�;Š;Ü�#�s�Oð r   c                 ó¦   — d}| j                   |z  }t        j                  d|g}| j                  |«      \  }}| j                  rt        ||«       yy)zÇ
        Explicit use of multiprocessing 'fork'.
        Does this:
        1. Start with no OpenMP
        2. Fork to processes using OpenMP
        3. Join forks
        4. Run some OpenMP
        a  if 1:
            X = np.arange(1000000.)
            Y = np.arange(1000000.)
            ctx = multiprocessing.get_context('fork')
            q = ctx.Queue()

            # this is ok
            procs = []
            for x in range(10):
                # fork() underneath with but no OpenMP in parent, this is ok
                proc = ctx.Process(target = busy_func, args=(X, Y, q))
                procs.append(proc)
                proc.start()

            [p.join() for p in procs]

            # and this is still ok as the OpenMP happened in forks
            Z = busy_func(X, Y, q)
            try:
                q.get(False)
            except multiprocessing.queues.Empty:
                pass
            else:
                raise RuntimeError("Queue was not empty")
        r0  Nrm  rn  s         r   Ú=test_serial_parent_explicit_mp_fork_par_child_then_par_parentzRTestForkSafetyIssues.test_serial_parent_explicit_mp_fork_par_child_then_par_parent¥  rv  r   N)r4   r5   r6   r¶   r  ri  rk  ro  r   rq  rs  ru  rx  r&   r   r   rg  rg  æ  sS   „ ñð €Fò)ò9ò,ðB ñ ó ð òD*òX'ðR ñ&ó ñ&r   rg  c                   ó0   — e Zd ZdZed„ «       Zed„ «       Zy)ÚTestTBBSpecificIssuesFc                 óÈ   — d}t         j                  d|g}| j                  |«      \  }}d}| j                  ||«       | j                  rt        d|«       t        d|«       y y )Na%  if 1:
            import threading
            import numba
            numba.config.THREADING_LAYER='tbb'
            from numba import njit, prange, objmode
            from numba.core.serialize import PickleCallableByPath
            import os

            e_running = threading.Event()
            e_proceed = threading.Event()

            def indirect_core():
                e_running.set()
                # wait for forker() to have forked
                while not e_proceed.isSet():
                    pass

            indirect = PickleCallableByPath(indirect_core)

            @njit
            def obj_mode_func():
                with objmode():
                    indirect()

            @njit(parallel=True, nogil=True)
            def work():
                acc = 0
                for x in prange(10):
                    acc += x
                obj_mode_func()
                return acc

            def runner():
                work()

            def forker():
                # wait for the jit function to say it's running
                while not e_running.isSet():
                    pass
                # then fork
                os.fork()
                # now fork is done signal the runner to proceed to exit
                e_proceed.set()

            numba_runner = threading.Thread(target=runner,)
            fork_runner =  threading.Thread(target=forker,)

            threads = (numba_runner, fork_runner)
            for t in threads:
                t.start()
            for t in threads:
                t.join()
        r0  z9Attempted to fork from a non-main thread, the TBB libraryúOUT:úERR:)rø   rù   rñ   r  r  r  )r1   r3  rí   r+   rð   Úmsg_heads         r   Útest_fork_from_non_main_threadz4TestTBBSpecificIssues.test_fork_from_non_main_threadÕ  sa   € ð64ˆôl —>‘> 4¨Ð/ˆØ—<‘< Ó(‰ˆˆSàNˆØ�‰�h Ô$à�;Š;Ü�&˜#ÔÜ�&˜#Õð r   c                 ó~  — | j                  «        d}dj                  d|«      }t        j                  d|g}t        j
                  j                  «       }d|d<   | j                  ||¬«      \  }}||v r| j                  d«       n| j                  d	|«       | j                  rt        d
|«       t        d|«       y y )NzSKIP: COMPILATION FAILEDax  if 1:
            import ctypes
            import sys
            import multiprocessing as mp
            from tempfile import TemporaryDirectory, NamedTemporaryFile
            from numba.pycc.platform import Toolchain, external_compiler_works
            from numba import njit, prange, threading_layer
            import faulthandler
            faulthandler.enable()
            if not external_compiler_works():
                raise AssertionError('External compilers are not found.')
            with TemporaryDirectory() as tmpdir:
                with NamedTemporaryFile(dir=tmpdir) as tmpfile:
                    try:
                        src = """
                        #define TBB_PREVIEW_WAITING_FOR_WORKERS 1
                        #include <tbb/tbb.h>
                        static tbb::task_scheduler_handle tsh;
                        extern "C"
                        {
                        void launch(void)
                        {
                            tsh = tbb::task_scheduler_handle::get();
                        }
                        }
                        """
                        cxxfile = f"{tmpfile.name}.cxx"
                        with open(cxxfile, 'wt') as f:
                            f.write(src)
                        tc = Toolchain()
                        object_files = tc.compile_objects([cxxfile,],
                                                           output_dir=tmpdir)
                        dso_name = f"{tmpfile.name}.so"
                        tc.link_shared(dso_name, object_files,
                                       libraries=['tbb',],
                                       export_symbols=['launch'])
                        # Load into the process, it doesn't matter whether the
                        # DSO exists on disk once it's loaded in.
                        DLL = ctypes.CDLL(dso_name)
                    except Exception as e:
                        # Something is broken in compilation, could be one of
                        # many things including, but not limited to: missing tbb
                        # headers, incorrect permissions, compilers that don't
                        # work for the above
                        print(e)
                        print('BROKEN_COMPILERS')
                        sys.exit(0)

                    # Do the test, launch this library and also execute a
                    # function with the TBB threading layer.

                    DLL.launch()

                    @njit(parallel=True)
                    def foo(n):
                        acc = 0
                        for i in prange(n):
                            acc += i
                        return acc

                    foo(1)

            # Check the threading layer used was TBB
            assert threading_layer() == 'tbb'

            # Use mp context for a controlled version of fork, this triggers the
            # reported bug.

            ctx = mp.get_context('fork')
            def nowork():
                pass
            p = ctx.Process(target=nowork)
            p.start()
            p.join(10)
            print("SUCCESS")
            ÚBROKEN_COMPILERSr0  r¥   ró   r1  z3Compilation of DSO failed. Check output for detailsÚSUCCESSr|  r}  )Úskip_if_no_external_compilerÚreplacerø   rù   rô   rõ   rö   rñ   rÉ   r  r  r  )r1   r�  r3  rí   rÝ   r+   rð   s          r   Ú&test_lifetime_of_task_scheduler_handlez<TestTBBSpecificIssues.test_lifetime_of_task_scheduler_handle0  s¼   € ð 	×)Ñ)Ô+ð 6ÐðK÷V ‘Ð*Ð,<Ó=ðW 	ôZ —>‘> 4¨Ð/ˆÜ�j‰j�o‰oÓˆØ',ˆÐ#Ñ$Ø—<‘< ¨S�<Ó1‰ˆˆSà˜sÑ"Ø�M‰MÐOÕPà�M‰M˜) SÔ)à�;Š;Ü�&˜#ÔÜ�&˜#Õð r   N)r4   r5   r6   r  r   r  r…  r&   r   r   rz  rz  Ï  s4   „ ð €FàñXó ðXðt ñ_ó ñ_r   rz  c                   ó,   — e Zd ZdZd„ Zed„ «       Zd„ Zy)ÚTestInitSafetyIssuesFc                 óø  — t        j                  |t         j                  t         j                  ¬«      }t        j                  t
        |j                  «      }	 |j                  «        |j                  «       \  }}|j                  dk7  r*t        d|j                  ›d|j                  «       ›d�«      ‚	 |j                  «        |j                  «       |j                  «       fS # |j                  «        w xY w)N)rÛ   rÜ   r   rÞ   rß   rp   rà   )r1   rí   rî   rï   r+   rð   s         r   rñ   zTestInitSafetyIssues.run_cmd˜  s¿   € Ü× Ñ  Ü(2¯©Ü(2¯©ô:ˆô —/‘/¤-°·±Ó<ˆð	Ø�M‰MŒOØ×(Ñ(Ó*‰HˆC�Ø×Ñ 1Ò$Ý$à×%Ó% s§z¡z¥|ð5ó6ð 6ð %ð
 �N‰NÔØ�z‰z‹|˜SŸZ™Z›\Ð)Ð)øð �N‰NÕús   ÁAC' Ã'C9c                 ó@  — t         j                  j                  t         j                  j                  t        «      d«      }t
        j                  |g}| j                  |«      \  }}| j                  d|«       | j                  rt        d|«       t        d|«       y y )Nzorphaned_semaphore_usecase.pyzleaked semaphorer|  r}  )rô   r'  rr   r(  r)  rø   rù   rñ   ÚassertNotInr  r  )r1   Ú	test_filerí   r+   rð   s        r   Útest_orphaned_semaphorez,TestInitSafetyIssues.test_orphaned_semaphore©  s|   € ô
 —G‘G—L‘L¤§¡§¡´Ó!:Ø!@óBˆ	ä—>‘> 9Ð-ˆØ—<‘< Ó(‰ˆˆSð 	×ÑÐ+¨SÔ1à�;Š;Ü�&˜#ÔÜ�&˜#Õð r   c                 ó8  — dD ]†  }	 t        j                  |«       d}t        j                  d|j                  |«      g}| j                  |«      \  }}| j                  rt        d|«       t        d|«       | j                  ||«       Œˆ y # t        $ r Y Œ•w xY w)N)r‘   r�   r’   zƒimport numba; import multiprocessing;multiprocessing.set_start_method('{}');print(multiprocessing.get_context().get_start_method())r0  r|  r}  )
r‡   rˆ   r²   rø   rù   Úformatrñ   r  r  r  )r1   Úmethr>  rí   r+   rð   s         r   Útest_lazy_lock_initz(TestInitSafetyIssues.test_lazy_lock_initº  s“   € ó 4ˆDðÜ×+Ñ+¨DÔ1ðMˆCô —~‘~ t¨S¯Z©Z¸Ó-=Ð>ˆGØ—|‘| GÓ,‰HˆC�Ø�{Š{Ü�f˜cÔ"Ü�f˜cÔ"Ø�M‰M˜$ Õ$ñ 4øô
 ò Ùðús   ‡BÂ	BÂBN)r4   r5   r6   r  rñ   r   rŒ  r�  r&   r   r   r‡  r‡  “  s'   „ ð €Fò*ð" ñó ðó %r   r‡  c                   ó   — e Zd Zd„ Zy)ÚTestOpenMPVendorsc                 óæ   — t        «       }d|d<   d|d<   d|d<   |j                  «       D ]E  }t        j                  j	                  |«      sŒ#| j                  ||   t        j                  «       ŒG y)z>
        Checks the OpenMP vendor strings are correct
        ÚMSÚwin32ÚIntelr   r   r  N)Údictr   rø   r!  r"  ÚassertEqualr   Úopenmp_vendor)r1   rA   Úks      r   Útest_vendorszTestOpenMPVendors.test_vendorsÔ  sg   € ô “6ˆØ ˆ�ÑØ$ˆ�ÑØ!ˆ�Ñð —‘–ˆAÜ�|‰|×&Ñ& qÕ)Ø× Ñ  ¨!¡¬g×.CÑ.CÕDñ !r   N)r4   r5   r6   r›  r&   r   r   r’  r’  Ð  s   „ óEr   r’  Ú__main__)cr¶   r]   rB  r‡   rô   rS   r  rá   rø   r;  r›   r   Únumpyr   Únumbar   r   r   r   Únumba.tests.supportr   r   r	   r
   r   r   r[   Út_queueÚnumba.testing.mainr   Ú_RUNNER_TIMEOUTÚ
numba.corer   rå   Únumba.np.ufunc.parallelr   Únumba.np.ufuncr   Ú_HAVE_TBB_POOLÚImportErrorr   Ú_HAVE_OMP_POOLÚscipy.linalg.cython_lapackÚscipyÚ_HAVE_LAPACKre  rÿ   rþ   r™  Ú_gnuompÚskip_unless_gnu_ompr!  r"  Ú_windowsÚ_osxÚmaxsizeÚ_32bitr¸   r°   r   r#   r)   r,   Úobjectr.   r8   rG   rN   rQ   rW   rk   r€   ÚThreadÚ_thread_classr‚   r�   r�   r«   r®   r¬   r­   r¯   r”   ÚTHREADING_LAYERÚ_specific_backendsrÂ   rÓ   rÖ   r  r$  r-  r7  rU  rg  rz  r‡  r’  r4   Úmainr&   r   r   Ú<module>r¸     sú  ðñó Û Û Û 	Û Û 	Û Û 
Û Û Û ã ç >Ó >÷G÷ Gó Ý :Ý ð   #Ñ%€ð
åEÙ!Ô#Ý&Ø€NðÝ&Ø€NðÛ%Ø€Lð
 "ˆh×!Ñ! .Ð2NÓO€Ø!ˆh×!Ñ! .Ð2KÓL€à
Ò
;˜W×2Ñ2°eÑ;€Ø)�h×)Ñ)¨'Ð3JÓKÐ à�<‰<×"Ñ" 5Ó)€Ø
‡|�|×Ñ˜xÓ(€Ø	�‰˜Ñ	€ØÐ à�€ò
ñ ó$ò ò
òô ˆvô  ô
2�ô 2ô
�&ô 
ô2�Hô 2ô2�xô 2ô2˜ô 2òòð( × Ñ €ô,�vô ,òñ ˜m¨W¯]©]Ó;€Ù!¡?°7Ó#;Ð<€ÙÙ$¡o°fÓ&=Ð>€NÙ*©O¸LÓ,IÐJÐñ $¡_°YÓ%?Ð@Ð ôUE˜hô UEðp ×+Ñ+Ð/JÐJÐ ð €×ÑÐ'Ð)GÓHô+Ð1ó +ó Ið+ðB × Ñ Ô ô/�vô /ô>5AÐ*Ð,Cô 5Aðp × Ñ Ô ô3*˜Hô 3*ðl ô"0Ð"7ó "0ó ð"0ðJ × $Ñ $Ô &ð ôC'Ð!6ó C'ó ðC'ðL ôF'Ð1ó F'ó ðF'ðT ØôdÐ0ó dó ó ðdðN ØôÐ1ó ó ó ððD ô9%˜8ó 9%ó ð9%ðx ØôE˜ó Eó ó ðEð$ ˆzÒØ€H‡M�M…Oð øðy% ò ØƒNðûð ò ØƒNðûð ò ØƒLðús6   Á%K8 Á;L ÂL Ë8LÌLÌLÌLÌLÌL